이 노트북은 제이크 반더플라스(Jake VanderPlas)의 A Whirlwind Tour of Python(OReilly Media, 2016)를 기반으로 만들어졌습니다. 이 내용은 CC0 라이센스를 따릅니다. 전체 노트북의 목록은 https://github.com/rickiepark/WhirlwindTourOfPython 에서 볼 수 있습니다.
제어문은 프로그래밍에서 아주 중요합니다. 제어문이 없다면 프로그램은 그저 실행문을 순서대로 실행할 뿐입니다. 제어문 때문에 특정 코드 블럭을 조건에 따라서 또는 반복적으로 실행시킬 수 있습니다. 이 기본적인 구성 요소가 연결되면 놀라울 정도로 복잡한 프로그램을 만들 수 있습니다!
여기에서 조건문("if
", "elif
", "else
")과 반복문("for
"와 "while
" 그리고 부수적으로 "break
", "continue
", "pass
")을 다루겠습니다.
if
-elif
-else
:¶종종 if-then 문이라 불리는 조건문은 불리언 조건에 따라 어떤 코드 블럭을 실행합니다. 기본적인 파이썬의 조건문은 다음과 같습니다:
x = -15
if x == 0:
print(x, "는 0")
elif x > 0:
print(x, "는 양수")
elif x < 0:
print(x, "는 음수")
else:
print(x, "는 내가 본적 없는 어떤 것")
-15 는 음수
특히 콜론(:
)과 공백이 코드 블럭을 정의하는 것을 주목하세요.
파이썬은 다른 언어에서도 많이 사용하는 if
와 else
를 사용합니다. 특이한 것은 "else if"의 축소판인 elif
를 사용합니다.
elif
와 else
블럭은 선택적입니다. 또한 원하는 만큼 elif
를 포함시킬 수 있습니다.
for
루프¶파이썬은 루프를 사용하여 일부 코드를 반복적으로 실행시킬 수 있습니다.
예를 들어, 리스트에 있는 아이템을 하나씩 출력하기 위해 for
루프를 사용할 수 있습니다:
for N in [2, 3, 5, 7]:
print(N, end=' ') # 같은 줄에 출력합니다
2 3 5 7
for
루프는 단순합니다. 사용할 변수와 반복하기 원하는 시퀀스를 지정하고 "in
" 연산자를 사용하여 직관적이고 읽기 좋게 이 둘을 연결합니다.
조금 더 자세히 말하면 "in
" 연산자의 오른쪽에 있는 객체는 어떤 파이썬의 반복자(interator)도 될 수 있습니다.
반복자는 일반화된 시퀀스라고 생각할 수 있습니다. 이에 대해서는 반복자에서 자세히 다루겠습니다.
예를 들면, 파이썬에서 가장 널리 사용하는 반복자 중에 하나는 연속된 숫자를 생성하는 range
객체입니다:
for i in range(10):
print(i, end=' ')
0 1 2 3 4 5 6 7 8 9
범위는 기본적으로 0부터 시작합니다. 관례상 범위의 최댓값은 포함하지 않습니다. Range 객체는 조금 더 복잡한 방식을 지원합니다:
# 5에서 10까지
list(range(5, 10))
[5, 6, 7, 8, 9]
# 2씩 건너 뛰면서 0에서 10까지
list(range(0, 10, 2))
[0, 2, 4, 6, 8]
range
매개변수의 의미는 리스트에서 다룬 슬라이싱과 매우 비슷합니다.
range()
함수가 파이썬 2와 파이썬 3의 다른 점 중 하나입니다. 파이썬 2에서는 range()
가 리스트를 만들지만 파이썬 3에서는 range()
는 반복 객체(iterable object)를 만듭니다.
while
루프¶파이썬의 다른 종류의 루프는 일정 조건이 만족할 때까지 계속 반복하는 while
루프입니다:
i = 0
while i < 10:
print(i, end=' ')
i += 1
0 1 2 3 4 5 6 7 8 9
while
루트의 매개변수는 불리언 표현으로 평가됩니다. 이 표현식이 False
로 평가될 때까지 루프가 실행됩니다.
break
와 continue
: 루프를 세밀하게 조정하기¶루프안에서 실행 과정을 세밀하게 조정하기 위해 사용할 수 있는 유용한 두 개의 문장이 있습니다:
break
는 루프는 완전히 벗어납니다continue
는 현재 루프의 나머지를 건너뛰고 다음 반복을 진행합니다이 두 문장은 for
와 while
루프에 모두 쓸 수 있습니다.
다음은 continue
를 사용하여 홀수를 출력하는 예제입니다.
이 경우 if-else
문장을 사용해서도 동일한 결과를 만들 수 있지만 continue
가 아이디어를 표현하는데 조금 더 편리할 수 있습니다:
for n in range(20):
# n / 2의 나머지가 0이면, 루프의 나머지를 건너 뜁니다
if n % 2 == 0:
continue
print(n, end=' ')
1 3 5 7 9 11 13 15 17 19
다음은 조금 더 쉬운 문제에 사용된 break
의 예시입니다.
이 루프는 특정 값까지의 피보나치(Fibonacci) 수열을 리스트에 채우는 것입니다:
a, b = 0, 1
amax = 100
L = []
while True:
(a, b) = (b, a + b)
if a > amax:
break
L.append(a)
print(L)
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89]
break
문이 없는 while True
루프를 사용하면 영원히 반복될 것입니다!
else
블럭이 있는 루프¶파이썬에서 드물게 사용되는 패터는 for
나 while
루프에 else
문을 사용하는 것입니다.
앞서 else
블럭에 대해 이야기 했습니다. 이 블럭은 if
와 elif
문이 False
로 평가될 때 실행됩니다.
루프에서 else
는 파이썬에 있는 혼돈을 일으킬만한 이름 중 하나입니다. nobreak
라고 생각하는 것이 좋습니다. 즉 else
블럭은 break
문을 거치지 않고 루프가 자연적으로 종료됐을 때에만 실행됩니다.
이 문장이 유용한 한 가지 예로 다음 소수를 찾기 위해 잘 알려진 에라토스테네스의 체(Sieve of Eratosthenes) 알고리즘의 (최적화되지 않은) 구현을 생각해 보겠습니다(에라토스테네스의 체 위키문서 참조):
L = []
nmax = 30
for n in range(2, nmax):
for factor in L:
if n % factor == 0:
break
else: # no break
L.append(n)
print(L)
[2, 3, 5, 7, 11, 13, 17, 19, 23, 29]
else
문은 나눌 수 있는 수가 없는 경우에만 실행됩니다. while
루프에서도 비슷하게 else
가 동작합니다.