9. 흐름 제어

지금까지 우리가 본 파이썬 프로그램은 전부 맨 윗줄부터 차례대로 실행되었습니다. 이러한 실행 흐름을 바꿀 수 있다면 어떨까요? 예를 들어, 프로그램이 현재 시간에 따라 'Good Morning' 혹은 'Good Evening’을 출력 할 수 있다면 좋지 않을까요?

예상하셨겠지만, 흐름 제어문을 이용하면 이러한 프로그램을 만들 수 있습니다. 파이썬에서는 if, for, while이라는 세 가지 흐름 제어문을 사용할 수 있습니다.


9.1 if 문

if 문은 조건을 판별할 때 사용됩니다. if(만약) 조건이 참이라면, 'if 블록'의 명령문을, else (아니면) 'else 블록'의 명령문을 실행합니다. 이때 else 조건절은 생략할 수 있습니다.

https://github.com/swaroopch/byte-of-python/blob/master/programs/if.py

number = 23
guess = int(raw_input('Enter an integer : '))

if guess == number:
    # New block starts here
    print 'Congratulations, you guessed it.'
    print '(but you do not win any prizes!)'
    # New block ends here
elif guess < number:
    # Another block
    print 'No, it is a little higher than that'
    # You can do whatever you want in a block ...
else:
    print 'No, it is a little lower than that'
    # you must have guessed > number to reach here

print 'Done'
# This last statement is always executed,
# after the if statement is executed.
if.py(이 코드를 if.py 파일로 저장하세요)

다음은 이 코드의 실행 결과입니다.

$ python if.py
Enter an integer : 50
No, it is a little lower than that
Done

$ python if.py
Enter an integer : 22
No, it is a little higher than that
Done

$ python if.py
Enter an integer : 23
Congratulations, you guessed it.
(but you do not win any prizes!)
Done


이 프로그램은 사용자로부터 숫자를 입력받고, 그 숫자가 프로그램에 지정된 숫자와 같은지 확인합니다. 먼저 number 변수에 원하는 숫자를 넣습니다. 여기서는 23을 넣었습니다. 그리고, raw_input() 함수를 통해 사용자로부터 숫자를 입력을 받습니다. 여기서 함수란 재사용 가능한 프로그램 조각을 의미합니다. 다음 장에서 함수에 대해 자세히 배울 것입니다.

파이썬에 내장된 raw_input 함수에 문자열을 넣으면 화면에 이 문자열이 출력되고 사용자의 입력을 기다립니다. 이제 사용자가 무엇인가를 입력하고 키를 누르면, raw_input() 함수는 사용자가 입력한 것을 문자열 형태로 반환해 줍니다. 이제 int를 이용하여 이것을 정수형으로 변환한 뒤, 그 값을 변수 guess에 대입합니다.

사실 여기에서 사용된 int는 클래스인데, 일단 여기서는 int가 문자열을 숫자형으로 변환해 준다는 점만 기억하시기 바랍니다 (다만, 이때 사용된 문자열은 올바른 숫자를 포함하고 있어야 합니다).

다음으로, 사용자가 입력한 숫자와 우리가 고른 숫자를 비교합니다. 만약 두 숫자가 같으면, 성공했다는 메시지를 화면에 출력합니다. 이때 들여쓰기를 이용하여 어디부터 어디까지가 이 블록에 해당하는지를 표시했다는 것을 확인하세요. 이러한 이유로 파이썬에서는 들여쓰기가 굉장히 중요합니다. 앞서 말씀드렸듯이 여러분이 "일관성 있게 들여쓰는" 습관에 익숙해져 있었으면 좋겠네요. 이미 그렇게 하고 계시지요?

또한 if 문의 뒷부분에 콜론(:)이 붙어 있는 것을 확인하세요. 콜론은 그 다음 줄부터 새로운 블록이 시작된다는 것을 의미합니다.

