지난번 포스팅에서는 파이썬 프로그램 흐름 제어의 2가지 큰 뼈대 중에서
(1) 조건이 참(True), 거짓(False)인지에 따라 프로그램 흐름을 나누어 주는 분기문 (Branch statements) 로서
- if statements
- if, else statements
- if, elif, else statements
- nested if statements
에 대해서 알아보았습니다.
이번 포스팅에서는 파이썬 프로그램 흐름 제어의 두번째 주제로서
(2) 조건이 참이거나 순서열의 끝까지 반복, 중단하게 해주는 반복문(Loop statements) 으로서
- while: 조건이 참인 동안 반복 (loop while the condition is True)
- for: 순서열의 처음부터 끝까지 반복 (loop until the end of the sequence)
- continue: 조건이 참이면 반복문 계속 (continue loop if the condition is True)
- break: 조건이 참이면 반복문 중단 (stop loop if the condition is True)
에 대해서 알아보겠습니다.
반복문(Loop statement)을 잘 사용하면 단순 반복 작업을 컴퓨터에게 시킬 수 있으므로 분석가, 프로그래머에게 소중한 시간을 절약할 수 있게 해주어 매우 유용합니다.
[ 파이썬 프로그램 흐름 제어 : 반복문 (Loop statement) ]
먼저 while 반복문부터 살펴보겠습니다.
(1) while: 조건이 참인 동안 반복 (loop while the condition is True) |
while 문은 조건(condition)이 참(True) 인 동안 계속 반복하게 해줍니다.
for 문은 순서열(sequence)의 항목(item)을 처음부터 끝까지 반복하는데 반해, while 문은 조건(condition)이 참(True)인 동안 반복한다는 차이점이 있습니다. 따라서, for 문처럼 처음과 끝을 알 수 없고, 그저 조건(condition) 을 만족하는 동안에는 반복을 시키고 싶으면 while 반복문을 사용하면 되겠습니다.
[Syntax of while loop in python]
while condition: conditional code block |
while 반복문은 위의 Syntax 처럼 while 다음에 조건(condition)을 써주고 끝에 콜론(colon, :)을 꼭 붙여주어야 합니다. 그 다음줄부터는 조건이 참(condition is True)인 경우에 반복 실행시키고자 하는 code block을 써주는데요, 이때 들여쓰기(indentation)을 해주어야 합니다.(spyder 같은 IDE를 사용하면 알아서 들여쓰기 해주어서 편함)
(1-1) while 반복문
처음에 '0'부터 시작해서 '1'씩 더해가는 과정을 반복하면서, 그 결과값이 '5 미만'인 조건을 만족하는 한(while) 계속해서 그 값을 출력하고 '1'씩 더해가는 반복작업을 하는 아주 간단한 예제를 들어보겠습니다.
while 반복문 |
실행 결과 (result) |
count = 0 while count < 5: print('count : ', count) count = count + 1 print('The end') |
count : 0 count : 1 count : 2 count : 3 count : 4 The end |
(1-2) else 조건문과 함께 사용하는 while 반복문
while 반복문에 else 조건문을 같이 사용할 수 도 있습니다.
아래에 '0' 부터 시작해서 '1'씩 더해가는 과정을 반복하면서, 그 결과 값이 '5 미만'인 조건을 만족하는 한(while) 계속해서 '5보다 작다'를 출력하고 이전 값에 '1'씩 더해가며, '5 미만' 조건을 만족하지 않으면(else) '5보다 작지 않다'를 출력하고 반복을 멈추는 예제를 들어보겠습니다.
while 반복문 |
실행 결과 (result) |
count = 0 while count < 5: print(count, ' is less than 5') count = count + 1 else: print(count, ' is not less 5 so stop here') |
0 is less than 5 1 is less than 5 2 is less than 5 3 is less than 5 4 is less than 5 5 is not less 5 so stop here |
(1-3) 무한 반복문 (infinite loop)
while 반복문의 조건을 True 로 해놓으면 컴퓨터의 전원을 끄지 않는 한 계속해서, 무한 반복(infinite loop)하게 됩니다. 무한 반복을 어디에 써먹을 수 있을까 싶을 텐데요, 서버처럼 연중 무중단 운영을 하는 경우 유용하게 사용할 수 있습니다. (while(True): 또는 while True: )
아래 예제에서는 무한반복해서 프린트하는 것을 spyder의 우측 상단의 중단 단추를 눌러서 강제로 종료시켰습니다. (KeyboardInterrupt)
while 반복문 (infinite loop) |
실행 결과 (result) |
# Infinite loop while(True): print('Infinite loop goes on and on ...') |
Infinite loop goes on and on ... Infinite loop goes on and on ... Infinite loop goes on and on ...
File "zmq/backend/cython/checkrc.pxd", line 12, in zmq.backend.cython.checkrc._check_rc (zmq\backend\cython\socket.c:9621)
KeyboardInterrupt |
while 무한 반복문(while True: )에 지난번 포스팅에서 살펴보았던 if, elif, else 분기문과 break 반복문 제어문을 같이 사용할 수도 있겠지요? 아래는 사용자로부터 input()으로 answer 를 받아서, answer 별로 다른 메시지를 출력하는 과정을 무한 반복(while True: 이므로...)하되, elif 조건에 해당하면 무한반복을 중단(break) 하도록 하는 예제입니다. 말로 설명하려니 너무 주저리주저리 인데요, 아래 코드와 실행 결과를 살펴보시면 이해가 금방 갈 겁니다.
while 반복문 (with if, elif, else & break) |
실행 결과 (result) |
while True: print('continue or stop? [continue/stop]:') answer = input() if answer == 'continue': print('>> continue again!') elif answer == 'stop': print('>> stop here!') break else: print('>> wrong answer!') |
continue or stop? [continue/stop]:
continue >> continue again! continue or stop? [continue/stop]:
repeate >> wrong answer! continue or stop? [continue/stop]:
continue >> continue again! continue or stop? [continue/stop]:
stop >> stop here! |
(2) for: 순서열의 처음부터 끝까지 반복 (loop until the end of the sequence) |
다음으로 for 반복문입니다. while 반복문이 조건(condition)이 참(True) 인 경우에 반복을 하는 반면에, for 반복문은 순서열(sequence)의 항목(item)을 처음부터 끝까지 순서대로 거쳐가면서 반복을 하게 됩니다.
[Syntax of for loop statement in python]
for iterating_var in sequence: code block |
for 반복문은 'for' 다음에 '반복 변수(iterating_var)'를 지정해주고 'in' 다음에 순서열(sequence), 그리고 마지막에 '콜론(colon, :)을 써줍니다. 그리고 그 다음줄에 반복을 시킬 code block 을 써주면 되는데요, 이때 들여쓰기(indentation)을 해주어야 합니다. (IDE를 사용하면 자동으로 들여쓰기 해줌)
파이썬의 순서열에는 문자열(string), 튜플(tuple), 리스트(list), 사전(dictionary), Range 등이 있습니다.
저는 특히 업무에서는 데이터 프레임을 만들어서 행(column)이나 열(row)의 개수를 세어서 range() 함수와 함께 for 반복문을 만들어서 자주 쓰곤 합니다.
(2-1) for 반복문 : with Range
for 반복문과 함께 range(start, end, interval) 함수를 사용해서 'start' 부터 'end' 보다 작은 정수값을 'interval' 정수값 만큼 간격을 두고 증가하는 순서열을 만들어보겠습니다.
range() 함수의 매개변수 start, end, interval 사용 시,
- 매개변수 'end' 의 순서열 항목은 포함이 되지 않으며,
(아래 예제에서 range(0, 5, 1) 실행결과에서 '5'는 빠져있음. R 사용자가 헷갈리기 쉬우므로 주의 요망)
- 매개변수 'interval'로 순서열의 간격을 설정할 수 있으며,
- 매개변수 'interval'을 생략하면 순서열의 간격은 '1'이 디폴트이고,
- 매개변수 'start'을 생략하면 순서열은 '0'부터 디폴트로 시작하고,
- 정수만 인식하고 부동소수형(float)은 TypeError 가 발생합니다.
for i in range(start, end, interval) |
실행 결과 (result) |
for i in range(0, 5, 1): # (start, end, interval) print(i) |
0 1 2 3 4 |
for i in range(3, 10, 2): print(i) | 3 5 7 9 |
for i in range(0, 5): # interval default : 1 print(i) | 0 1 2 3 4 |
for i in range(5): # start default : 0 print(i) | 0 1 2 3 4 |
for i in range(5, 5): print(i) | (no result) |
# TypeError for i in range(4.9, 5): print(i) | Traceback (most recent call last):
File "<ipython-input-11-bb2a792a3440>", line 1, in <module> for i in range(4.9, 5):
TypeError: 'float' object cannot be interpreted as an integer |
for 문을 복수번 사용하는 것도 가능합니다.
for 반복문과 range() 함수를 두번 사용해서 1~5 사이의 정수에서 2개씩 뽑은 모든 조합 (즉, 5C2) 의 합을 구해보는 예제입니다.
for i in range() 복수 반복문 |
실행 결과 (result) |
for i in range(1, 6): for j in range(i+1, 6): print(i, '+', j, '=', i+j) |
1 + 2 = 3 1 + 3 = 4 1 + 4 = 5 1 + 5 = 6 2 + 3 = 5 2 + 4 = 6 2 + 5 = 7 3 + 4 = 7 3 + 5 = 8 4 + 5 = 9 |
(2-2) for 반복문 with 튜플(tuple)
파이썬의 순서열 중에서 이번에는 튜플(tuple)을 사용하여 for 반복문을 만들어보겠습니다. 튜플 안의 원소들을 하나씩 순회하면서 프린트를 해주는 코드입니다.
for i in tuple |
실행 결과 (result) |
for i in ('Python', 'is', 'easy'): print(i)
print('Really?') |
Python is easy Really? |
바로 위의 예제와 동일한 결과를 반환하는 for loop 반복문을 range(len(tuple)) 과 tuple[index] 를 함께 사용하여 프로그래밍할 수도 있습니다. 위의 코드에 비하면 길기도 하고, 좀 복잡해 보이기도 하는데요, 만약 튜플의 길이가 길다면 아래의 방법으로 코딩하는 것이 더 깔끔할 수도 있으니 같이 알아 두시면 좋겠습니다.
for loop with range() & tuple index |
실행 결과 (result) |
# iterating by sequence index
mytuple = ('Python', 'is', 'easy')
for index in range(len(mytuple)): print(mytuple[index])
print('Really?') |
Python is easy Really? |
(2-3) for 반복문 with 리스트(list)
리스트도 순서열의 하나 이므로 위의 튜플 예제와 유사하게 for 반복문을 만들 수 있습니다. 리스트(list) 안에 있는 원소들을 순서대로 순회하면서 프린트하는 예제 코드입니다.
for i in list |
실행 결과 (result) |
for mylist in ['Python', 'is', 'easy']: print(mylist)
print('Are you sure?') |
Python is easy Are you sure? |
(2-4) for 반복문 with 문자열(string)
문자의 순서열(sequence of character)인 문자열(string)도 마찬가지로 for 반복문이 가능합니다. 문자열의 개별 문자(character)와 공백(space) 하나 하나 별로 순회하면서 끝의 원소까지 프린트하는 예제 코드입니다.
for i in string |
실행 결과 (result) |
for mystr in ('Python is easy'): print(mystr) print('--The end of string character--') |
P y t h o n i s e a s y --The end of string character-- |
(2-5) for 반복문 with 사전(dictionary) & 튜플 분해(tuple unpacking)
사전(dictionary) 자료형의 경우는 dic.items()로 먼저 튜플 분해(tuple unpacking, 한글로 번역을 어케해야 할까요...? ^^;)를 해서 for 반복문에 사용하면 됩니다. 고객 ID와 이름의 짝(ID, Name pair)을 이룬 사전 자료형을 순서대로 프린트하도록 하는 for 반복문 예제입니다.
for i in dictionary |
실행 결과 (result) |
mydic = {'cust_01': 'kim', 'cust_02': 'lee', 'cust_03': 'choi'}
for key, val in mydic.items(): # tuple unpacking print("ID is '{0}' and NAME is '{1}'".format(key, val)) |
ID is 'cust_01' and NAME is 'kim' ID is 'cust_02' and NAME is 'lee' ID is 'cust_03' and NAME is 'choi' |
3. continue: 조건이 참이면 반복문 계속 (continue loop if the condition is True) break: 조건이 참이면 반복문 중단 (stop loop if the condition is True) |
(3-1) continue 반복 제어문
continue 는 조건이 참(True)일 때 continue 아래 부분의 code block 을 실행하지 않고 처음의 반복 부분으로 되돌아가서 반복 loop을 계속하도록 해줍니다.
아래 예제는 for 반복문과 continue 반복 제어문을 사용해서 '1'부터 '5'까지의 정수로 이루어진 range 순서열에서 짝수(even number)이면 반복 문의 처음으로 되돌아가고, '홀수'(odd number)이면 프린트해주는 코드입니다.
for 반복문 with continue 제어문 |
실행 결과 (result) |
# print only odd numbers b/w 1 ~ 5 for i in range(1, 6): if i % 2 == 0: continue print(i) |
1 3 5 |
'1'부터 '5'까지의 정수로 이루어진 range 순서열에서 두 개의 정수를 조합(combination) 하여 합이 '5'인 경우만 프린트를 하게 해주는 코드를 for 반복문과 continue 반복 제어문을 사용해서 짜보았습니다.
for 반복문 with continue 제어문 |
실행 결과 (result) |
# if i+j == 5 then print i, j combination for i in range(1, 6): for j in range(i+1, 6): if i+j != 5: continue
print(i, '+', j, '=', i+j) |
1 + 4 = 5 2 + 3 = 5 |
(3-2) break 반복 제어문
break 반복 제어문은 조건이 참(True)일 때 반복을 중단(break, stop) 시키는 역할을 합니다. 위의 continue 와는 정반대의 기능을 하는 것이지요.
아래는 '1'부터 '6까지의 정수로 이루어진 range 수열을 순서대로 프린트를 반복하여 하되, 만약 '4'에 도달하면 중단(break)하라는 간단한 반복문 예제입니다.
for 반복문 with break 제어문 |
실행 결과 (result) |
for i in range(1, 6): print(i) if i == 4: break |
1 2 3 4 |
(3-3) for 반복문에 if, else 조건문과 break 반복 제어문 사용
아래 예제는 break 반복 제어문을 사용해서 '3~20'까지의 정수 중에서 '1'과 자기 자신 외에는 나누어지지 않는 정수인 소수(prime number) 를 찾아내는 프로그램 코드입니다. for 반복문, if, else 조건문, break 반복 제어문이 복합적으로 사용된, 좀 복잡한 코드입니다만, 지난번 포스팅과 이번 포스팅을 찬찬히 살펴보고 여기까지 따라오신 분이라면 충분히 이해하실 수 있을 것이라고 생각합니다.
for 반복문 with break, if, else |
실행 결과 (result) |
for i in range(3, 21): for j in range(2, i): if i % j == 0: k = i / j print("%d is %d * %d" %(i, j, k)) break else: if j != i - 1: continue else: print(i, "is prime number.") break print("The End") |
3 is prime number. 4 is 2 * 2 5 is prime number. 6 is 2 * 3 7 is prime number. 8 is 2 * 4 9 is 3 * 3 10 is 2 * 5 11 is prime number. 12 is 2 * 6 13 is prime number. 14 is 2 * 7 15 is 3 * 5 16 is 2 * 8 17 is prime number. 18 is 2 * 9 19 is prime number. 20 is 2 * 10 The End |
(3-4) nested while 반복문에 if 조건문과 break 반복 제어문 사용
nested while 반복문에 if 와 break를 사용해서 위의 (3-3)에서 했던 결과와 동일한 '3~20 사이의 소수 찾기' 를 해보겠습니다.
nested while loops with break, if |
실행 결과 (result) |
i = 3 while(i < 21): j = 2 while(j <= (i/j)): if not(i%j): print('%d is %d * %d' %(i, j, i/j)) break j = j + 1 if (j > i/j): print(i, " is prime") i = i + 1 print('The end')
# True or False? # not(4%2) # True # not(3%2) # False |
3 is prime 4 is 2 * 2 5 is prime 6 is 2 * 3 7 is prime 8 is 2 * 4 9 is 3 * 3 10 is 2 * 5 11 is prime 12 is 2 * 6 13 is prime 14 is 2 * 7 15 is 3 * 5 16 is 2 * 8 17 is prime 18 is 2 * 9 19 is prime 20 is 2 * 10 The end |
많은 도움이 되었기를 바랍니다.
이번 포스팅이 도움이 되었다면 아래의 '공감~'를 꾸욱 눌러주세요.