WeniVooks

검색

견고한 파이썬

while문

1. while문

이번에는 for문과 함께 많이 사용되는 구문인 while문을 살펴보도록 합시다. while문은 조건이 참인 동안에 명령을 반복해서 수행합니다. 반복할 명령은 들여쓰기로 구분되며 조건이 거짓이면 들여쓰기로 구분되어 있는 반복 구문을 탈출합니다.

1.1. while문의 기본 구조
while 구문:
    pass # 수행할 문장
while 구문:
    pass # 수행할 문장

예제를 통해 살펴보도록 하겠습니다.

a = 1 # 연산자를 계산할수 있는 변수가 하나있고, #While문은 조건이 참이면 계속 수행 -> 무한루프(무한으로 프로그램이 돌아가게 만듬) while a < 10 : #1. for문과 차이점 - 조건이 있다. (for문은 범위가 있다.) print(a) a += 1 # (무한루프에 빠질수 있기 때문에) -> 연산자를 계산해서 조건문을 강제로 false로 만드는 구문이 있다.
Step1 : a -> 1 지정
 
Step2 : while (a = 1) < 10 -> True -> while반복문 실행
 
Step3 : print(a) -> a=1 -> 1이 출력
 
Step4 : a += 1 -> a -> 2
 
Step2-1 : a -> 2 step2,3,4가 계속 반복
 
Step10-1 : a-> 10
 
Step10-2 : a = 10 < 10 -> False -> while반복문 미실행
-> 조건문 완료!
 
# 어떨 때 쓰일까?
1. 로또번호 - 6개까지 추첨하면 끝!
2. 이벤트 -> 100명이 당첨되면 끝!
3. 제한된 마케팅 / 고객모집 / 조건!
Step1 : a -> 1 지정
 
Step2 : while (a = 1) < 10 -> True -> while반복문 실행
 
Step3 : print(a) -> a=1 -> 1이 출력
 
Step4 : a += 1 -> a -> 2
 
Step2-1 : a -> 2 step2,3,4가 계속 반복
 
Step10-1 : a-> 10
 
Step10-2 : a = 10 < 10 -> False -> while반복문 미실행
-> 조건문 완료!
 
# 어떨 때 쓰일까?
1. 로또번호 - 6개까지 추첨하면 끝!
2. 이벤트 -> 100명이 당첨되면 끝!
3. 제한된 마케팅 / 고객모집 / 조건!

변수 a에 1을 저장한 후, 변수 a가 10 미만일 때 변수 a를 출력하고 값을 1 증가시킵니다. 9까지 출력하고 마지막 a+=1이 연산(할당연산)되면 a=10이 되어 조건이 거짓이 되므로 루프를 탈출합니다. 여기서 a+=1을 하지 않으면 무한반복이 되기 때문에 주의해야 합니다.

while문은 조건을 먼저 선언해 주어야 하기 때문에, 비교적 for를 더 많이 사용합니다. 하지만 각각 자주 활용되는 구문들이 있어, 어느 문법이 좋다 할 수 없습니다.

1.2. while로 무한 반복 만들기

만약 while문의 조건이 항상 True이면 무한 반복을 만들 수 있습니다. 이 코드는 ‘무한 반복 중…’ 을 끝없이 출력합니다. 코드 실행을 중지시키려면 colab에 정지 버튼을 누르거나 Ctrl(Command)+C를 눌러 수동으로 중지시킬 수 있습니다.

while True :
    print('무한 반복 중...')
while True :
    print('무한 반복 중...')
# 출력
무한 반복 중...
무한 반복 중...
무한 반복 중...
무한 반복 중...
무한 반복 중...
...(생략)
# 출력
무한 반복 중...
무한 반복 중...
무한 반복 중...
무한 반복 중...
무한 반복 중...
...(생략)

무한 반복을 사용한 프로그램에서는 종료 조건을 명확하게 설정하여 무한 반복이 일어나지 않도록 해야 합니다.

이렇게 무한 반복이 되면 colab에서 저장하지 않는 이슈가 발생할 수 있습니다. 이럴 때에는 해당 불록을 삭제하고 런타임을 재시작한 후 Ctrl+S로 저장하세요.

1.3. 무한 반복의 활용

여러분이 사용하는 OS도 무한 반복 중입니다. 사용자가 정지시키지 않는 한이요. 아래와 같이 간단한 쉘 프로그래밍을 해볼 수 있습니다. 쉘이란 사용자의 명령어를 해석하여 운영체제가 이를 수행할 수 있도록 지시해주는 프로그램입니다. 통상적으로 pwd는 현재 위치를 출력하고, ls는 현재 폴더와 파일명을 출력합니다.

window의 powershell
window의 명령 프롬프트
git bash

이를 구현한 예제를 살펴보도록 하겠습니다.

# colab에서도 작동되지만 가능하면 .py파일로 작성해서 실행해보세요.
import os
 
while True:
    userinput = input('>')
    if userinput == 'pwd':
        # print('현재 위치 출력')
        # print('\\'.join(__file__.split('\\')[:-1]))
        print(os.getcwd())
    elif userinput == 'dir' or userinput == 'ls':
        # print('현재 폴더에 폴더와 파일명 출력')
        print(os.listdir(os.getcwd()))
    elif userinput == 'exit':
        print('안녕히가세요.')
        break
# colab에서도 작동되지만 가능하면 .py파일로 작성해서 실행해보세요.
import os
 