이제, 사용자가 입력한 숫자가 우리가 고른 숫자에 비해 작다면, 사용자에게 좀 더 큰 숫자를 입력하라고 알려 줍니다. 여기에 사용된 것은 elif 절인데, 두 개의 if 문을 중첩해서 사용해야 할 경우 (즉 if else를 쓰고 else 밑에 또 다시 if else를 써야 할 경우) 이것을 if-elif-else로 한번에 줄여서 쓸 수 있게 해 주는 것입니다. 즉 elif는 프로그래밍을 좀 더 쉽게 도와주고, 더 많은 들여쓰기를 해야 하는 수고도 줄여 줍니다.

elif 와 else 문을 사용할 경우, 논리적 명령행의 마지막에는 항상 콜론이 붙어 있어야 합니다. 그 다음 줄에는 다른 들여쓰기 단계로 시작되는 새로운 명령문 블록이 시작되어야 합니다.

또한 if 문의 if-block 안에 또다른 if문을 넣고 또 넣고 하는 식으로 작성할 수도 있습니다. 이를 중첩된 if 문이라 부릅니다.

elif 와 else 절은 생략이 가능합니다. 최소한의 올바른 if 문 사용법은 다음과 같습니다.

if True:
    print 'Yes, it is true'


if - elif - else 문의 실행이 끝나면, 파이썬은 if 문을 담고 있는 블록의 다음 줄부터 실행을 재개합니다. 이 예제의 경우 그 블록은 최상위 블록(프로그램이 실행된 시점의 블록)이 되며, 그 다음에 실행될 명령문은 print 'Done'입니다. 그 이후는 프로그램 실행이 종료되게 됩니다.


지금 여러분이 본 것은 굉장히 간단한 프로그램이지만, 이를 통해서도 충분히 많은 것을 이야기했습니다. 하지만 이 모든 내용은 상당히 직관적입니다 (만약 여러분이 C/C++ 경험이 있다면 훨씬 더 쉽다고 느껴지질 것입니다). 지금 당장은 이 모든 내용을 익혀야 하겠지만, 몇번 연습을 하고 나면 아마 좀 더 편하게 받아들여질 것이며 곧 '자연스럽게' 여기게 될 것입니다.


NOTE

C/C++ 프로그래머를 위한 주석파이썬에는 switch 문이 없습니다. 대신 if..elif..else 문을 이용하여야 합니다. (몇몇 상황에서는 사전을 이용하는 것이 편리합니다)



9.2 while 문

while 문은 특정 조건이 참일 경우 계속해서 블록의 명령문을 반복하여 실행합니다. while 문은 '반복문'의 한 예입니다. 또한 while 문에는 else 절이 따라올 수 있습니다.


https://github.com/swaroopch/byte-of-python/blob/master/programs/while.py

number = 23
running = True

while running:
    guess = int(raw_input('Enter an integer : '))

    if guess == number:
        print 'Congratulations, you guessed it.'
        # this causes the while loop to stop
        running = False
    elif guess < number:
        print 'No, it is a little higher than that.'
    else:
        print 'No, it is a little lower than that.'
else:
    print 'The while loop is over.'
    # Do anything else you want to do here

print 'Done'
while.py(이 코드를 while.py로 저장하세요)

실행 결과는 다음과 같습니다.

$ python while.py
Enter an integer : 50
No, it is a little lower than that.
Enter an integer : 22
No, it is a little higher than that.
Enter an integer : 23
Congratulations, you guessed it.
The while loop is over.
Done


이 프로그램 또한 숫자 알아맞히기 게임입니다. 이전 예제보다 더 나은 점은 사용자가 답을 맞출 때까지 숫자를 계속 입력할 수 있다는 것입니다. 즉, 이전 섹션에서 작성한 프로그램처럼 다른 숫자를 입력해 보기 위해 프로그램을 또 실행할 필요가 없습니다. 이 예제는 `while`문의 사용법을 잘 보여줍니다.

먼저 while 루프가 실행되기 전 변수 runningTrue로 설정되어 있으므로 while 문에 딸려 있는 while 블록이 실행되며 raw_input과 if 문이 실행됩니다. 이 블록의 실행이 끝나면 while 문은 변수 running의 값을 다시 한번 확인합니다. 이 값이 참인 경우 while 블록을 다시 한번 실행하며, 거짓인 경우 else 블록을 실행한 뒤 루프를 빠져나와 다음 명령문이 실행됩니다.

