Skip to content

Latest commit

 

History

History
266 lines (191 loc) · 13.8 KB

File metadata and controls

266 lines (191 loc) · 13.8 KB

{#control_flow}

흐름 제어

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

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

if

if 문은 조건을 판별할 때 사용됩니다. if (만약) 조건이 참이라면, _if 블록_의 명령문을 실행하며 else (아니면) _else 블록_의 명령문을 실행합니다. 이 때 else 조건절은 생략이 가능합니다.

예제 (if.py 로 저장하세요):

[source,python]

include::programs/if.py[]

실행 결과:

include::programs/if.txt[]

동작 원리

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

파이썬에 내장된 raw_input 함수에 문자열을 넣어 주면 화면에 이 문자열이 출력되며, 또 사용자의 입력을 기다리게 됩니다. 이제 사용자가 무엇인가를 입력하고 kbd:[enter] 키를 누르면, raw_input() 함수는 사용자가 입력한 것을 문자열의 형태로 반환해 줍니다. 이제 int 를 이용하여 이것을 정수형으로 변환한 뒤, 그 값을 변수 guess에 대입합니다. 사실 여기에서 사용된 int는 클래스라고 불리우는 것입니다만, 일단 여기서는 이것이 문자열을 숫자형으로 변환해 준다는 것만 기억하셔도 됩니다 (다만 이 때 사용된 문자열은 올바른 숫자를 포함하고 있어야 합니다).

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

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

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

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

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

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

[source,python]

if True:
    print 'Yes, it is true'

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

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

C/C++ 프로그래머를 위한 주석

[NOTE] 파이썬에는 switch 문이 없습니다. 대신 if..elif..else 문을 이용하여야 합니다. (몇몇 상황에서는 사전을 이용하는 것이 편리합니다)

while 문

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

예제 (while.py로 저장하세요):

[source,python]

include::programs/while.py[]

실행 결과:

include::programs/while.txt[]

동작 원리

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

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

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

여기서 TrueFalse 라는 값들은 불리언 형식이라고 불리우며, 각각은 숫자 10 로 간주됩니다.

C/C++ 프로그래머를 위한 주석

[NOTE] while 루프에 else 절이 사용될 수 있음을 기억하세요.

for 루프

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

예제 (for.py로 저장하세요):

[source,python]

include::programs/for.py[]

실행 결과:

include::programs/for.txt[]

동작 원리

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

여기서는 range 함수에 두 개의 숫자를 넣어 주었으며, 그러면 이 함수는 첫 번째 숫자 이상, 그리고 두 번째 숫자 미만까지의 숫자 목록(리스트)을 반환합니다 (리스트는 자료 구조 챕터에서 좀 더 자세히 설명할 것입니다). 예를 들어, 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 라는 내장 함수를 통해 숫자 리스트를 생성하여 사용하였습니다만, 일반적으로는 아무 종류의 객체를 담고 있는 아무 열거형이나 사용이 가능합니다! 추후에 이에 대해 좀 더 자세히 다뤄 보겠습니다.

C/C++/Java/C# 프로그래머를 위한 주석

[NOTE]

파이썬의 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 루프는 더 단순하며, 더 보기 좋고 오류가 발생하기도 어렵습니다.

{#the_break_statement}

break 문

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

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

예제 (break.py로 저장하세요):

[source,python]

include::programs/break.py[]

실행 결과:

include::programs/break.txt[]

동작 원리

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

입력받은 문자열의 길이는 내장함수 len 을 이용하여 계산할 수 있습니다.

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

Swaroop의 파이썬 시


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

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


{#the_continue_statement}

continue

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

예제 (continue.py 로 저장하세요):

[source,python]

include::programs/continue.py[]

실행 결과:

include::programs/continue.txt[]

동작 원리

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

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

요약

이 챕터에서는 if, while, for 세 종류의 흐름 제어문에 대해 배워 보았습니다. 또한 그와 같이 이용할 수 있는 breakcontinue문에 대해서도 배웠습니다. 이 명령문들은 파이썬에서 가장 많이 사용되는 명령문들에 속해 있으며, 따라서 이 명령문들에 친숙해지는 것은 필수입니다.

다음으로, 함수를 만들고 사용하는 방법에 대해 배워 보겠습니다.