제어문

이 노트북은 제이크 반더플라스(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 는 음수

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

파이썬은 다른 언어에서도 많이 사용하는 ifelse를 사용합니다. 특이한 것은 “else if”의 축소판인 elif를 사용합니다. elifelse 블럭은 선택적입니다. 또한 원하는 만큼 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는 현재 루프의 나머지를 건너뛰고 다음 반복을 진행합니다

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

다음은 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 블럭이 있는 루프

파이썬에서 드물게 사용되는 패터는 forwhile 루프에 else 문을 사용하는 것입니다. 앞서 else 블럭에 대해 이야기 했습니다. 이 블럭은 ifelif 문이 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가 동작합니다.

 

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

답글 남기기

아래 항목을 채우거나 오른쪽 아이콘 중 하나를 클릭하여 로그 인 하세요:

WordPress.com 로고

WordPress.com의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

Facebook 사진

Facebook의 계정을 사용하여 댓글을 남깁니다. 로그아웃 /  변경 )

%s에 연결하는 중

This site uses Akismet to reduce spam. Learn how your comment data is processed.