if 문은 조건이 참(True)일 때만 그 아래 들여 쓴 줄들을 한 번 실행합니다. else를 붙이면 조건이 거짓(False)일 때만 실행할 다른 갈래가 생깁니다.
지금까지의 프로그램은 위에서 아래로 모든 줄을 실행해서, 나이에 따라 요금을 달리 찍거나 금액에 따라 할인을 붙일 수 없었습니다.
if는 앞 레슨의 비교가 만든 True·False를 보고 실행할 줄을 고릅니다. 어느 줄이 고르는 대상에 드는지는 들여쓰기가 정합니다.
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)
실행 결과 보기
1x = 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)
12번 줄의 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를 받습니다.컴퓨터에서 해 보기
파이썬 3.14. Tab을 누르면 다음 단추나 칸으로 갑니다. 들여쓰기는 빈칸 네 개입니다. Enter는 앞줄 들여쓰기를 잇고, 콜론 뒤에서는 한 단계 더 들여 씁니다. Ctrl+Enter로 실행합니다.
'실행'을 누르면 여기에 나옵니다.
여기서 쓴 코드 · 내 예상은 저장하지도 운영자에게 보내지도 않습니다. 페이지를 새로 열면 처음 코드입니다.