본문 바로가기

Programming/파이썬 빠르게 배우기

for 구문이 좀 이상한데?

반응형

파이썬 문법을 제대로 안 배우고, 그냥 C나 Java에서 했던 코딩 실력으로 대충 파이썬을 해보려는 분들이, 가장 처음 막히는 부분이 for 구문일 거라 생각합니다.

 

C나 Java하고 목적은 같은데, 사용 방법이 꽤 다릅니다.

 

예제로 확인해보겠습니다.

 

1에서 100까지 더하는, for를 사용하는 전형적인 예제입니다.

파이썬으로는,

 

sum=0
for i in range(101):
	sum += i
print(sum)

 

C나 Java에서는 이런 형태일 겁니다.

sum = 0 
for i=0 to 101{
	sum += i
}
print(sum)

 

파이썬에서는 `for ~ in 튜플/리스트` 구문입니다. 

 

`in`을 사용하는 것이 처음에는 좀 어색하고 C/Java 방식이 더 편리한 것처럼 느낄 수 있으나, 조금만 더 사용하다 보면 파이썬의 방법이 훨씬 편하고 다양하게 쓰일 수 있다는 걸 알 수 있을 겁니다. 
특히 리스트나 딕셔너리 데이터형을 다룰 때에 그 진가가 발휘됩니다. 

 

튜플과 리스트는 파이썬에 있는 전형적인 데이터 구조로, 튜플은 배열과 비슷하고, 리스트는 Java의 List나 Vector와 비슷합니다.


range(end)는 [0, end)까지의 값을 1씩 증가하면서 리턴하는 함수입니다.

range(s, e, step) : [s, e) 사이의 값을 step씩 증가시키면서 리턴 = {s, s+step, s+2*step, ...}
range(s, e): [s, e) 사이의 값을 1씩 증가시키면서 리턴 = {s, s+1, s+2, ...}
range(e): [0,e) 사이의 값을 1씩 증가시키면서 리턴 = {0, 1, 2, ..., e-1}

 

y = [0,100]   -->  0 <= y <=100
y = [0, 100)  --> 0 <= y < 100
y = (0, 100]  --> 0 < y <= 100
y = (0, 100)  --> 0 < y < 100

 

따라서,  0에서 100까지의 수를 리턴하는 range 표현은, 아래 3가지 표현 모두 해당됩니다.

range(0, 101, 1)
range(0, 101)
range(101)

 

그래서, 0에서 100까지 더하는 for 구문은,

for i in range(101):
	sum += i

 

 


{0, -2, -4,... , -100}의 합을 구하려면?

 

for i in range(0, -101, -2):
	sum += i

 


 

(1.0 + 1.2 + 1.4 +... + 5.0)을 구하려면?

 

이건 range로 안됩니다. 

 

range 함수의 경우는 정수 크기만큼의 step만 가능하기 때문. 

이처럼 정수가 아닌 경우는 numpy의 arange 함수를 사용하면 됩니다.  (arrange가 아니고 arange임에 주의 )

 

    import numpy as np
    
    sum = 0
    for i in np.arange(1.0, 5.1, 0.2):
        sum += i

 

numpy는 파이썬을 사용하면서 사용하지 않을 수 없는 유명한 패키지입니다. 수학 연산, 특히 배열/벡터 연산을 위해서는 꼭 사용하게 되는 패키지.  파이썬 기본 패키지는 아니기에 안 깔려 있다면 `pip install numpy` 명령을 cmd 창에서 해서, 설치하면 됩니다. 

 


["한국", "일본", "중국"]과 같은 리스트형 데이터가 있을 때, 이 리스트에 있는 데이터들을 for 구문에서 사용하는 것은, 

 

data = ["한국", "일본", "중국"]

for d in data:
	print(d)

 


{"한국": 10, "일본": 5, "중국": 3}과 같은 딕셔너리 데이터에 대해 for 구문 사용하는 것은, 

 

