반복 수행을 할 수 있는 또 다른 방법은 while 문을 이용하는 것입니다. while 문은 조건에 따라 반복 여부를 결정합니다. 반복 범위가 정해진 반복을 수행할 경우에는 for 문을 주로 이용하고 반복 범위 없이 조건에 따라서 반복 수행 여부를 결정하는 경우에는 while 문을 주로 이용합니다.
while 문의 구조
while 문의 구조는 다음과 같습니다.
while <조건문>: <코드 블록> |
위의 while 문에서 <조건문>을 만족하면 <코드 블록>을 계속 수행하고 <조건문>을 만족하지 않으면 <코드 블록>을 실행하지 않고 while문을 빠져나오게 됩니다. 앞에서와 마찬가지로 <조건문> 다음에는 콜론(:)을 쓰고 <코드 블록>은 들여쓰기합니다.
이제 몇 가지 예를 살펴보겠습니다. 만약 '자연수 1부터 순차적으로 더해서 출력하다가 합이 20보다 크면 멈춰라'를 실행하는 코드를 작성하려면 어떻게 해야할까요? for 문을 이용한다면 얼마만큼의 숫자를 더해야 20보다 큰지를 미리 알아서 <반복 범위>를 설정해야 원하는 결과를 얻을 수 있습니다. 하지만 while 문을 이용면 그럴 필요가 없습니다. 문제의 조건을 그로 이용하면 됩니다.
다음 예제에서 while 문을 어떻게 활용하는지 살펴보겠습니다. 우선 변수 i와 sum을 0으로 초기화했습니다. 그 후에 while 문에서 sum이 20보다 작을 경우만 <코드 블록>을 반복해서 수행합니다. <코드 블록>에서는 변수 i를 1씩 증가하고 이전의 sum과 현재의 i를 더하고 변수 i와 sum을 출력합니다. sum이 20 이상이 되면 while 문을 빠져나오게 됩됩니다.
In : i =0 sum=0
print("i sum"): while (sum<20): i=i+1 sum=sum+i print(i,sum) Out : i sum 1 1 2 3 3 6 4 10 5 15 6 21 |
우위의 겨결과를 보면 sum이 21로 20 이상이 되자 while 문의 <코드 블록>을 실행하지 않고 while 문을 빠져나왔음을 알 수 있습다.
무한 반복 while문
앞에서는 while 문을 조건이 만족하는 경우에만 수행하게 했습니다. 어떤 경우에는 코드 블록을 무조건 계속 반복하라고 명령을 내려야 할 때가 있습니다. 그때는 다음과 같이 'while True:'라고 작성하면 됩니다. 예를 들어, 다음과 같은 코드를 작성하면 while 문에서 <조건문>이 항상 참이므로 코드 블록을 무조건 수행합니다.
while True: print("while test") |
위와 같이 while 문에서 <조건문>이 항상 참일 경우 <코드 블록>에 있는 코드가 무한 반복하므로 주의가 필요합니다. 이렇게 계속 반복 수행되는 것을 멈추려면 주피터 노트북에서는 툴바의 [커널 정지(interrupt the kernel)] 아이콘을을 누르고 파이썬 콘솔이나 IPython 콘솔에서는 Ctrl + C 를 누릅니다.
반복문을 제어하는 break와 continue
앞에서 for 반복문과 while 반복문을 알아봤습니다. for 문에서는 <반복 범위> 동안, while 문에서는 <조건문>을 만족할 때까지 계속해서 <코드 블록>의 코드를 실행합니다ㅣ. 만약 반복문이 수행되고 있는 동안에 특정 조건을 만족하는 경우 반복을 멈추고 <코드 블록>을 빠져나오거나 다음 반복을 수행하게 하려면 어떻게 해야할까요? 이를 위해서는 break와 continue를 이용하면 됩니다.
반복문을 빠져나오는 break
반복문(for 문 혹은 while 문) 안에서 break를 만나게 되면 반복문을 빠져나옵니다.
다음은 break를 이용해 while 문을 빠져나온 예입니다.
In : k=0 while True: k=k+1
if(k>3): break
print(k) Out : 1 2 3 |
위의 코드에서 while 다음에 True 조건이 있음으므로 <코드 블록>을 계속 반복합니다. <코드 블록>에서는 k가 4가 되면 지정한 조건 ('if(k>3)')을 만족해서 break 명령을 수행해 while 문을 빠져나옵니다. 따라서 출력 결과에 3까지만 출력되고 그 이후는 출력되지 않았습니다.
다음은 for 문에서 break를 이용한 코드입니다.
In : for k in range(10): if(k>2): break print(k) Out : 0 1 2 |
위의 코드에서는 k가 3이 되면 지정한 조건 ('if(k>2)')을 만족해서 break 명령을 수행해 반복문을 빠져나옵니다. 이렇게 break 명령어를 이용하면 특정 조건을 만족할 때 반복문을 멈추게 할 수 있습니다.
다음 반복을 실행하는 continue
반복문 안에서 continue를 만나면 반복문의 처음으로 돌아가서 다음 반복을 진행합니다.
다음은 for 무문에서 continue를 이용하는 예입니다.
In : for k in range(5): if(k=2): continue
print(k) Out : 0 1 3 4 |
d위의 코드에서 for 문을 이용해 <반복 범위>({0,1,2,3,4})만큼 <코드 블록>을 실행합니다. 그러나 k가 2일 때는 지정 조건('if(k=2)')을 만족해 continue가 실행돼 반복문의 처음으로 돌아가서 다음 반복을 진행하므로 continue 다음에 있는 print(k)를 실행하지 않아 출력 결과에 2는 빠져있습니다.
다음은 while 문에서 break와 continue를 모두 사용한 코드의 예입니다.
In : k=0 while True: k=k+1
if(k=2): print("continue test") continue if(k>4): break
print(k) Out : 1 continue test 3 4 |
위 예제에서는 변수 k가 2일 경우에 continue를 실행합니다. 반복문에서 continue를 만나면 그 이후의 코드는 실행하지 않고 반복문의 처음으로 가서 바로 다음 반복을 수행합니다. 따라서 continue 문 다음에 있는 print(k)가 수행되지 않아서 2가 출력되지 않았습니다. 그 이후에 k가 3과 4인 경우에는 print(k)가 수행돼 출력됐고 k가 5가 되면 지정 조건 ('if(k>4)')을 만족해 break가 수행돼 while 문을 빠져나옵니다. 그래서 5 이상은 출력되지 않았습니다.
간단하게 반복하는 한 줄 for 문
파이썬에서는 리스트, 세트, 딕셔너리 내에서 실행할 수 있는 한 줄 for 문도 지원합니다. 이를 각각 '리스트 컴프리헨션(List comprehension)', '세트 컴프리헨션(Set comprehension)', '딕셔너리 컴프리헨션(Dictionary comprehension)'이라고합니다. 컴프리헨션(comprehension)은 우리말로 내포(혹은 내장)라는 뜻으로서 리스트, 세트, 딕셔너리 컴프리헨션은 각각 리스트, 세트 딕셔너리 내에 코드가 내포돼 실행되는 것을 의미합니다. 컴프리헨션을 잘 이용하면 리스트, 세트, 딕셔너리 데이터를 반복해서 처리해야 할 때 코드를 한 줄로 작성할 수 있어서 편리합니다. 이 책에서는 많이 이용하는 리스트 컴프리헨션을 중심으로 설명하겠습니다.
리스트 컴프리헨션의 기본 구조
리스트 컴프리헨션의 기본적인 구조는 다음과 같습니다.
[<반복 실행문> for <반복 변수> in <반복 범위>] |
앞에서 살펴본 for 문에서는 <반복 실행문이>이 'for <반복 변수> in <반복 범위>:' 다음 줄에 왔는데 한 줄 for 문에서는 <반복 실행문>이 먼저 나옵니다. 또한 콜론(:)도 이용하지 않습니다.
다음처럼 1~5까지 숫자가 들어있는 리스트에서 각 항목의 숫자를 제곱하려면 어떻게 하면 될까요? 우선 앞에서 배운 for 문을 이용하겠습니다.
In : numbers=[1,2,3,4,5] square=[]
for i in numbers: square.append(i**2) print(square) Out : [1,4,9,16,25] |
다음처럼 리스트 컴프리헨션 방법을 이용하면 위의 코드보다 좀 더 간단하게 코드를 작성할 수 있습니다.
In : numbers=[1,2,3,4,5] square=[i**2 for i in numbers] print(square) Out : [1,4,9,16,25] |
조건문을 포함한 리스트 컴프리헨션
리스트 컴프리헨션은 다음과 같이 for 문 다음에 if<조건문>을 추가할 수 있습니다.
[<반복 실행문> for <반복 변수> in <반복 범위> if <조건문>] |
이 경우 반복문을 수행하다가 if <조건문>을 만족하는 경우에만 <반복 실행문>을 실행합니다.
리스트 컴프리헨션을 이용하지 않고 앞에서 살펴본 리스트의 각 항목에서 3 이상의 숫자만 제곱하도록 하려면 다음처럼 if 문을 포함한 for 문을 작성할 수 있습니다.
In : numbers=[1,2,3,4,5] Out : [9,16,25] |
다음은 위의 코드를 조건문을 포함한 리스트 컴프리헨션을 이용해 다시 작성한 것입니다.
In : numbers=[1,2,3,4,5] square=[i**2 for i in numbers if i>=3] print(square) Out : [9,16,25] |
위 예에서는 조건문을 포함한 리스트 컴프리헨션 방법을 이용해 한 줄로 조건에 맞는 리스트의 항목만 제곱하는 코드를 작성했습니다. 보다시피 리스트 컴프리헨션 방법을 이용하지 않는 코드보다 훨씬 간결하다는 것을 알 수 있습니다.
출처 : 데이터분석을 위한 파이썬 철저 입문 中