이 노트북은 제이크 반더플라스(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 문이라 불리는 조건문은 불리언 조건에 따라 어떤 코드 블럭을 실행합니다. 기본적인 파이썬의 조건문은 다음과 같습니다:

특히 콜론(:)과 공백이 코드 블럭을 정의하는 것을 주목하세요.

파이썬은 다른 언어에서도 많이 사용하는 ifelse를 사용합니다. 특이한 것은 "else if"의 축소판인 elif를 사용합니다. elifelse 블럭은 선택적입니다. 또한 원하는 만큼 elif를 포함시킬 수 있습니다.

for 루프

파이썬은 루프를 사용하여 일부 코드를 반복적으로 실행시킬 수 있습니다. 예를 들어, 리스트에 있는 아이템을 하나씩 출력하기 위해 for 루프를 사용할 수 있습니다:

for 루프는 단순합니다. 사용할 변수와 반복하기 원하는 시퀀스를 지정하고 "in" 연산자를 사용하여 직관적이고 읽기 좋게 이 둘을 연결합니다. 조금 더 자세히 말하면 "in" 연산자의 오른쪽에 있는 객체는 어떤 파이썬의 반복자(interator)도 될 수 있습니다. 반복자는 일반화된 시퀀스라고 생각할 수 있습니다. 이에 대해서는 반복자에서 자세히 다루겠습니다.

예를 들면, 파이썬에서 가장 널리 사용하는 반복자 중에 하나는 연속된 숫자를 생성하는 range 객체입니다:

범위는 기본적으로 0부터 시작합니다. 관례상 범위의 최댓값은 포함하지 않습니다. Range 객체는 조금 더 복잡한 방식을 지원합니다:

range 매개변수의 의미는 리스트에서 다룬 슬라이싱과 매우 비슷합니다.

range() 함수가 파이썬 2와 파이썬 3의 다른 점 중 하나입니다. 파이썬 2에서는 range()가 리스트를 만들지만 파이썬 3에서는 range()는 반복 객체(iterable object)를 만듭니다.

while 루프

파이썬의 다른 종류의 루프는 일정 조건이 만족할 때까지 계속 반복하는 while 루프입니다:

while 루트의 매개변수는 불리언 표현으로 평가됩니다. 이 표현식이 False로 평가될 때까지 루프가 실행됩니다.

breakcontinue: 루프를 세밀하게 조정하기

루프안에서 실행 과정을 세밀하게 조정하기 위해 사용할 수 있는 유용한 두 개의 문장이 있습니다:

이 두 문장은 forwhile 루프에 모두 쓸 수 있습니다.

다음은 continue를 사용하여 홀수를 출력하는 예제입니다. 이 경우 if-else 문장을 사용해서도 동일한 결과를 만들 수 있지만 continue가 아이디어를 표현하는데 조금 더 편리할 수 있습니다:

다음은 조금 더 쉬운 문제에 사용된 break의 예시입니다. 이 루프는 특정 값까지의 피보나치(Fibonacci) 수열을 리스트에 채우는 것입니다:

break 문이 없는 while True 루프를 사용하면 영원히 반복될 것입니다!

else 블럭이 있는 루프

파이썬에서 드물게 사용되는 패터는 forwhile 루프에 else 문을 사용하는 것입니다. 앞서 else 블럭에 대해 이야기 했습니다. 이 블럭은 ifelif 문이 False로 평가될 때 실행됩니다. 루프에서 else는 파이썬에 있는 혼돈을 일으킬만한 이름 중 하나입니다. nobreak라고 생각하는 것이 좋습니다. 즉 else 블럭은 break 문을 거치지 않고 루프가 자연적으로 종료됐을 때에만 실행됩니다.

이 문장이 유용한 한 가지 예로 다음 소수를 찾기 위해 잘 알려진 에라토스테네스의 체(Sieve of Eratosthenes) 알고리즘의 (최적화되지 않은) 구현을 생각해 보겠습니다(에라토스테네스의 체 위키문서 참조):

else 문은 나눌 수 있는 수가 없는 경우에만 실행됩니다. while 루프에서도 비슷하게 else가 동작합니다.

< 기본 데이터 구조 | 목차 | 함수 >