순환

소개

아마 다음과 같은걸 본 적이 있을거예요: 우리 프로그램엔 자주 반복하는 기능이 있어요. 파이썬엔 순환 반복(용어: 반복)이라고 하는 강력한 개념이 있는데, 반복 코드 일부를 똑 떼어내는데 사용할 수 있어요! 자, 그러면 이 간단한 예제를 해보도록 해요:

for name in "John", "Sam", "Jill":
    print("Hello " + name)

무언가를 여러번 돌리고 싶을때 매우매우 도움이 돼요 — 도형의 테두리선을 각각 그릴 경우 말이죠? — 근데 동작은 단 한번에 대해서만 적고 싶을 때가 있어요. 순환 반복의 다른 버전을 보도록 할께요:

for i in range(10):
    print(i)

이제 어떻게 i 변수를 사용해서 코드 한 줄을 작성하더라도 각기 다른 10가지 값을 가질 수 있는지 볼까요?

range(n) 함수는 0, 1, 2, ..., n-1``을 짧게 줄인걸로 있어요. 알아보시려면 파이썬 쉘에서 ``help(range)``를 쳐서 도움말을 보실 있어요. :kbd:``q 키를 사용하면 도움말에서 다시 나갈 수 있어요.

여러분이 고른 요소에 대해서도 순환 반복 동작을 할 수 있어요:

total = 0
for i in 5, 7, 11, 13:
    print(i)
    total = total + i

print(total)

이 예제 코드를 그대로 작성하고 파이선으로 실행해서, 여러분이 기대한 바와 동작이 같은지 확인해보세요.

주석

위에서 어떻게 돌아가는지 보시면, 순환 반복*하는 코드 줄을 *들여쓰기 했어요. 파이선에 있어 중요한 개념이죠. 어떤 코드 줄이 for 순환 반복 구문에서 사용해야 하는지 알 수 있기도 하고, 그 다음 프로그램 나머지 부분에는 어떤 요소가 따라오는지 알 수 있기도 하죠. 코드를 들여쓰기 하려면 공백 문자 네 개(그냥 탭 키를 치세요)를 사용하세요.

어떤 경우는 일부 코드를 여러번 반복하려 하지만 i 변수 값은 신경 쓰고 싶지 않을때가 있어요. 이때는 ``_``를 대신 사용하는게 좋은 습관이 될 수 있어요. 이걸 쓰면 값이 어떤지 신경 쓰고 싶지도 않고 쓰고 싶지도 않음을 의미해요. 간단한 예를 보여드릴께요:

for _ in range(10):
    print("Hello!")

i 변수가 어떤 값을 지니고 있는지 궁금해 할 수도, 안 할 수도 있어요. 위에서는 왜 항상 사용했을까요? 흠, 간단하게 말하자면 “인덱스”를 의미하는데 대부분의 코드 어디에서든 찾을 수 있는 일반적인 변수 이름일 뿐이예요. 어떤 숫자가 아니라 다른 기준 이상으로 순환 반복을 한다면, 이름을 확인해보는게 좋아요! 가령 다음 같으면요:

for drink in list_of_beverages:
    print("Would you like a " + drink + "?")

drink 대신에 ``i``를 썼을때보다는 바로 이해하기에 확실하죠.

점선을 그려보아요

연습

점선을 그려보세요. turtle.penup() 함수를 사용해서 거북이가 선을 그리지 않고 그냥 움직이게만 할 수 있어요. 다시 그리라고 하려면 ``turtle.pendown()``을 활용하세요.

_images/dashed.png

해결책

for i in range(10):
    turtle.forward(15)
    turtle.penup()
    turtle.forward(5)
    turtle.pendown()

한 줄 한 줄 처리할 때마다 대시 길이를 더 늘릴 수 있나요?

_images/dashedprogressing.png

힌트

뭔가 부족한가요? 모든 순환 반복 실행 부분에 ``i``를 넣어보세요:

for i in range(10):
    print(i)
    # write more code here

크기를 단계적으로 늘이는데 ``i``를 활용할 수 있나요? 보통 순환 반복 변수라고 하거나 인덱스 변수라고 해요.

주석

위의 예제에서 ``#``으 시작하는 줄을 주석이라고 해요. 파이썬에서는 ``#``으로 시작하는 줄은 컴퓨터에서 무시해요. 컴퓨터에서 동작을 바꾸지 않고 프로그램이 어떤 동작을 하는지 설명하려면 주석을 활용하세요. 잠깐 동안 쉽게 코드를 비활성화 하든지 코드 일부를 “주석 처리” 해버리는데 사용할 수도 있어요.

다음 처럼 줄 끝으로 주석이 들어갈 수도 있어요:

turtle.left(20)     # tilt our next square slightly

더 효율적인 사각형

연습

이 따라하기 안내서 앞부분에 그렸던 사각형에는 선을 반복해서 그리는 코드가 많이 있었어요. 순환 반복 구문을 활용해서 사각형을 그리는 프로그램의 줄 수를 줄여 볼 수 있죠?

해결책

for _ in range(4):
    turtle.forward(100)
    turtle.left(90)

다른 순환 반복 구문의 아래()에 순환 반복 구문을 놓는 중첩 순환 반복 구문을 활용하고, 그리는 코드를 두 순환 반복 구문 안에 놓아보세요. 어떻게 보일 수 있을지 보여드릴께요:

for ...:
    for ...:
        # drawing code inside the inner loop goes here
        ...
    # you can put some code here to move
    # around after!
    ...

``...``를 여러분이 작성한 코드로 바꾸고, 어떤 재밌는 또는 흥미로운 모습을 만들어냈는지 보세요! 실수해도 좋아요!