조건 순환 반복

소개

조건 순환 반복은 각각의 경우에 조건이 만족하거나 **True**일 때 어떤 동작을 반복하는 방법이예요. 상태가 항상 만족한다면(**False**가 되지 않는다면), 순환 반복은 끝남이 없을 수 있어요. False 조건으로 시작하면 순환 반복 구문 안의 코드는 실행되지 않아요! 파이썬에서는 조건 순환 반복 구문을 while 구문으로 정의해요:

word = ''
sentence = ''
print('Please enter some words.')
print('Include a period (.) when you are finished.')
while '.' not in word:
    word = input('next word: ')
    sentence = word + ' ' + sentence
print()
print('Aha! You said:')
print(sentence)

이 코드 일부를 ‘조건문’ 이라고 해요: '.' 단어에 없어요

조건문이 True를 반환하느냐 마느냐에 따라 while 순환 반복 구문 안에 있는 코드를 실행할지 말지를 결정해요.

위의 코드를 보고, 어떤 동작을 할 지 머릿속에 정리해본 내용을 확인해보세요(마지막 결과가 어떻게 될지요).

그 다음 파일에 복사해넣고 :file:`sentence.py`를 불러서 실행해보세요. 정확하게 어떤 동작을 하는지 보세요. 생각한대로 동작하나요?

주석

파이썬 2를 사용하면, 프로그램을 올바르게 돌아가게 하려면 ``input``을 ``raw_input``으로 바꾸셔야 해요.

거북이 감옥

연습

The turtle has been up to its usual tricks again, robbing liquor stores and building up huge gambling debts. It’s time for turtle to be put into a cell that it can’t get out of.

forward()``를 새로 짜기로 해요. 새로 작성한 함수는 거북이가 원점으로부터 100 이상 가면 돌아오게 합니다. ``while 순환 반복 구문과 몇가지 거북이 함수가 필요해요:

  • turtle.distance(0,0) - 원점으로부터 거북이까지의 거리예요

  • turtle.towards(0,0) - 거북이가 놓인 방향을 바로 설정해요

  • turtle.setheading(angle) - 원점으로부터의 각도예요

인터프리터에서 거북이를 가지고 놀아볼 수 있고, 원할 경우 함수를 이용하여 거북이가 어떤 행동을 하는지 확인해볼 수 있어요.

거북이 함수를 사용해서 감옥 로직을 구현해야 할텐데요. 아마 while 순환 반복 구문과 약간의 상태 로직을 사용하면 될거예요. 좀 늘어날텐데 그냥 그대로 두세요! 도우미나 다른 학생과 이야기하는걸 두려워하지 마세요.

해결책

def forward(distance):
    while distance > 0:
        if turtle.distance(0,0) > 100:
            angle = turtle.towards(0,0)
            turtle.setheading(angle)
        turtle.forward(1)
        distance = distance - 1

원 그리기

순환 반복 구문은 ``break``문으로 멈출 수 있어요. 조건이 항상 **True**인 순환 반복이 존재하는 무한 순환 반복 구문을 작성했을때 특히 쓸모가 있어요.

연습

while 순환 반복 구문에 원을 그릴때 조건문이 항상 **True**가 되도록 작성하세요. 가운데에서 일정 거리에 도달하면 순환 반복 구문을 멈추세요. 원점으로부터 x``와 ``y 좌표로 정의한 점까지의 거리를 가져오려면 turtle.distance(x, y) 함수를 사용하세요.

이 동작을 취하려면 거북이의 X축 Y축 각각의 위치를 반환하는 turtle.xcor()turtle.ycor() 함수가 필요해요.

주석

원을 그리려면 거북이가 상수값에 따라 돌아야 하고 값 증가에 따라 앞으로 이동해야 해요.

해결책

def draw_spiral(radius):
    original_xcor = turtle.xcor()
    original_ycor = turtle.ycor()
    speed = 1
    while True:
        turtle.forward(speed)
        turtle.left(10)
        speed += 0.1
        if turtle.distance(original_xcor, original_ycor) > radius:
            break

이 순환 반복 구문에 조건문을 넣어서 while True 또는 ``break``를 사용한 무한 순환 반복 구문이 필요없게 할 수 있나요? 어떤 버전이 쉽게 이해할 수 있는 버전일까요?