while True:
    userinput = input('>')
    if userinput == 'pwd':
        # print('현재 위치 출력')
        # print('\\'.join(__file__.split('\\')[:-1]))
        print(os.getcwd())
    elif userinput == 'dir' or userinput == 'ls':
        # print('현재 폴더에 폴더와 파일명 출력')
        print(os.listdir(os.getcwd()))
    elif userinput == 'exit':
        print('안녕히가세요.')
        break
# 출력
>pwd
/content
>ls
['.config', 'sample_data']
>exit
안녕히가세요.
# 출력
>pwd
/content
>ls
['.config', 'sample_data']
>exit
안녕히가세요.

아래는 무한 반복을 이용한 업다운 게임입니다. 여기서는 random이라는 모듈을 사용했습니다. random은 난수를 생성해주는 모듈입니다.

import random
 
answer = random.randint(1, 1000)
while True:
    userinput = int(input('숫자를 입력해주세요.'))
    if userinput > answer:
        print('Down')
 
    elif userinput < answer:
        print('Up')
    else:
        print('축하합니다! 맞추셨어요!')
        break
import random
 
answer = random.randint(1, 1000)
while True:
    userinput = int(input('숫자를 입력해주세요.'))
    if userinput > answer:
        print('Down')
 
    elif userinput < answer:
        print('Up')
    else:
        print('축하합니다! 맞추셨어요!')
        break

컴퓨터는 완벽한 난수를 생성할 수는 없습니다. 난수도 어떠한 규칙이 있다는 것이죠.

2. 중첩 while문

for문과 동일하게 중첩된 while문으로 구구단을 출력해보도록 하겠습니다.

i = 2 while i < 10 : j = 1 while j < 10: print(f'{i} X {j} = {i * j}') j += 1 i += 1

구구단은 2단부터 시작하기에 변수 i를 2로 설정해줍니다. 9단을 수행한 후 종료할 수 있도록 10 미만이라는 조건을 설정해주었습니다. i는 구구단의 단을, k는 순차적으로 반복될 곱의 수이며 while문을 하나 더 이용하여 반복될 곱의 수를 1씩 순차적으로 더해주었습니다.

여기서 중요한 것은 종료되는 값입니다. k가 10이 된 상태로 안에 반복문이 종료되기 때문에 3단을 하기 위해서는 다시 k를 1로 초기화 시켜주어야 합니다.

아래 코드를 실행하면 2단만 출력되는 것을 확인할 수 있습니다. 위 구구단과 비교해보세요.

i = 2
while i < 10 :
    while j < 10:
        print(f'{i} X {j} = {i * j}')
        j += 1
    i += 1
i = 2
while i < 10 :
    while j < 10:
        print(f'{i} X {j} = {i * j}')
        j += 1
    i += 1

3. 왈러스(Walrus, :=) 연산자

Python 3.8에서 도입된 왈러스 연산자( := )는 할당 표현식(assignment expressions)를 사용하게 해주는 연산자입니다. 왈러스는 한국어로 바다코끼리입니다.

이 연산자는 반복을 하기 전 본문을 한 번 실행해야 하는 '순환과 절반(loop and a half)'이라는 패턴을 피할 수 있게 해줍니다.

data = call_some_function()
print(data)
while data:
    data = call_some_function()
    print(data)
data = call_some_function()
print(data)
while data:
    data = call_some_function()
    print(data)

위 코드는 data를 초기화 해주기 위해서라도 앞에서 한 번 실행해야 합니다. 왈러스 연산자를 사용하면 아래와 같이 코드를 작성할 수 있습니다.

while data := call_some_function():
    print(data)
while data := call_some_function():
    print(data)

아래 예시를 보며 설명드리도록 하겠습니다.

3.1 왈러스 연산자 기본 사용법
x = (n := 10) * 2 print(x) # 출력: 20 print(n) # 출력: 10

(n := 10)은 10을 n에 할당하고, 그 값을 10으로 평가하여 반환합니다. 따라서 x는 20을, n은 10을 할당받게 됩니다.

3.2 while loop에서의 활용

x의 값을 랜덤으로 생성하고 x가 7일 경우 멈추는 코드입니다. 왈러스 연산자 사용한 코드와 안한 코드의 차이를 보도록 하겠습니다.

  • 왈러스 연산자 미사용
import random while True: x = random.randint(0, 10) if x == 7: break print(x)
  • 왈러스 연산자 사용
import random while (x := random.randint(0, 10)) != 7: print(x)

왈러스 연산자를 사용하면, random.randint(0, 10)을 한 번만 호출하면서 결과를 x에 할당하고 그 값을 조건에 바로 사용할 수 있습니다.

왈러스 연산자는 while문 또는 if문에서도 사용이 가능합니다.

def 시그마(n): count = 0 result = 0 while (count := count + 1) < n + 1: result += count return result if (합 := 시그마(100)) == 5050: print('5050이 출력되었습니다.') else: print('1부터 정수형태로 입력이 가능합니다.') print(합 + 1000)
3.3 왈러스 연산자 주의사항

코드의 가독성을 위해 복잡한 표현식 내에서 왈러스 연산자의 남용을 피해야 합니다. 복잡한 한 줄 코드보다는 여러 줄에 걸친 명확한 코드가 유지보수와 이해(가독성)에 더 좋을 수 있습니다.

{"packages":["numpy","pandas","matplotlib","lxml"]}
9.1 for문9.3 break, continue, pass 비교