본문으로 건너뛰기

if와 else

파이썬 목차조건레슨 15 / 59

목차

if 문은 조건이 참(True)일 때만 그 아래 들여 쓴 줄들을 한 번 실행합니다. else를 붙이면 조건이 거짓(False)일 때만 실행할 다른 갈래가 생깁니다.

지금까지의 프로그램은 위에서 아래로 모든 줄을 실행해서, 나이에 따라 요금을 달리 찍거나 금액에 따라 할인을 붙일 수 없었습니다. if는 앞 레슨의 비교가 만든 True·False를 보고 실행할 줄을 고릅니다. 어느 줄이 고르는 대상에 드는지는 들여쓰기가 정합니다.

9단계 중 1단계. 1번 줄: age를 18에 붙입니다.

1if는 조건이 참일 때 덩어리를 한 번 실행한다

if 줄은 if 조건: 꼴로 씁니다. 줄 끝의 콜론(:)은 '여기부터 덩어리가 온다'는 표시입니다. 그 아래 4칸 들여 쓴 줄들이 한 덩어리(블록, block)입니다.

실행이 if 줄에 오면 조건을 한 번 계산합니다. True면 덩어리를 위에서 아래로 한 번 실행하고, False면 덩어리를 통째로 건너뜁니다. 어느 쪽이든 그다음에는 덩어리 아래의 들여 쓰지 않은 줄로 갑니다.

규칙 4. 들여쓰기가 덩어리를 정하고, if는 덩어리를 한 번 실행할지 고릅니다.

total = 14500
if total >= 10000:
    print('쿠키 증정')
    print('스탬프 2개')
print('감사합니다')
실행 결과
쿠키 증정
스탬프 2개
감사합니다

total이 9000이면 2번 줄의 조건이 False라서 3·4번 줄을 건너뛰고 감사합니다만 찍힙니다.

조건 자리에는 True·False로 접히는 것이면 무엇이든 씁니다. 비교식의 값에 붙여 둔 이름도 됩니다.

age = 25
adult = age >= 20
if adult:
    print('성인 요금')
실행 결과
성인 요금

2else는 거짓일 때만 가는 갈래

else:에는 조건을 쓰지 않고 콜론만 붙입니다. 바로 위 if의 조건이 False일 때만 else 덩어리를 실행합니다. 그래서 if 덩어리와 else 덩어리 가운데 꼭 하나만 실행됩니다.

age = 18
if age >= 20:
    print('성인')
else:
    print('청소년')
print('끝')
실행 결과
청소년
끝

age가 25면 성인과 끝이 찍힙니다. 6번 줄 print('끝')은 어느 갈래를 지났든 실행됩니다. 들여 쓰지 않아 두 덩어리 밖에 있기 때문입니다.

else 대신 반대 조건의 if를 하나 더 써도 같을까요? 두 코드가 각각 무엇을 찍을지 먼저 정해 보세요.

x = 5
if x > 3:
    x = 1
else:
    x = 9
print(x)
실행 결과 보기
실행 결과
1
x = 5
if x > 3:
    x = 1
if x <= 3:
    x = 9
print(x)
실행 결과 보기
실행 결과
9

예상과 다르면 그곳이 배울 곳입니다. 첫 코드는 2번 줄에서 조건을 한 번 보고 if 덩어리를 실행한 뒤, else 덩어리는 건너뜁니다. 둘째 코드의 4번 줄은 따로 선 if라서, 3번 줄에서 x가 1이 된 뒤에 x <= 3을 새로 계산합니다. 1은 3 이하라 True이고, x는 9가 됩니다. if·else는 두 갈래 가운데 하나를 고르고, if 두 개는 조건 둘을 따로따로 봅니다(규칙 4).

3들여쓰기가 덩어리를 정한다

파이썬에서 들여쓰기는 보기 좋으라고 하는 것이 아닙니다. 어느 줄이 덩어리에 드는지를 들여쓰기가 정합니다. 덩어리 안의 줄은 모두 같은 칸 수로 들여 씁니다. 이 과목은 공식 자습서가 권하는 4칸을 씁니다.

total = 9000
print('합계', total)
if total >= 10000:
    print('쿠키 증정')
print('감사합니다')
실행 결과
합계 9000
감사합니다

