while 반복문
- -
지금까지 for 반복문을 사용하여 'Hello, world!'를 100번 출력해보았습니다. 이번에는 while 반복문에 대해 알아보겠습니다.
while 반복문은 조건식으로만 동작하며 반복할 코드 안에 조건식에 영향을 주는 변화식이 들어갑니다.
i = 0 # 초기식
while i < 100: # while 조건식
print('Hello, world!') # 반복할 코드
i += 1 # 변화식
다음은 while 반복문의 실행 과정입니다. 먼저 초기식부터 시작하여 조건식을 판별합니다. 이때 조건식이 참(True)이면 반복할 코드와 변화식을 함께 수행합니다. 그리고 다시 조건식을 판별하여 참(True)이면 코드를 계속 반복하고, 거짓(False)이면 반복문을 끝낸 뒤 다음 코드를 실행합니다.
▼ 그림 17-1 while 반복문의 동작 과정
여기서는 조건식 → 반복할 코드 및 변화식 → 조건식으로 순환하는 부분이 루프(loop)입니다.
17.1 while 반복문 사용하기
다음과 같이 while 반복문은 조건식을 지정하고 끝에 :(콜론)을 붙인 뒤 다음 줄에 반복할 코드와 변화식을 넣습니다. 초기식은 특별한 것이 없고 보통 변수에 값을 저장하는 코드입니다.
초기식
while 조건식:
반복할 코드
변화식
while 다음 줄에 오는 코드는 반드시 들여쓰기를 해줍니다.
이제 while 반복문으로 'Hello, world!'를 100번 출력해보겠습니다.
>>> i = 0
>>> while i < 100:
... print('Hello, world!')
... i += 1
...
Hello, world!
... (생략)
Hello, world!
Hello, world!
Hello, world!
SyntaxError: invalid syntax: while 반복문의 형식을 지키지 않았을 때 발생하는 구문 에러입니다. while 끝에 :(콜론)을 빠뜨리지 않았는지 확인해주세요.
SyntaxError: expected an indented block: while 다음 줄에 오는 반복할 코드의 들여쓰기가 맞지 않아서 발생하는 구문 에러입니다. 반복할 코드와 변화식에서 들여쓰기 4칸을 했는지 확인해주세요.
먼저 while 반복문에 사용할 변수 i에 0을 할당합니다. 그리고 while에는 조건식만 지정하면 됩니다. 특히 while 반복문은 반복할 코드 안에 변화식을 지정해야 합니다. 만약 조건식만 지정하고 변화식을 생략하면 반복이 끝나지 않고 계속 실행(무한 루프)되므로 주의해야 합니다.
▼ 그림 17-2 while 반복문의 기본 형태
i < 100과 같이 조건식을 지정하여 i가 100 미만일 때만 반복하고, i가 100이 되면 반복을 끝내도록 만들었습니다. 그리고 반복할 코드의 변화식에는 i += 1로 i를 1씩 증가시켰으므로 i가 0부터 99까지 증가하면서 100번 반복하게 됩니다. 물론 변화식 i += 1을 풀어서 i = i + 1로 만들어도 동작은 같습니다.
17.1.1 초깃값을 1부터 시작하기
이번에는 i에 0이 아닌 1을 할당하여 'Hello, world!'를 100번 출력해보겠습니다.
>>> i = 1
>>> while i <= 100:
... print('Hello, world!', i)
... i += 1
...
Hello, world! 1
Hello, world! 2
Hello, world! 3
... (생략)
Hello, world! 99
Hello, world! 100
i에 1을 넣었으므로 while의 조건식은 i <= 100과 같이 지정합니다. 따라서 i가 1부터 100까지 증가하므로 100번 반복하게 됩니다. 만약 i가 101이 되면 i <= 100은 거짓( False)이므로 반복문을 끝냅니다.
17.1.2 초깃값을 감소시키기
지금까지 초깃값을 증가시키면서 루프를 실행했습니다. 반대로 초깃값을 크게 주고, 변수를 감소시키면서 반복할 수도 있습니다. 다음은 100부터 1까지 100번 반복합니다.
>>> i = 100
>>> while i > 0:
... print('Hello, world!', i)
... i -= 1
...
Hello, world! 100
Hello, world! 99
Hello, world! 98
... (생략)
Hello, world! 2
Hello, world! 1
100부터 1까지 반복해야 하므로 먼저 i에 100을 할당합니다. 그다음에 while의 조건식은 i > 0과 같이 지정하여 1까지만 반복하도록 만듭니다. 또한, 변화식을 i -= 1로 지정하여 변수의 값을 감소시킵니다. 이렇게 하면 i가 100부터 1까지 감소하면서 반복합니다. 만약 i가 0이되면 i > 0은 거짓(False)이므로 반복문을 끝냅니다.
17.1.3 입력한 횟수대로 반복하기
이번에는 입력한 횟수대로 반복을 해보겠습니다. 다음 내용을 IDLE의 소스 코드 편집 창에 입력하세요.
while_input_increment.py
count = int(input('반복할 횟수를 입력하세요: '))
i = 0
while i < count: # i가 count보다 작을 때 반복
print('Hello, world!', i)
i += 1
소스 코드를 실행하면 '반복할 횟수를 입력하세요: '가 출력됩니다. 여기서 3을 입력하고 엔터 키를 누르세요.
실행 결과
반복할 횟수를 입력하세요: 3 (입력)
Hello, world! 0
Hello, world! 1
Hello, world! 2
input으로 입력 값을 받아서 count 변수에 저장했습니다. 그리고 i에는 0을 할당하고, while 반복문의 조건식에서 i < count와 같이 지정하여 count에 들어있는 값만큼 반복하도록 만들었습니다. 여기서는 3를 입력했으므로 'Hello, world!'는 3번만 출력됩니다.
이번에는 초깃값을 받은 뒤 초깃값만큼 출력해보겠습니다.
while_input_decrement.py
count = int(input('반복할 횟수를 입력하세요: '))
while count > 0: # count가 0보다 클 때 반복
print('Hello, world!', count)
count -= 1 # count를 1씩 감소시킴
실행 결과
반복할 횟수를 입력하세요: 3 (입력)
Hello, world! 3
Hello, world! 2
Hello, world! 1
input으로 입력 값을 받아서 count 변수에 저장했습니다. 그리고 조건식에서 count > 0와 같이 지정하여 count에 들어있는 값만큼 반복하도록 만들었습니다. 여기서는 변수 i 대신 count를 바로 사용하므로 변화식을 count -= 1로 지정하여 반복할 때마다 count를 감소시키고 count가 0이 되면 반복문을 끝냅니다.
지금까지 조건식에서 반복 횟수를 정한 뒤 변수 i를 증가시키거나 감소시켜서 while 반복문을 사용했습니다. 하지만 while 반복문은 반복 횟수가 정해지지 않았을 때 주로 사용합니다.
이번에는 난수를 생성해서 숫자에 따라 반복을 끝내 보겠습니다. 난수(random number)란 특정 주기로 반복되지 않으며 규칙 없이 무작위로 나열되는 숫자를 뜻합니다. 현실에서 쉽게 접할 수 있는 난수가 바로 주사위를 굴려서 나온 숫자입니다.
▼ 그림 17-3 주사위
파이썬에서 난수를 생성하려면 random 모듈이 필요합니다. 모듈은 다음과 같이 import 키워드를 사용하여 가져올 수 있습니다(모듈은 'Unit 44 모듈과 패키지 사용하기'에서 자세히 설명 하겠습니다).
- import 모듈
import random # random 모듈을 가져옴
이제 random.random()으로 random 모듈의 random 함수를 호출해봅니다.
>>> random.random()
0.002383731799935007
>>> random.random()
0.3297914484498006
>>> random.random()
0.6923390064955324
random.random()을 실행할 때마다 계속 다른 실수가 출력되죠? 바로 이 숫자가 바로 난수입니다.
우리는 숫자를 좀 더 알아보기 쉽도록 정수를 생성하는 random 모듈의 randint 함수를 사용해보겠습니다. 다음과 같이 randint 함수는 난수를 생성할 범위를 지정하며, 범위에 지정한 숫자도 난수에 포함됩니다.
- random.randint(a, b)
그럼 randint 함수로 주사위를 만들어보겠습니다. 보통 정육면체 주사위는 1부터 6까지 숫자가 있죠? 따라서 random.randint(1, 6)처럼 1과 6을 넣으면 1과 6 사이의 난수가 생성됩니다.
>>> random.randint(1, 6)
4
>>> random.randint(1, 6)
1
>>> random.randint(1, 6)
5
random.randint(1, 6)을 실행할 때마다 다른 숫자가 나옵니다. 이제 이 함수를 while 반복문에 사용해보겠습니다.
다음은 1과 6 사이의 난수를 생성한 뒤 3이 나오면 반복을 끝냅니다. 그냥 3이 나올 때까지 주사위를 계속 던지는 행동과 같습니다.
while_random.py
import random # random 모듈을 가져옴
i = 0
while i != 3: # 3이 아닐 때 계속 반복
i = random.randint(1, 6) # randint를 사용하여 1과 6 사이의 난수를 생성
print(i)
실행 결과
5
1
4
1
1
3
while 반복문에서 i != 3과 같이 조건식을 지정하여 3이 아닐 때 계속 반복하도록 만듭니다. 그리고 반복할 코드에서 i = random.randint(1, 6)과 같이 1과 6 사이의 난수를 생성하여 변수 i에 저장합니다.
이제 이 코드를 여러 번 실행해봅니다. 실행 결과를 보면 정수가 무작위로 생성되어 실행할 때마다 반복 횟수가 달라지는 것을 볼 수 있습니다. 이처럼 while 반복문은 반복 횟수가 정해져 있지 않을 때 유용합니다.
random.choice 함수를 사용하면 시퀀스 객체에서 요소를 무작위로 선택할 수 있습니다. 다음은 1, 2, 3, 4, 5, 6이 들어있는 리스트에서 무작위로 숫자를 선택합니다.
random.choice(시퀀스객체)
>>> dice = [1, 2, 3, 4, 5, 6]
>>> random.choice(dice)
1
>>> random.choice(dice)
4
>>> random.choice(dice)
3
물론 random.choice 함수는 시퀀스 객체를 받으므로 리스트뿐만 아니라 튜플, range, 문자열 등을 넣어도 됩니다.
이번에는 while 반복문으로 무한 루프를 만들어보겠습니다.
while_infinite_loop.py
while True: # while에 True를 지정하면 무한 루프
print('Hello, world!')
실행 결과
... (생략)
Hello, world!
Hello, world!
Hello, world!
Hello, world!
... (계속 반복)
NameError: name 'true' is not defined: True는 첫 글자만 대문자입니다. T를 소문자로 입력하지 않았는지, 전부 대문자로 입력하지 않았는지 확인해주세요.
while에 조건식 대신 True를 지정하면 무한히 반복하는 무한 루프가 만들어집니다. 따라서 조건식이 항상 참(True)이므로 변화식도 필요 없습니다.
이 스크립트 파일을 실행한 상태로 두면 'Hello, world!'는 끝나지 않고 계속 출력됩니다. 따라서 IDLE이나 콘솔(터미널, 명령 프롬프트)에서 Ctrl+C를 입력하여 무한 루프를 끝냅니다.
while에 True 대신 True로 취급하는 값을 사용해도 무한 루프로 동작합니다.
while 1: # 0이 아닌 숫자는 True로 취급하여 무한 루프로 동작
print('Hello, world!')
while 'Hello': # 내용이 있는 문자열은 True로 취급하여 무한 루프로 동작
print('Hello, world!')
지금까지 while 반복문에 대해 알아보았습니다. while 반복문은 조건식이 참(True)일 때 반복하고 거짓(False)일 때 반복을 끝냅니다. 특히 while 반복문은 반복 횟수가 정해져 있지 않을 때 자주 사용하므로 이 부분을 꼭 기억해두세요. 반면 for 반복문은 반복 횟수가 정해져 있을 때 자주 사용합니다. 그러므로 for와 while의 차이점을 정확히 익혀 두고 적절한 곳에 사용하는 것이 좋습니다.
'개인공부 > Python' 카테고리의 다른 글
python 심사문제 UNIT(22 ~ 24) (0) | 2022.07.27 |
---|---|
python 심사문제 UNIT(13 ~ 21) (0) | 2022.07.26 |
for 반복문 (0) | 2022.07.26 |
딕셔너리 사용하기 (0) | 2022.07.25 |
시퀀스 자료형 활용하기 (0) | 2022.07.25 |
소중한 공감 감사합니다