범위 while 반복문 break 반복문 continue 키워드
지금까지는 어떤 대상을 기반으로 반복을 적용해 보았습니다. 여기서는 '특정 횟수 만큼 반복한다', '특정 시간 동안 반복한다', '어떤 조건이 될 때까지 반복한다'와 같이 반복하는 경우에 대해 알아보겠습니다.
지금까지 리스트와 딕셔너리에 대해 알아보고 for 반복문에서 활용하는 방법도 배웠습니다. 추가로 for 반복문과 함께 많이 사용되는 자료형을 하나 더 꼽자면 범위가 있습니다. 특정한 횟수만큼 반복해서 돌리고 싶을 때는 for 반복문과 범위를 조합해서 사용합니다.
리스트, 딕셔너리 외에 for 반복문과 함께 많이 사용되는 범위자료형의 사용법에 대해 알아보겠습니다.
첫째, 매개 변수에 숫자를 한 개 넣는 방법
0부터 A-1까지 정수로 범위를 만듭니다.
range(A) # A는 숫자
둘째, 매개 변수에 숫자를 두 개 넣는 방법
A부터 B-1까지의 정수로 범위를 만듭니다.
range(A, B) # A와 B는 숫자
셋째, 매개 변수에 숫자를 세 개 넣는 방법
A부터 B-1까지의 정수로 범위를 만드는데, 앞뒤의 숫자가 C만큼의 차이를 가집니다.
rnage(A, B, C) # A, B, C 는 숫자
코드를 실행해 보겠습니다. 매개변수에 숫자를 한 개 넣는 방법입니다. 범위를 선언합니다.
>>> a = range(5)
범위 이름을 입력하면 다음과 같은 형태로 출력됩니다.
>>> a
range(0, 5)
어떤 값들이 해당하는지 보기 위해 list() 함수로 출력해 보았습니다. list() 함수를 이용해 범위를 리스트로 변경하면 범위 내부에 어떤 값이 들어 있는지 확인할 수 있습니다.
>>> list(rnage(10))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
매개변수에 숫자를 두 개 넣은 범위입니다.
>>> list(range(0,5)) # 0부터 4까지의 정수로 범위를 만듭니다
[0, 1, 2, 3, 4]
>>> list(rnage(5,10)) # 0부터 9까지의 정수로 범위를 만듭니다.
[5, 6, 7, 8, 9]
매개변수에 숫자를 세 개 넣은 범위입니다.
>>> list(rnage(0, 10, 2)) # 0부터 2씩 증가하면서 9까지
[0, 2, 4, 6, 8]
>>> list(rnage(0, 10, 3)) # 0 부터 3씩 증가하여 9까지
[0, 3, 6, 9]
여기서 잠깐! range(0, 10)에서 10은 포함되지 않아요
처음 범위를 공부할 때 range(10), range(0, 10)이라고 되어 있으면 0부터 10까지라고 생각하는 경우가 많은데, 10이 포함되지 않습니다. 이전에 string[0:2] 또는 list_a[0:2]라고 입력하면 뒤에 뒤에 입력한 2는 포함되지 않는다고 했던 것을 기억하세요? 파이썬의 모든 기능들은 범위를 지정할 때 뒤에 입력한 숫자를 포함하지 않습니다. 꼭 기억해 주세요.
범위를 만들 때 매개변수 내부에 수식을 사용하는 경우도 많습니다. 예를 들어 0부터 10까지의 범위를 생성하는데, 10을 반드시 포함해야 한다는 것을 강조하고 싶을 때는 다음과 같이 작성하기도 합니다.
>>> a = range(0, 10+1)
>>> list(a)
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
비효율적으로 보일 수도 있지만 받아들이는 사람에게 강조할 수 있는 것입니다. 이때 받아들이는 사람이란 다른 사람일 수도 있지만, 미래에 해당 코드를 다시 보는 자신일 수도 있습니다. 왜 이렇게 사용하는지는 이후에 문제를 풀다 보면 더 잘 이해할 수 있습니다.
수식에 나누기 연산자를 사용한 경우를 살펴보겠습니다.
>>> n = 10
>>> a = range(0, n/2) # 매개변수로 나눗셈을 사용한 경우 오류가 발생합니다.
TypeError Traceback (most recent call last)
<ipython-input-12-f9cacce676a5> in <module>
1 n = 10
----> 2 a = range(0, n/2)
TypeError: 'float' object cannot be interpreted as an integer
TypeError가 발생하는데요. rnage()함수의 매개변수로는 반드시 정수를 입력해야 하기 때문입니다. int() 함수 등으로 실수를 정수로 바꾸는 방법도 있겠지만, 다음과 같이 정수 나누기 연산자를 많이 사용합니다.
>>> a = range(0, int(n/2)) # 실수를 정수로 바꾸는 방법보다
>>> list(a)
[0, 1, 2, 3, 4]
>>> a = range(0, n//2) # 정수 나누기 연산자를 많이 사용합니다.
>>> list(a)
[0, 1, 2, 3, 4]
for 반복문과 범위를 조합하는 방법을 살펴보겠습니다. for 반복문과 범위를 조합하여 사용하면 다음과 같은 형태가 됩니다.
for 숫자 변수 in 범위 :
코드
직접 손코딩을 하면서 그 결과를 가지고 살펴보겠습니다.
소스코드 for_range.py
# for 반복문과 범위를 함께 조합해서 사용합니다.
for i in range(5) :
#1 i = 0, 1, 2, 3, 4
print(str(i) + "= 반복 변수")
#2 (정수) 0 = 반복 변수, 1 = 반복 변수, 2 = 반복 변수, 3 = 반복 변수, 4 = 반복 변수
print()
for i in range(5,10) :
#3 i = 5, 6, 7, 8, 9
print(str(i) + "= 반복 변수")
#4 (정수) 5 = 반복 변수, 6 = 반복 변수, 7 = 반복 변수, 8 = 반복 변수, 9 = 반복 변수
print()
for i in range(0, 10, 3) :
#5 i = 0, 3, 6, 9
print(str(i) + "= 반복 변수")
#6 0 = 반복 변수, 3 = 반복 변수, 6 = 반복 변수, 9 = 반복 변수
## 실행 결과
0= 반복 변수
1= 반복 변수
2= 반복 변수
3= 반복 변수
4= 반복 변수
5= 반복 변수
6= 반복 변수
7= 반복 변수
8= 반복 변수
9= 반복 변수
0= 반복 변수
3= 반복 변수
6= 반복 변수
9= 반복 변수
첫 번째 반복문은 [0, 1, 2, 3, 4]로, 두 번째 반복문은 [5, 6, 7, 8, 9]로, 세 번째 반복문은 [0, 3, 6, 9]로 반복이 일어납니다.
리스트와 for 반복문을 조합해서 사용할 때 아래와 같은 코드를 사용했습니다. 그런데 반복을 적용하다 보면 '몇 번째 반복일까?'를 알아야 하는 경우가 있습니다.
# 리스트를 선언합니다.
array = [123, 45, 65, 764, 23]
# 리스트에 반복을 적용합니다.
for element in array :
# 출력합니다.
print(element)
# 현재 무엇을 출력하고 있는지 보다, 몇 번째 출력인지 알아야 하는 경우가 있습니다.
## 실행 결과
123
45
65
764
23
'몇 번째인지 알아내는 방법'은 많습니다. 가장 쉬운 방법은 다음과 같이 범위를 조합해서 사용하는 것입니다.
소스코드 list_range01.py
# 리스트를 선언합니다.
array = [123, 45, 65, 764, 23]
# 리스트에 반복을 적용합니다.
for i in range(len(array)) :
# 출력합니다.
print("{}번째 반복 : {}".format(i, array[i]))
## 실행 결과
0번째 반복 : 123
1번째 반복 : 45
2번째 반복 : 65
3번째 반복 : 764
4번째 반복 : 23
기본적인 방법이며, 가장 많이 사용되는 형태입니다. 이번 절의 확인문제에서 다시 한번 살펴보겠습니다. 이를 조금 더 편한 형식으로 사용할 수도 있는데요. 이와 관련된 내용은 4-4에서 알아보겠습니다.
방금 살펴본 반복문과 작은 숫자에서 큰 숫자 순서로 올라갔습니다. 그런데 프로그래밍을 하다 보면 큰 숫자에서 작은 숫자로 반복문을 적용해야 하는 경우도 있습니다. 이러한 반복문을 역반복문이라고 부르기도 하는데요. 크게 두 가지 방법을 사용해서 만듭니다.
첫 번째 range() 함수의 매개변수를 세 개 사용하는 방법입니다.
소스코드 reversed_for01.py
# 역반복문
for i in range(4, 0-1, -1) :
# 출력합니다.
print("현재 반복 변수 : {}".format(i))
## 실행 결과
현재 반복 변수 : 4
현재 반복 변수 : 3
현재 반복 변수 : 2
현재 반복 변수 : 1
현재 반복 변수 : 0
range() 함수의 매개변수에 0-1이라는 수식을 넣었는데요. 그냥 -1로 입력해도 상관없습니다. 이전에 언급했던 것처럼 단순한 강조 표현입니다.
두 번째는 reversed() 함수를 사용하는 방법입니다.
소스코드 reversed_for02.py
# 역반복문
for i in reversed(range(5)) :
# 출력합니다.
print("현재 반복 변수 : {}".format(i))
## 실행 결과
현재 반복 변수 : 4
현재 반복 변수 : 3
현재 반복 변수 : 2
현재 반복 변수 : 1
현재 반복 변수 : 0
reversed() 함수를 적용하면 [0, 1, 2, 3, 4]라는 형태의 범위가 [4, 3, 2, 1, 0]으로 뒤집어집니다. 따라서 9부터 0까지 반대로 반복문을 돌릴 수 있습니다.
reversed() 함수는 리스트 등에도 적용할 수 있습니다. 그런데 reversed() 함수는 처음 사용하다보면 '이렇게 될 것 같은데 안 되네?'라는 생각을 할 정도로 주의 사항이 굉장히 많은 함수입니다. 4-4에서 좀 더 자세히 알아보겠습니다.
지금까지 for 반복문의 기본적인 사용 형태에 대해서 모두 살펴보았습니다. 매개변수에 리스트를 넣는 경우, 딕셔너리를 넣는 경우, 범위를 넣는 경우로 구분해서 생각하면 쉽게 이해할 수 있습니다.
리스트 또는 딕셔너리 내부의 요소를 모두 순회하는 경우, 즉 특정 횟수만큼 반복하는 경우에는 for 반복문을 사용합니다. 그런데 파이썬에는 for 반복문 외에도 범용적으로 사용할 수 있는 while 반복문이 있습니다. 기본적인 형태는 다음과 같습니다.
while 불 표현식 :
문장
if 조건문과 굉장히 비슷한 형식인데, <불 표현식>이 참인 동안 문장을 계속 반복합니다. 그럼 불 표현식에 True를 넣어 어떤 결과가 나타나는지 확인해 보겠습니다.
소스코드 infinite_loop.py
# while 반복문을 사용합니다.
while True :
# "."을 출력합니다.
# 기본적으로 end가 "\n"이라 줄바꿈이 일어나는데
# 빈 문자열 ""로 바꿔서 줄바꿈이 일어나지 않게 합니다.
print(".", end="")
## 실행 결과
..........(이하 생략)
실행하면 위와 같이 화면세 "."이 무한하게 출력됩니다. 무한하게 반복되므로 강제 종료합니다.
while 반복문의 기본적인 사용 방법을 알아보는 고전적인 예제를 살펴보겠습니다.
소스코드 while_as_for.py
# 반복 변수를 기반으로 반복하기
i = 0
while i < 10 :
print("{}번째 반복입니다.".format(i))
i += 1
## 실행 결과
0번째 반복입니다.
1번째 반복입니다.
2번째 반복입니다.
3번째 반복입니다.
4번째 반복입니다.
5번째 반복입니다.
6번째 반복입니다.
7번째 반복입니다.
8번째 반복입니다.
9번째 반복입니다.
그렇다면 for 반복문은 언제 사용하고, while 반복문은 언제 사용할까요 for 반복문은 살명할 때 언급했던 것 이외에는 모두 while 반복문을 사용합니다. 대표적으로 바로 앞서 실행했던 무한 반복입니다. for 반복문으로 무한 반복을 구현할 수 없습니다. 그리고 while 반복문에서 가장 중요한 키워드는 '조건'입니다. 조건을 활용해서 반복을 사용해야 한다면 while 반복문을 사용하는 것이 좋습니다. 조건이 중요한 경우에 대해 살펴보겠습니다.
4-1에서 살펴보았던 리스트의 remove() 함수는 리스트 내부에서 해당하는 값을 하나만 제거할 수 있었습니다. while 반복문을 활용하면 여러 개를 제거할 수 있습니다. while 반복문의 조건을 '리스트 내부에 요소가 있는 동안'으로 지정합니다.
소스코드 while_with_condition.py
# 변수를 선언합니다.
list_test = [1, 2, 1, 2]
value = 2
# list_test 내부에 value가 잇다면 반복
while value in list_test :
list_test.remove(value)
# 출력합니다.
print(list_test)
## 실행 결과
[1, 1]
리스트 내부에 있는 모든 2가 제거될 때까지 반복하기 때문에 2가 모두 제거된 결과가 출력됩니다.
시간을 기반으로 반복하는 예를 살펴보겠습니다. 시간을 기반으로 반복하려면 유닉스 타임이라는 개념을 알아야 합니다. 유닉스 타임이란 세계 표준시로, 1970년 1월 1일 0시 0분 0초를 기준으로 몇 초가 지났는지를 정수로 나타낸 것을 말합니다. 파이썬에서 유닉스 타임을 구할 때는 다음과 같은 코드를 사용합니다.
먼저 시간과 관련된 기능을 가져옵니다.
>>> import time
그런 다음 유닉스 타임을 구합니다.
>>> time.time()
1621085808.049545
이러한 유닉스 타임과 while 반복문을 조합하면 특정 시간 동안 프로그램을 정지시킬 수 있습니다. 다음 코드를 살펴보겠습니다.
# 시간과 관련된 기능을 가져옵니다.
import time
# 변수를 선언합니다.
number = 0
# 5초 동안 반복합니다.
target_tick = time.time() + 5
while time.time() < target_tick :
number += 1
# 출력합니다.
print("5초 동안 {}번 반복했습니다.".format(number))
## 실행 결과
5초 동안 32392044번 반복했습니다.
컴퓨터의 성능과 상황에 따라 반복 횟수는 다릅니다. 통신할 때 자주 사용되는 코드이므로 시간을 기반으로 조건을 걸때는 while 반복문을 활용한다고 기억해 주세요.
여기서 잠깐! for 반복문, while 반복문 중 무엇으로 작성할지가 고민된다면
for 반복문과 while 반복문에 대해 알아보았습니다. 사용 구분을 길게 설명했지만 스스로 코드를 입력해 보며 while 반복문보다 for 반복문으로 작성하는게 편할 것 같다. 혹은 그 반대가 좋겠다라는 것을 직접 느끼는 것이 중요합니다.
반복문 내부에서만 사용할 수 있는 break와 continue라는 특수한 키워드가 있습니다. break 키워드는 반복문을 벗어날 때 사용하는 키워드입니다. 일반적으로 무한 반복문을 만들고, 내부의 반복을 벗어날 때 많이 사용합니다.
# 변수를 선언합니다.
i = 0
# 무한 반복합니다.
while True :
# 몇 번째 반복인지 출력합니다.
print("{}번째 반복문입니다.".format(i))
i = i + 1
# 반복을 종료합니다.
input_text = input("> 종료하시겠습니다>(y/n) : ")
if input_text in ["y", "Y"] :
print("반복을 종료합니다.")
break
## 실행 결과
0번째 반복문입니다.
> 종료하시겠습니다>(y/n) : n
1번째 반복문입니다.
> 종료하시겠습니다>(y/n) : n
2번째 반복문입니다.
> 종료하시겠습니다>(y/n) : n
3번째 반복문입니다.
> 종료하시겠습니다>(y/n) : n
4번째 반복문입니다.
> 종료하시겠습니다>(y/n) : n
5번째 반복문입니다.
> 종료하시겠습니다>(y/n) : n
6번째 반복문입니다.
> 종료하시겠습니다>(y/n) : y
반복을 종료합니다.
코드를 실행하면 "0번째 반복문입니다."를 출력하고 프로그램을 종료할지 물어봅니다. 이때 "y" 또는 "Y"를 입력하면 break 키워드를 만나 반복문을 벗어나게 되므로 프로그램이 종료됩니다. 이 외의 경우에는 반복문을 계속 실행합니다.
continue 키워드는 현재 반복을 생략하고, 다음 반복으로 넘어갈 때 사용하는 키워드입니다. 현재 반복을 생략한다는 말을 아래 예제로 확인해보겠습니다.
# 변수를 선언합니다.
numbers = [5, 15, 6, 20, 7, 25]
# 반복을 돌립니다.
for number in numbers :
# number가 10보다 작으면 다음 반복으로 넘어갑니다.
if number < 10 :
continue
# 현재 반복을 중지하고, 다음 반복으로 넘어간다.
# 여기서는 10보다 이하면 아래 구문(print)를 출력하지 않음
# 출력합니다.
print(number)
## 실행 결과
15
20
25
if else 구문으로 사용해도 됩니다 다만 continue 키워드를 사용한 경우 이후 처리의 들여쓰기를 하나 줄일 수 있습니다.
range() 함수로 생성합니다.| 코드 | 나타내는 값 |
|---|---|
| range(5) | [0, 1, 2, 3, 4] |
| range(4, 6) | [4, 5] |
| range(7, 0, -1) | [7, 6, 5, 4, 3, 2, 1] |
| range(3, 8) | [3, 4, 5, 6, 7] |
| range(3, 10, 3) | [3, 6, 9] |
<풀이 방법 1>
# 숫자는 무작위로 입력해도 상관 없습니다.
key_list = ["name", "hp", "mp", "level"]
value_list = ["기사", 200, 30, 5]
character = {}
# 작성합니다.
for i in range(len(key_list)) :
#1 i 를 range(4) 까지 반복
character[key_list[i]] = value_list[i]
#2 character [key_list[0]] = value_list[0] {'name': '기사'}
#3 character [key_list[1]] = value_list[1] {'hp': 200}
#4 character [key_list[2]] = value_list[2] {'mp': 30}
#5 character [key_list[3]] = value_list[3] {'level': 5}
# 출력합니다.
print(character)
<풀이 방법 2>
# 숫자는 무작위로 입력해도 상관 없습니다.
key_list = ["name", "hp", "mp", "level"]
value_list = ["기사", 200, 30, 5]
character = {}
i = 0
#1 i = 0
#4 i = 1
#7 i = 2
#10 i = 3
while i < 4 :
character[key_list[i]] = value_list[i]
#2 character [key_list[0]] = value_list[0] {'name': '기사'}
#5 character [key_list[1]] = value_list[1] {'hp': 200}
#8 character [key_list[2]] = value_list[2] {'mp': 30}
#11 character [key_list[3]] = value_list[3] {'level': 5}
i += 1
#3 i = 0 + 1 = 1
#6 i = 1 + 1 = 2
#9 i = 2 + 1 = 3
# 출력합니다.
print(character)
#12 print(character) {'name': '기사', 'hp': 200, 'mp': 30, 'level': 5}
{'name': '기사', 'hp': 200, 'mp': 30, 'level': 5}
1, 1 + 2 = 3, 1 + 2 + 3 = 6, 1 + 2 + 3 + 4 = 10 ...
limit = 1000
i = 1
sum_value = 0
while sum_value < limit :
sum_value += i
i += 1
print("{}를 더할 때 {}을 넘으며 그때의 값은 {}입니다".format(i-1, limit, sum_value))
limit
1 * 99, 2 * 98, 3 * 97, ... , 98 * 2, 99 * 1
실행 결과
최대가 되는 경우 : 50 * 50 = 2500
반복문을 사용하여 모든 경우를 찾는 방법으로 풀어보세요.
max_value = 0
a = 0
b = 0
## i를 1부터 99까지 반복합니다
for i in range(1,99+1) :
j = 100 - i
## print(i,j)
## 최댓값 구하기
if max_value < i * j :
## 만약 max_value 값이 새로 구한 i * j 값보다 작다면
#2 max_value(0) < 1 * 99(99)
#5 max_value(99) < 2 * 98(196)
#8 max_value(2499) < 50 * 50(2500)
## max_value(2500) < 51 * 49(2499) 조건을 충족하지 않음!
max_value = i * j
## 이때 이 값을 max_value에 넣는다
#3 max_value = 1 * 99 = 99
#6 max_value = 2 * 98 = 196
#9 max_value = 50 * 50 = 2500
a = i
b = j
#4 a = 1, b = 99
#7 a = 2, b = 98
#10 a = 50, b = 50
print("최대가 되는 경우 : {} * {} = {}".format(a,b,max_value))
최대가 되는 경우 : 50 * 50 = 2500
윤성인, 『혼자 공부하는 파이썬』, 한빛미디어(2019), p174-189.