5번 줄을 4칸 들여 쓰면 무엇이 찍힐까요? 답을 정한 뒤 펼쳐 보세요.

total = 9000
print('합계', total)
if total >= 10000:
    print('쿠키 증정')
    print('감사합니다')
실행 결과 보기
실행 결과
합계 9000

예상과 다르면 그곳이 배울 곳입니다. 들여 쓴 5번 줄은 if 덩어리에 들어가서, 조건이 False인 지금은 4번 줄과 함께 건너뜁니다. 한 줄의 들여쓰기만 달라도 출력이 달라집니다.

if 줄 아래에 들여 쓴 줄이 하나도 없으면 오류가 납니다.

age = 18
if age >= 20:
print(age)
실행 결과
  File "main.py", line 3    print(age)    ^^^^^IndentationError: expected an indented block after 'if' statement on line 2

맨 아래 줄은 들여쓰기 오류(IndentationError)입니다. 2번 줄의 if 뒤에 들여 쓴 덩어리가 와야 하는데 오지 않았다는 뜻입니다. IDLE 편집 창에서는 콜론으로 끝난 줄에서 Enter를 치면 다음 줄이 저절로 4칸 들어갑니다. 덩어리를 끝낼 때는 Backspace로 들여쓰기를 지웁니다.

4오류: 콜론을 빠뜨리면

if·else 줄 끝의 콜론은 빠뜨리기 쉽습니다. 조건을 쓰다 자주 만나는 오류입니다.

age = 18
if age >= 20
    print(age)
실행 결과
  File "main.py", line 2    if age >= 20                ^SyntaxError: expected ':'

맨 아래 줄 expected ':'는 콜론(:)이 와야 할 자리에 오지 않았다는 뜻입니다. ^가 2번 줄 끝을 가리킵니다. 문법 오류는 실행하기 전에 찾아내므로, 1번 줄도 실행되지 않았습니다.

예제

합계에 따라 할인을 고릅니다. 2만 원 이상이면 2,000원을 빼고, 아니면 빼지 않습니다. 7번 줄은 들여 쓰지 않아서 어느 갈래를 지났든 낼 돈을 찍습니다.

total = 14500
if total >= 20000:
    print('할인 2,000원')
    total = total - 2000
else:
    print('할인 없음')
print(f'낼 돈 {total:,}원')
실행 결과
할인 없음
낼 돈 14,500원

자주 틀리는 곳

틀린 생각: if도 조건이 참인 동안 덩어리를 되풀이한다.

x < 3과 x = x + 1이 함께 있으면 3이 될 때까지 더해 갈 것처럼 보입니다. 실제로는 한 번 더하고 끝납니다.

x = 0
if x < 3:
    x = x + 1
print(x)
실행 결과
1

2번 줄의 0 < 3이 True라 들여 쓴 3번 줄을 한 번 실행하고, 덩어리 밖의 4번 줄로 내려갑니다. 2번 줄로 돌아가 조건을 다시 보지 않습니다.

맞는 규칙: if는 조건을 한 번 보고 덩어리를 많아야 한 번 실행한 뒤 아래로 내려갑니다. 되풀이는 5단원의 while·for가 합니다(규칙 4).

틀린 생각: else:는 반대 조건의 if를 하나 더 쓴 것과 같다.

말로는 '아니면'과 '반대 조건이면'이 같은 뜻이라 둘이 같아 보입니다. 그러나 2절의 두 코드는 else:를 if x <= 3:으로 바꾼 것뿐인데 1과 9를 찍었습니다.

둘째 코드는 3번 줄에서 x가 1이 된 뒤에 4번 줄이 조건을 새로 계산해서, 두 덩어리가 모두 실행되었습니다.

맞는 규칙: else는 바로 위 if의 조건이 거짓일 때만 실행되고, 따로 선 if는 그 줄에 왔을 때의 값으로 조건을 새로 계산합니다. 두 갈래 가운데 하나만 실행하려면 else를 씁니다(규칙 4).

틀린 생각: 조건에서도 =로 같은지 묻는다.

수학에서는 =가 '같다'라서 조건에도 그대로 쓰게 됩니다. 그러나 파이썬의 =는 대입이라, 조건 자리에 쓰면 문법 오류입니다.

