← 이전 | 목록 | 다음 →

반복문

반복문이란, 같은 걸 여러 번 반복하는 문입니다.

같은 걸 여러 번 반복하는 문입니다.

같은 걸 여러 번 반복하는 문입니다.

…아, 이 개그 벌써 세 번째 우려먹었네요. 반복문은 이럴 때 쓰는 겁니다. 사람이 직접 손으로 세 번 타이핑할 필요가 없게요.

지난 강의 마지막에 예고했던 그대로입니다. 컴퓨터한테 “이거 열 번 해” 하면 열 번 하고, “천 번 해” 하면 천 번 합니다. 불평도 안 합니다. 회사에서 이런 직원 구합니다.

파이썬의 반복문은 두 가지입니다. while이랑 for.

while

while은 “~하는 동안”이라는 뜻입니다. 조건이 참인 동안 계속 반복합니다.

count = 0

while count < 3:
    print(count)
    count += 1

결과:

0
1
2

한 줄씩 뜯어봅시다.

  1. count가 0입니다. count < 3은 참입니다. 그래서 실행됩니다. 0 출력하고, count를 1 늘립니다.
  2. count가 1입니다. 아직 count < 3은 참입니다. 1 출력하고, count를 또 늘립니다.
  3. count가 2입니다. 여전히 참입니다. 2 출력하고, count가 3이 됩니다.
  4. count가 3입니다. count < 3은 이제 거짓입니다. 반복 끝.

if랑 생긴 건 똑같습니다. 콜론 쓰고, 들여쓰기 하고. 다른 점은 딱 하나, 조건이 참이면 끝나지 않고 계속 돌아간다는 겁니다.

무한 루프

만약 count += 1을 깜빡했다면 어떻게 될까요?

count = 0

while count < 3:
    print(count)

결과:

0
0
0
0
0
0
(계속...)

count가 절대 3이 안 되니까, 조건이 영원히 참입니다. 이걸 무한 루프라고 부릅니다.

컴퓨터는 여러분이 실수했다는 걸 모릅니다. 그냥 시킨 대로 영원히 합니다. 마치 알람을 끄고 다시 잘 때, 알람이 여러분이 피곤한 걸 신경 안 쓰는 것과 같습니다.

멈추고 싶으면 터미널에서 Ctrl+C를 누르세요. 이건 파이썬 문법이 아니라 여러분을 구원하는 손동작입니다. 외워두세요.

일부러 무한 루프 만들기

가끔은 일부러 무한하게 돌리고 싶을 때가 있습니다.

while True:
    print("계속 돕니다")

True는 절대 False가 안 되니까, 이건 영원히 돕니다. 방금 배운 실수를 이번엔 일부러 저지르는 겁니다. 인간은 실수에서 배워서 그걸 다시 써먹습니다. 대단하죠.

당연히 이것도 Ctrl+C로 멈춰야 합니다. 아니면 곧 배울 break로요.

break

반복을 강제로 끝내고 싶을 때 break를 씁니다. 비상 탈출 버튼입니다.

count = 0

while True:
    print(count)
    count += 1
    if count == 3:
        break

결과:

0
1
2

count가 3이 되는 순간, if 조건이 참이 되고, break가 실행되면서 while True의 무한 루프를 탈출합니다.

방금 배운 if가 여기서도 나옵니다. 06강이 이래서 있던 겁니다.

continue

반복을 끝내는 게 아니라, 이번 한 번만 건너뛰고 싶을 때는 continue를 씁니다.

count = 0

while count < 5:
    count += 1
    if count == 3:
        continue
    print(count)

결과:

1
2
4
5

count가 3일 때만 continue가 실행돼서, print(count)를 건너뛰고 다음 반복으로 갑니다. 그래서 3만 쏙 빠집니다.

break는 “그만 나가”, continue는 “이번만 패스”입니다. 헷갈리면 회사 다닐 때를 생각하세요. break는 퇴사, continue는 월차입니다.

for

while은 “언제 멈출지”를 여러분이 매번 챙겨야 합니다. 근데 리스트를 처음부터 끝까지 훑는 것처럼, “몇 번 반복할지 이미 정해진” 경우가 훨씬 많습니다.

그럴 때 쓰라고 있는 게 for입니다.

items = ["foo", "bar", "baz"]

for item in items:
    print(item)

결과:

foo
bar
baz

items 안에 있는 값을 하나씩 꺼내서, item이라는 변수에 넣고, 그때마다 아래 코드를 실행합니다. 리스트에 요소가 3개면 딱 3번 돕니다. count를 직접 세지 않아도 됩니다. 파이썬이 대신 세줍니다. 효도입니다.

in이 여기 또 나왔습니다. 05강에서 “멤버십 연산자”라고 배운 그 in이랑 똑같이 생겼죠? 실은 여기서 쓰는 in은 문법이 살짝 다른 놈인데, 헷갈리라고 일부러 똑같이 생기게 만들었습니다. (진짜입니다. 마법이 아니라 그냥 파이썬이 좀 짓궂습니다.)

range()로 숫자 반복하기

숫자를 0부터 몇 번 세고 싶을 때, 리스트를 직접 만들 필요 없이 range()를 씁니다.

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

결과:

0
1
2
3
4

range(5)는 0, 1, 2, 3, 4를 순서대로 내놓습니다. 5는 안 나옵니다. 04강에서 리스트 번호가 0부터 시작한다고 배운 거 기억나세요? 그 정신을 여기서도 계승합니다. 파이썬은 일관성 있게 사람 헷갈리게 합니다.