else 블록은 while 루프 조건이 False인 경우 실행됩니다. 물론 루프 조건을 처음으로 확인했을 경우에도 이 블록이 실행될 수 있습니다. while 루프에 else 절이 딸려있는 경우, break 명령으로 루프를 강제로 빠져나오지 않는 이상 이 블록은 항상 실행됩니다.

여기서 True와 False라는 값들은 불리언 형식이라고 불리우며, 각각은 숫자 1과 0으로 간주됩니다.


NOTE

C/C++ 프로그래머를 위한 주석while 루프에 else 절이 사용될 수 있음을 기억하세요.



9.3 for 루프

for..in 문은 객체의 열거형Sequence을 따라서 반복하여 실행할 때 사용되는 파이썬에 내장된 또 하나의 반복문으로, 열거형에 포함된 각 항목을 하나씩 거쳐가며 실행합니다. 열거형에 대해서는 이후에 좀 더 자세히 다룰 것입니다. 일단 여기서는, 열거형이란 여러 항목이 나열된 어떤 목록을 의미한다고 이해하기 바랍니다.


https://github.com/swaroopch/byte-of-python/blob/master/programs/for.py

for i in range(1, 5):
    print i
else:
    print 'The for loop is over'
for.py(이 코드를 for.py로 저장하세요)

실행 결과는 다음과 같습니다.

$ python for.py
1
2
3
4
The for loop is over


이 프로그램은 화면상에 숫자를 나열합니다. 파이썬에 내장된 range 함수를 통해 이러한 숫자의 나열을 생성합니다.

여기서는 range 함수에 두 개의 숫자를 넣어 주었습니다. 그러면 이 함수는 첫 번째 숫자 이상, 그리고 두 번째 숫자 미만까지의 숫자 리스트를 반환합니다 (이 리스트는 12. 자료 구조 장에서 자세히 살펴봅니다). 예를 들어, range(1,5) 는 리스트 [1, 2, 3, 4]를 반환합니다. 기본적으로, range는 1씩 증가하는 숫자의 리스트를 반환합니다. 그러나 range에 세 번째 숫자를 입력하면, 이 세 번째 숫자만큼씩 증가하는 숫자 리스트를 얻을 수 있습니다. 예를 들어, range(1,5,2)는 [1,3]을 반환합니다. 반환되는 리스트는 두번째 숫자 미만까지 반환되며, 이하까지 반환하지 않음을 꼭 기억하세요.

range 함수는 호출될 때 해당 범위 내의 모든 숫자를 한번에 생성하여 반환하기 때문에, 매우 큰 숫자 범위를 지정하면 시간이 오래 걸릴 수 있습니다. 따라서 매우 큰 범위의 숫자를 다룰 때는 한번에 하나씩 숫자를 생성하는 게 좋습니다. 이 경우 for 문에 xrange()를 대신 사용할 수 있습니다.

위 예제의 for 루프는 range 함수에서 반환된 리스트를 따라 반복하여 실행됩니다. 즉, for i in range(1, 5) 는 for i in [1, 2, 3, 4]와 같습니다. 이것은 리스트에 들어 있는 각각의 숫자 (각 숫자는 곧 객체이기도 합니다)를 한번에 하나씩  i 에 대입하고, 이렇게 대입된 각 i 값을 이용하여 for에 딸린 블록을 실행합니다. 이 경우, for 블록에서 하는 일은 단순히 i 값을 화면에 출력해 주는 것입니다.

또한  else 절을 포함시킬 수도 있습니다. 이것이 포함되면, break 문으로 루프를 강제로 빠져나오지 않는 한 루프를 다 돌고 난 뒤에는 이 절이 항상 실행됩니다.

for..in 루프는 어떤 종류의 열거형 자료형과도 함께 사용될 수 있습니다. 여기서는 range라는 내장 함수를 통해 숫자 리스트를 생성했는데, 일반적으로는 아무 종류의 객체를 담고 있는 아무 열거형이나 사용이 가능합니다! 추후에 이에 대해 좀 더 자세히 다뤄 보겠습니다.


NOTE