x = 5
if x = 5:
    print(x)
실행 결과
  File "main.py", line 2    if x = 5:       ^^^^^SyntaxError: invalid syntax. Maybe you meant '==' or ':=' instead of '='?

힌트가 내놓은 두 가지 가운데 == 기호가 여기서 뜻한 것입니다. :=는 이 과목에서 다루지 않는 다른 문법입니다.

맞는 규칙: 파이썬에서 =는 이름을 값에 붙이는 대입이고, 같은지 묻는 것은 == 연산자입니다. 조건 자리에는 == 기호를 씁니다(규칙 2).

확인 문제

1. 예제의 total을 20000으로 바꿨습니다. 무엇이 찍히는지 줄마다 그대로 쓰세요.

total = 20000
if total >= 20000:
    print('할인 2,000원')
    total = total - 2000
else:
    print('할인 없음')
print(f'낼 돈 {total:,}원')
힌트

2번 줄에 total의 값을 넣었을 때 조건이 무엇으로 접히는지부터 보세요.

정답
실행 결과
할인 2,000원
낼 돈 18,000원

20000 >= 20000은 True라서 3·4번 줄이 실행되고 total이 18000에 다시 붙습니다. else 덩어리는 건너뜁니다.

흔한 오답은 할인 없음과 낼 돈 20,000원입니다. >= 연산자도 > 연산자처럼 '왼쪽이 큰가'만 묻는다고 본 것입니다.

2. 재고가 있으면 주문 받기를, 없으면 품절을 찍고, 어느 쪽이든 마지막에 다음 손님을 찍으려 합니다. 빈칸 둘을 채우세요.

stock = 0
if stock ___ 0:
    print('주문 받기')
___
    print('품절')
print('다음 손님')
힌트

첫 빈칸은 재고가 있을 때만 True가 되는 비교입니다. 둘째 빈칸은 조건이 거짓일 때 가는 갈래의 머리입니다.

정답

차례로 > 기호와 else:입니다.

stock = 0
if stock > 0:
    print('주문 받기')
else:
    print('품절')
print('다음 손님')
실행 결과
품절
다음 손님

0 > 0은 False라서 else 덩어리의 품절이 찍힙니다. 들여 쓰지 않은 6번 줄은 갈래와 상관없이 실행됩니다. stock을 5로 바꾸면 주문 받기와 다음 손님이 찍힙니다.

다르게 써도 되는 곳: 재고가 0보다 작아지지 않는다면 첫 빈칸에 != 기호를 써도 같습니다. 둘째 빈칸에 반대 조건의 if stock <= 0:을 써도 재고가 0일 때와 5일 때 모두 같은 줄이 찍힙니다. 다만 그 줄은 따로 선 if라서 조건을 새로 계산합니다(2절).

흔한 오답은 첫 빈칸의 >= 기호입니다. stock >= 0이 0보다 큰 재고만 고른다고 본 것입니다. 실제로는 0 >= 0이 True라서 재고가 없는데도 주문 받기가 찍힙니다. 둘째 빈칸에서 콜론을 빠뜨리면 SyntaxError: expected ':'⁠가 납니다.

3. 걸음 수 앱의 코드입니다. 무엇이 찍히는지 마지막 줄까지 그대로 쓰세요.

steps = 4000
if steps >= 10000:
    print('목표 달성')
    print('축하합니다')
print('오늘', steps, '걸음')
힌트

2번 줄의 조건이 무엇으로 접히는지 보고, 줄마다 들여쓰기를 보세요.

정답
실행 결과
오늘 4000 걸음

4000 >= 10000은 False라서 들여 쓴 3·4번 줄을 모두 건너뜁니다.

흔한 오답은 축하합니다도 찍힌다고 보는 것입니다. if 바로 아래 한 줄만 덩어리이고, 그 밑에 들여 쓴 줄은 늘 실행된다고 본 것입니다(들여쓰기는 꾸밈이라는 생각).

아래 2절 첫 코드(age는 25)의 6번 줄을 4칸 들여 쓰면 찍히는 줄을 모두 봅니다.

처음 펼 때 약 6MB를 받습니다.컴퓨터에서 해 보기

끝까지 내려오면 저절로 표시됩니다. 이 기기에만 저장합니다.

파이썬 목차로