while 반복문은 특정 조건이 만족되는 동안 동일한 명령문을 반복 실행한다.
형식은 다음과 같다.
while 논리식:
명령문while 논리식이 쓰여진 행의 끝에 콜론 : 이 사용되고
그 아래에 있는 명령문은 들여쓰기 되었음에 주의한다.
논리식이 True로 유지되는 동안 들여쓰기된 명령문이 반복된다.
9.1기본 활용법¶
for 반복문은 리스트 또는 range 자료형의 값처럼 일정 구간에서 변하는 값들을
대상으로 동일한 명령문을 반복 수행할 때 사용한다.
반면에 while 반복문은 일정 구간이나 규칙이 없어도 특정 조건이 만족되는 동안
계속해서 동일한 명령문을 반복 실행하고자 할 때 사용한다.
예를 들어 "수 알아맞히기 게임"은
1부터 100 사이에서 임의로 선정된 정수를 찍어서 맞혀야 한다.
게임 참여자는 정답을 맞힐 때가지 반복해서 1부터 100 사이의 정수를 찍는다.
그런데 참여자가 몇 번 찍어야 답을 맞힐 것인지 미리 알 수 없다.
이런 경우에 while 반복문을 사용한다.
아래 코드는 입력값이 17을 맞히지 못하면 계속해서
입력을 받도록 한다.
또한 게임 참여자가 입력한 값 guess가 secret와 다르면
큰지 또는 작은지 여부를 알려주면서
게임 참여자가 예측 범위를 줄여 나갈 수 있도록 도와준다.
while guess != secret이 실행되기 전에
guess = -1로 변수 할당문을 선언하는 이유는
while 반복문이 최소 한 번은 실행되도록 하기 위함이다.
첫 입력값을 50으로 한 다음에 secret 보다 큰지 작은지 여부에 따라
적절한 값을 입력하면 언젠가는 답을 맞추게 된다.
print("수 알아맞히기 게임에 환영합니다.")
secret = 17
guess = -1 # 이어지는 while 반복문이 최소 한 번은 실행되도록 함
while guess != secret:
guess = int(input("1부터 100 사이의 정수 하나를 입력하세요: "))
if guess == secret:
print("맞았습니다!")
elif guess > secret:
print("너무 커요!")
else:
print("너무 작아요!")
print("게임 종료!")수 알아맞히기 게임에 환영합니다.
1부터 100 사이의 정수 하나를 입력하세요: 50
너무 커요!
1부터 100 사이의 정수 하나를 입력하세요: 25
너무 커요!
1부터 100 사이의 정수 하나를 입력하세요: 12
너무 작아요!
1부터 100 사이의 정수 하나를 입력하세요: 18
너무 커요!
1부터 100 사이의 정수 하나를 입력하세요: 15
너무 작아요!
1부터 100 사이의 정수 하나를 입력하세요: 16
너무 작아요!
1부터 100 사이의 정수 하나를 입력하세요: 17
맞았습니다!
게임 종료!
9.2리스트와 while 반복문¶
아래 코드는 1부터 5까지의 정수를 더하는 코드를 for 반복문으로 구현한다.
one2five = [1, 2, 3, 4, 5]
sum_list = 0
for item in one2five:
sum_list += item
print("1부터 5까지 정수들의 합:", sum_list)1부터 5까지 정수들의 합: 15
동일한 기능의 코드를 while 반복문으로 구현할 수 있다.
그런데 리스트를 대상으로 while 반복문을
실행하려면 리스트의 길이, 즉 리스트에 포함된 항목들의 개수와 인덱싱을 활용한다.
이유는 for 반복문과는 달리 while 반복문은 리스트의 항목을
직접 가리키는 기능을 제공하지 않기 때문이다.
아래 코드는 1부터 5까지의 정수를 더하는 코드를 while 반복문으로 구현한다.
len()함수가 리스트에 포함된 항목들의 개수를 반환한다.인덱스를 가리키는 변수
i의 값을 반복문이 한 번 실행될 때마다 인위적으로 1씩 키워주는 업데이트를 실행한다.i가 리스트의 길이보다 같아질 때까지 항목을 누적해서 더하는 과정을 반복한다.
one2five = [1, 2, 3, 4, 5]
sum_list = 0
i = 0
while i < len(one2five):
item = one2five[i]
sum_list += item
i += 1
print("1부터 5까지 정수들의 합:", sum_list)1부터 5까지 정수들의 합: 15
코드에 포함된 아래 while 반복분이 실행될 때
i 변수는 먼저 0을 가리키기에 item 변수는 0번째 인덱스의 값인 1을 가리킨다.
while i < len(one2five):
item = one2five[i]
sum_list += item
i += 1 따라서 sum_list가 0이 아닌 1을 가리키게 된다.
이후 i가 1로 바뀌고 다시 반복문의 본문의 처음으로 돌아간다.
이때 item은 1번 인덱스 항목인 2를 가리키고 반복문의 본문을 다시 실행한다.
이 과정을 i가 4를 가키릴 때까지 반복하면
sum_list는 one2five 리스트의 0번 인덱스의 항목부터 마지막 항목까지
더한 값을 가리키게 되고 i가 5, 즉 one2five의 길이와 같아지게 되어
while 반복문의 실행을 종료하고 다음 명령문으로 넘어간다.
Python Tutor 활용 while 반복문 설명
아래 그림은 위 코드의 while 반복문이 실행되어 item 변수가 선언된 순간에
sum_list와 i는 아직 초기화 상태이고 item은 0번 인덱스 항목인 1을 가리키고 있음을 보여준다.