시작 숫자를 정해줄 수도 있습니다.

for i in range(2, 5):
    print(i)

결과:

2
3
4

2부터 시작해서 5 직전까지입니다. 5는 여전히 안 나옵니다. 여러분 잘못이 아닙니다. 파이썬이 그렇습니다. 받아들이십시오. (04강에서 이미 한 번 들은 말이죠. 복습입니다.)

몇 칸씩 건너뛸지도 정할 수 있습니다.

for i in range(0, 10, 2):
    print(i)

결과:

0
2
4
6
8

시작, 끝, 그리고 얼마씩 건너뛸지. 이 세 번째 숫자를 간격(step)이라고 부릅니다. 안 쓰면 기본값으로 1칸씩 갑니다.

for에서 break, continue

while에서 배운 break, continue는 for에서도 똑같이 씁니다.

for i in range(10):
    if i == 3:
        break
    print(i)

결과:

0
1
2

한번 배운 건 어디서든 씁니다. 이래서 학교에서 구구단을 외우게 하는 겁니다.

중첩 반복문

06강에서 if 안에 if를 넣었던 것처럼, for 안에 for도 넣을 수 있습니다.

for i in range(3):
    for j in range(2):
        print(i, j)

결과:

0 0
0 1
1 0
1 1
2 0
2 1

바깥쪽 for가 한 번 돌 때마다, 안쪽 for가 처음부터 끝까지 다 돕니다. 그래서 총 3 × 2 = 6번 출력됩니다.

곱셈 나온 김에 말씀드리면, 구구단 표가 딱 이 모양입니다. 이 코드의 범위를 range(2, 10)과 range(1, 10)으로 바꾸고 print(i * j)를 넣으면 여러분은 방금 구구단 프로그램을 만든 겁니다. 초등학교 때 외웠던 그걸 이제 코드로 대신 외우게 시킬 수 있습니다. 발전입니다.

while vs for, 뭘 언제 쓰나요

헷갈리면 그냥 아무거나 쓰세요. 대부분 둘 다 어떻게든 됩니다. (사실 안 됩니다. 근데 지금 알려드리면 머리 아프실 겁니다. 나중에 압시다.)

결론

오늘은 반복문을 배웠습니다.

while도 배웠고, 무한 루프도 (실수로 그리고 일부러) 만들어봤고, break도 배웠고, continue도 배웠고, for도 배웠고, range()도 배웠고, 중첩 반복문까지 배웠습니다.

같은 걸 여러 번 반복하는 문을 배우면서, 정작 설명은 하나도 안 반복했습니다. (거짓말입니다. “마법입니다”는 또 나올 겁니다.)

마법입니다.

주님이 선물해주신 구원과도 같은 보너스 수업

아까 지나가는 말로 구구단 얘기를 했었죠. 그냥 지나가긴 아쉬우니, 여기서 진짜로 만들어봅시다. 은혜받고 가십시오.

목표는 이겁니다.

2 x 1 = 2
2 x 2 = 4
2 x 3 = 6
...
2 x 9 = 18

일단 2단만 만들어봅시다. for랑 range()를 씁니다.

for i in range(1, 10):
    print(2, "x", i, "=", 2 * i)

결과:

2 x 1 = 2
2 x 2 = 4
2 x 3 = 6
2 x 4 = 8
2 x 5 = 10
2 x 6 = 12
2 x 7 = 14
2 x 8 = 16
2 x 9 = 18

print()에 쉼표로 여러 개를 넣으면, 파이썬이 알아서 띄어쓰기까지 넣어서 이어붙여줍니다. 이것도 마법입니다. (나중에 설명하겠다고 안 하겠습니다. 그냥 마법으로 남겨두겠습니다.)

이제 2단만 하지 말고, 2단부터 9단까지 전부 만들어봅시다. 아까 배운 중첩 반복문을 그대로 씁니다.

for dan in range(2, 10):
    for i in range(1, 10):
        print(dan, "x", i, "=", dan * i)

결과:

2 x 1 = 2
2 x 2 = 4
...
2 x 9 = 18
3 x 1 = 3
3 x 2 = 6
...
9 x 9 = 81

바깥쪽 for가 단(2, 3, 4, …, 9)을 하나씩 정하고, 안쪽 for가 그 단을 1부터 9까지 곱합니다. 아까 예로 든 “3 × 2 = 6번 출력”이 여기선 8단 × 9번 = 72번 출력으로 커진 것뿐입니다.

단 사이를 좀 구분해주고 싶으면, 06강에서 배운 if도 여기 끼얹을 수 있습니다.

for dan in range(2, 10):
    for i in range(1, 10):
        print(dan, "x", i, "=", dan * i)
    if dan != 9:
        print("-----")

결과:

2 x 1 = 2
...
2 x 9 = 18
-----
3 x 1 = 3
...
9 x 9 = 81

if dan != 9는 “9단이 아니면”이라는 뜻입니다. 마지막 9단 뒤에는 구분선을 안 넣으려고 조건을 걸었습니다. 세심하죠? 사실 이거 안 넣어도 아무도 안 죽습니다. 그냥 보기 좋으라고 하는 겁니다.

초등학교 때 이거 종이에 손으로 72번 쓰면서 외웠던 걸, 이제 여러분은 코드 다섯 줄로 컴퓨터한테 시킵니다. 이게 프로그래밍입니다. 게으름을 코드로 승화시키는 예술입니다.

이제 08강으로 넘어가십시오(함수를 배울 것입니다. 드디어 여러분도 마법을 직접 만들 차례입니다).

← 이전 | 목록 | 다음 →