dict = {"한국": 10, "일본": 5, "중국": 3}
for country, num in dict.items():
    print(country, "=", num)

 

위와 같은 것을 Java/C에서 구현한다고 생각해 보세요. 꽤 코드가 길어집니다. 
파이썬의 for~in 구문이 딕셔너리나 리스트 같은 데이터형 자료에 쓰일 때, 그 간단한 표현이 위력을 발휘합니다.

 


데이터가 아래와 같을 때, 이 두 데이터를 결합해서 for 루프 처리는 어떻게 할까요?

 

    countries = ["한국", "일본", "중국"]
    counts = [10, 5, 3]

 

이렇게,

 

    countries = ["한국", "일본", "중국"]
    counts = [10, 5, 3]
    for country, cnt in zip(countries, counts):
        print(country, "=", cnt)

 

실행 결과는,

 

한국 = 10
일본 = 5
중국 = 3

좀 낯설지만, 굉장히 유용하게 사용될 수 있는 파이썬만의 기능입니다. 

 

zip 이란 함수가, 두 리스트형 데이터의 인덱스를 하나 씩 증가시키면서 원소를 리턴해줍니다. 

 


 

파이썬의 for 구문 중 가장 낯설 수 있는 사용법이 지금 설명할 `리스트 내포형 for`일 겁니다.

 

아래 코드가 이해되나요? ^^

    countries = ["한국", "일본", "중국"]
    counts = [10, 5, 3]

    country_count = [country + "=" + str(count)
        for country, count in zip(countries, counts)]

    print(*(country_count), sep='\n')

 

[ ... for ~ in ] 형태입니다.

 

꺽쇠는 리스트형 데이터를 얘기하는 것이니, 꺽쇠 안의 `for ~ in` 구문에 의해서 만들어지는 데이터로 리스트가 만들어 지는 겁니다. 

 

 

좀 쉬운 예로, data =  [0, 1, 2, ..., 100] 를 만들려면,

 

data = [i for i in range(101)]

 

따라서, 위 쪽 예제에서의 아래 코드는,

country_count = [country + "=" + str(count)
        for country, count in zip(countries, counts)]

["한국=10", "일본=5", "중국=3"]이라는 리스트를 만들어 줍니다.

 

 

이것을 print 하는 구문도 쫌 낯설 텐데,

print(*(country_count), sep='\n')

print 함수는 파라미터로 튜플형 데이터를 받습니다. 그런데 country_count가 리스트 타입 데이터이니 그걸 `*`를 붙여서 튜플로 타입 변환을 해준 겁니다.  애스트리크(*) 대신에 tuple(country_count)라고 해도 됩니다.

 


마지막으로 `리스트 내포형 for`에서 if 구문까지 포함한 것 까지 알면, 파이썬에서의 for 구문은 다 안다고 해도 되겠습니다.  

 

[1, 2,, 4, 5, 7, 8, 10, ..., 95, 97, 98, 100] 

 

이런 데이터를 만들려면 어떻게 하면 될까요? 0~100까지 수 중에서 3의 배수를 제외한 수들.

 

이렇게 하면 됩니다.

 

data = [i for i in range(101) if i % 3 != 0]

 

간단하죠? 

 

[for ~ in ~ if]  구문입니다. 

 

if 이하 구문을 만족하는 원소들만 리스트로 만들어지는 것입니다.

 

 

그럼, 위 쪽 예제에서 `일본`을 제외한 리스트를 만들어 보면,

 

country_count = [country + "=" + str(count)
        for country, count in zip(countries, counts) if country != "일본"]

 

네...

 

이제 끝입니다. ^^

반응형

'Programming > 파이썬 빠르게 배우기' 카테고리의 다른 글

블록기호 없음. 들여쓰기가 중요  (0) 2020.05.11
if~else 있고, switch 없다.  (0) 2020.05.10
변수 선언 없다.  (0) 2020.05.10
main이 어디 있나?  (0) 2020.05.10
이 글목록에 대해  (0) 2020.05.10