반면에 아래 그림은 while 반복문이 세 번째로 실행되어
i는 2, item은 3을 가리키지만
sum_list는 아직 업데이트 이전 상태를 보여준다.

while 반복문이 계속 실행되어 i가 5가 되면 논리식 i < len(one2five)가 거짓이 되고
반복문을 더 이상 실행하지 않는다.
sum_list는 모든 항목이 더해진 상태인 15를 가리킨다.

9.3continue와 break¶
for반복문 뿐만 아니라 while 반복문의 실행 도중에도
continue 명령문과 break 명령문이 실행되면
특정 경우를 건너뛰도록 하거나 while 반복문의 실행을 중간에 중단된다.
9.3.1continue 명령문¶
continue 명령문이 반복문 실행 도중에 실행되면 반복문의 실행을 중지하고
다시 반복문의 처음으로 돌아간다.
for반복문: 현재 처리중인 경우를 바로 건너 뛰고 다음 경우로 넘어감.while반복문:while반복문의 처음으로 바로 돌아감.
아래 프로그램을 실행하면 1부터 9까지의 정수를 대상으로 차례대로 3의 배수 여부를 판단한다.
num이 차례대로 1, 2, 3, ... 등을 할당받을 때마다
3의 배수 여부를 판단한다.
num에 할당된 값이 3의 배수인 경우: 3의 배수임을 확인하는 문자열 출력num에 할당된 값이 3의 배수가 아닌 경우:continue명령문이 실행되어 바로 아랫줄의print()명령문을 실행하지 않고 반복문의 다음 경우로 이동함. 즉,num이 다음 항목을 가리키도록 함.
결국 num이 1부터 시작해서 차례대로 값을 할당받으면 1, 2, 4, 5, 7, 8의 경우는 continue 명령문에 의해
무시되는 효과가 발생한다.
for num in range(1, 10):
if num % 3 == 0:
print(num, "은(는) 3의 배수!")
else:
continue
print("1과 10 사이에서 3의 배수를 확인했음!")3 은(는) 3의 배수!
6 은(는) 3의 배수!
9 은(는) 3의 배수!
1과 10 사이에서 3의 배수를 확인했음!
아래 코드는 위 코드와 동일하게 작동한다.
대신 while 반복문을 사용한다.
num = 1
while num < 10:
if num % 3 == 0:
print(num, "은(는) 3의 배수!")
num += 1
else:
num += 1
continue
print("1과 10 사이에서 3의 배수를 확인했음!")3 은(는) 3의 배수!
6 은(는) 3의 배수!
9 은(는) 3의 배수!
1과 10 사이에서 3의 배수를 확인했음!
num을 1로 초기화 하고
num += 1 명령문을 while 반복문이 한 번 실행될 때 마다 실행되도록 함에 주의한다.
그렇지 않으면 num이 가리키는 값이 업데이트되지 않아 무한 반복에 빠질 수 있다.
특히 num이 3의 배수가 아닌 값을 가리킬 때 continue가 실행되기 전에 num을 업데이트 해야 한다.
예를 들어 아래 코드를 실행하면 반복문의 실행이 멈추지 않는다.
num = 0
while num < 10:
if num % 3 == 0:
print(num, "은(는) 3의 배수!")
else:
continue
num += 1
print("1과 10 사이에서 3의 배수를 확인했음!")9.3.2break 명령문¶
break 명령문은 for 또는 while 반복문의 실행을 중지시킨다.
예를 들어, 아래 프로그램을 실행하면
1부터 9까지의 정수를 대상으로
차례대로 3의 배수 여부를 판단한다.
num 변수에 차례대로 1, 2, 3, ... 를 할당할 때마다 3의 배수 여부를 판단한다.
3의 배수가 아닐 때:
num이 가리키는 값이 3의 배수가 아님을 출력함.3의 배수인 경우: 3의 배수를 찾았다고 알린 후 바로
break명령문이 실행되어 반복문이 종료됨. 즉,"3의 배수 찾았음"을 출력하는 바로 다음 줄에 위치한print()함수의 호출은 실행되지 않음.
즉, num 변수가 1 또는 2를 가리킬 때는 3의 배수가 아님을 알리고
3을 가리킬 때는 3의 배수임을 알리고 바로 for 반복문의 실행을 종료시킨다.
원래는 num 변수가 4, 5, ... 등을 가리키는 경우도 반복해야 하지만 더이상 그러지 않는다.
이후 마지막 줄의 print() 함수 호출은 실행되어 프로그램의 종료를 알린다.
break는 자신을 포함한 반복문의 실행을 멈추게 하지만
전체 프로그램은 차례대로 끝까지 실행된다.
for num in range(1, 10):
if num % 3 != 0:
print(num, "은(는) 3의 배수 아님!")
else:
print(num, "은(는) 3의 배수!")
break
print("프로그램 종료!")1 은(는) 3의 배수 아님!
2 은(는) 3의 배수 아님!
3 은(는) 3의 배수!
프로그램 종료!
아래 코드는 위 프로그램을 while 반복문으로 구현하였으며
실행되는 과정은 위 코드와 동일하다.
즉, num에 3이 할당되어 3의 배수를 가리키는 순간
break 명령문이 실행되어 반복문이 바로 멈추고
마지막 줄의 print() 함수가 호출된다.
num = 1
while num < 10:
if num % 3 != 0:
print(num, "은(는) 3의 배수 아님!")
else:
print(num, "은(는) 3의 배수!")
break
num += 1
print("프로그램 종료!")1 은(는) 3의 배수 아님!
2 은(는) 3의 배수 아님!
3 은(는) 3의 배수!
프로그램 종료!
9.3.3continue와 break 영향 범위¶
continue와 break 명령문은 자신을 포함한 for 또는 while 반복문의 실행에만
영항을 준다.
예를 들어 동일한 일을 하는 아래 두 코드를 실행하면 1과 2를 출력한 후에
for와 while 반복문의 실행이 멈춘다.
그리고 마지막 줄에 위치한 print("코드 실행 종료") 명령문이 실행되어
화면에 "코드 실행 종료"가 출력된다.
for반복문
for num in range(1, 5):
print(num)
if num == 2:
break
print("코드 실행 종료!")1
2
코드 실행 종료!
while반복문
num = 1
while num < 5:
print(num)
if num == 2:
break
num += 1
print("코드 실행 종료!")1
2
코드 실행 종료!
반복문이 중첩된 경우에는 자신을 포함하면서 가장 가까운 반복문에만 영향을 준다.
아래 코드의 2번 줄에서 시작하는 while 반복문은 2부터 10까지의 정수를 대상으로 소수 여부에 따라 다음 일을 진행한다.
변수
n이 소수가 아닐 때n을 2의 곱으로 표현한 후에is_prime을False로 지정한 후에break명령문 실행되어for반복문 종료.이후에
n을 1 키운 다음에while반복문의 다음 경우로 넘어감.
변수
n이 소수를 가리킬 때소수임을 출력 후
n을 1 키운 후while반복문의 다음 경우로 넘어감.
n = 2
while 2 <= n < 11:
is_prime = True # 이 값이 계속 유지되면 소수임
for x in range(2, n):
if n % x == 0:
is_prime = False
print("-", n, "=", x, "*", n//x)
break
if is_prime:
print(f"{n}은 소수")
n += 1
continue
n += 12은 소수
3은 소수
- 4 = 2 * 2
5은 소수
- 6 = 2 * 3
7은 소수
- 8 = 2 * 4
- 9 = 3 * 3
- 10 = 2 * 5
9.4무한 반복과 break 명령문¶
아래 코드를 실행하면 사용자로부터 계속해서 값을 입력받으며
절대로 멈추지 않는다.
이유는 while True에서 사용된 True 표현식이 항상 참이기 때문이다.
while True:
line = input('단어입력: ')
print(line)
print('종료합니다!')만약 위 코드를 실행했다면 파이썬 실행기를 강제로 종료시키거나 컴퓨터를 꺼야 한다. 이처럼 반복문이 끝나지 않고 계속 실행되는 현상이 무한 반복infinite loop이다.
반면에 아래 코드는 사용자로부터 '중지' 단어가 입력되는 순간 반복문을 중지한다.
그런 다음 마지막 줄의 print() 함수 호출을 실행해서 프로그램의 종료를 알린다.
while True:
line = input('단어 입력: ')
if line == '중지':
break
print('입력한 단어:', line)
print('종료합니다!')단어 입력: 파이썬
입력한 단어: 파이썬
단어 입력: 좋아요!
입력한 단어: 좋아요!
단어 입력: 중지
종료합니다!