C/C++/Java/C# 프로그래머를 위한 파이썬의 for 루프는 C/C++에서 제공하는 for 루프와는 근본적으로 다릅니다. 파이썬의 for는 차라리 C#의 foreach 루프와 비슷하며, Java 1.5의 for (int i : IntArray)와 비슷합니다.

C/C처럼 for (int i = 0; i < 5; i)와 같이 사용하고 싶은 경우, 파이썬에서는 단순히 for i in range(0, 5)라고 입력하면 됩니다. 보다시피, 파이썬의 for 루프는 더 단순하며, 더 보기 좋고 오류가 발생하기도 어렵습니다.



9.4 break 문

break 문은 루프 문을 강제로 빠져나올 때, 즉 아직 루프 조건이 False가 되지 않았거나 열거형의 끝까지 루프가 도달하지 않았을 경우 루프 문 실행을 강제로 정지시키고 싶을 때 사용됩니다.

중요한 점은 만약 여러분이 break 문을 써서 for 루프나 while 루프를 빠져나왔을 경우, 루프에 딸린 else 블록은 실행되지 않는다는 점입니다.


https://github.com/swaroopch/byte-of-python/blob/master/programs/break.py

while True:
    s = raw_input('Enter something : ')
    if s == 'quit':
        break
    print 'Length of the string is', len(s)
print 'Done'
break.py(이 코드를 break.py로 저장하세요)

실행 결과는 다음과 같습니다.

$ python break.py
Enter something : Programming is fun
Length of the string is 18
Enter something : When the work is done
Length of the string is 21
Enter something : if you wanna make your work also fun:
Length of the string is 37
Enter something : use Python!
Length of the string is 11
Enter something : quit
Done


이 프로그램에서는 사용자의 입력을 반복해서 받고, 입력받은 문자열의 길이를 출력합니다. 만약 사용자가 입력한 문자열이 quit 일 경우, break 문으로 루프를 빠져나와 프로그램을 정지하는 특별한 조건을 넣어 주었습니다.

입력받은 문자열의 길이는 내장함수 len을 이용하여 계산할 수 있습니다. break 문은 for 루프 내에서도 이용될 수 있음을 기억하세요.


Swaroop의 파이썬 시

예제에서 입력한 것은 이 책의 저자가 작성한 작은 시입니다.

Programming is fun
When the work is done
if you wanna make your work also fun:
    use Python!




9.5 continue 문

continue 문은 현재 실행중인 루프 블록의 나머지 명령문을 실행하지 않고 곧바로 다음 루프로 넘어가도록 합니다.


https://github.com/swaroopch/byte-of-python/blob/master/programs/continue.py

while True:
    s = raw_input('Enter something : ')
    if s == 'quit':
        break
    if len(s) < 3:
        print 'Too small'
        continue
    print 'Input is of sufficient length'
    # Do other kinds of processing here...
continue.py(이 코드를 continue.py로 저장하세요)

실행 결과는 다음과 같습니다.

$ python continue.py
Enter something : a
Too small
Enter something : 12
Too small
Enter something : abc
Input is of sufficient length
Enter something : quit


이 프로그램에서는 사용자로부터 입력을 받습니다만, 입력받은 문자열의 길이가 적어도 3 이상인 경우에만 문자열을 처리합니다. 즉, 내장함수 len을 통해 입력받은 문자열의 길이를 알아낸 후 그 길이가 3보다 작으면, continue 문을 이용하여 그 이하의 명령문을 실행하지 않고 다음 루프로 넘어가도록 합니다. 입력받은 문자열의 길이가 3 이상일 경우에만 그 이하의 명령문이 실행되고, 지정된 작업이 실행됩니다.

continue 문은 for 루프 내에서도 이용될 수 있음을 기억하세요.


9.6 요약

이 장에서는 ifwhilefor 세 종류의 흐름 제어문에 대해 배워 보았습니다. 그와 같이 이용할 수 있는 break 과 continue 문에 대해서도 배웠습니다. 이 명령문은 파이썬에서 가장 많이 사용되는 명령문이므로 이들에 친숙해지는 것은 필수입니다.

다음 장에서는 함수를 만들고 사용하는 방법을 배워보겠습니다.