파이썬 문법을 제대로 안 배우고, 그냥 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 |