파이썬은 +·-·*·/로 사칙 계산을 합니다. 나누기 /는 늘 실수를 내고, 나눗셈의 몫은 //, 나머지는 %로 따로 구합니다.
거스름돈 7300원을 천 원짜리 몇 장과 남는 돈으로 나눠 준다고 해 봅시다. 계산기처럼 7300을 1000으로 나누면 7.3이 나올 뿐, '7장과 300원'은 나오지 않습니다. 몫과 나머지를 따로 구하는 연산이 필요합니다. 계산 결과도 값이라 종류가 있습니다. 같은 나눗셈이 정수를 내는지 실수를 내는지 가려 읽어야 출력을 글자 그대로 쓸 수 있습니다.
1사칙 계산과 계산 차례
+는 더하기, -는 빼기, *는 곱하기, /는 나누기입니다. 곱하기 기호는 ×가 아니라 별표 *입니다.
연산이 섞이면 수학과 같은 차례로 계산합니다. 괄호 안이 먼저, 그다음 곱하기·나누기, 마지막이 더하기·빼기이고, 같은 차례끼리는 왼쪽부터입니다.
print(4000 + 4500)
print(10000 - 4000 * 2)
print((10000 - 4000) * 2)
print(10 - 4 - 3)
8500
2000
12000
32번 줄은 4000 * 2를 먼저 해 8000을 만든 뒤 10000에서 뺍니다. 3번 줄은 괄호 안을 먼저 계산해 6000에 2를 곱합니다. 4번 줄은 왼쪽부터 10 - 4가 6, 6 - 3이 3입니다.
어떤 식이든 이 차례로 끝까지 계산된 뒤 값 하나가 됩니다(규칙 2).
거듭제곱은 **입니다. 2 ** 3은 2를 세 번 곱한 8이고, 곱하기보다 먼저 계산합니다. **끼리는 거꾸로 오른쪽부터라 2 ** 3 ** 2는 2 ** 9, 곧 512입니다.
2나누기(/)는 늘 실수
7을 2로 나누면 3.5입니다. 파이썬의 /도 소수점 아래까지 계산해 실수(float)를 냅니다. 그러면 나누어떨어지는 6 / 2는 무엇을 찍을까요?
print(7 / 2)
print(6 / 2)
실행 결과 보기
3.5
3.0예상과 다르면 그곳이 배울 곳입니다. /는 나누어떨어져도 늘 실수를 냅니다. 그래서 6 / 2는 3이 아니라 3.0이고, 종류는 float입니다.
사칙 계산에서는 한 번 실수가 된 값이 다른 수와 계산해도 실수로 남습니다. 6 / 2 * 2는 6이 아니라 6.0입니다.
3몫(//)과 나머지(%)
나눗셈을 몫과 나머지로 나누려면 //와 %를 씁니다. 7을 2로 나누면 몫이 3, 나머지가 1입니다.
print(7 // 2)
print(7 % 2)
3
1정수끼리의 //는 정수를 냅니다. //·%는 곱하기·나누기와 같은 차례라, 식에 섞이면 더하기·빼기보다 먼저 계산합니다.
거스름돈도 같은 방법으로 나눕니다. 1000으로 나눈 몫은 천 원짜리 장 수, 나머지는 남는 돈입니다.
change = 7300
print(change // 1000)
print(change % 1000)
7
300몫과 나머지로 처음 값을 다시 만들 수 있습니다. 1000 × 7 + 300 = 7300입니다.
어떤 수도 0으로 나눌 수는 없습니다. /·//·% 모두 0으로 나누면 오류로 멈춥니다.
count = 0
print(7300 // count)
Traceback (most recent call last): File "main.py", line 2, in <module> print(7300 // count) ~~~~~^^~~~~~~ZeroDivisionError: division by zero맨 아래 줄 ZeroDivisionError는 '0으로 나눴다'는 오류입니다. 2번 줄의 //에서 멈췄으니, 나누는 수 count가 어디서 0이 됐는지 앞줄을 봅니다.
파이썬 3.13 이하에서는 //·%의 설명 문구가 조금 다르게 찍히지만 오류 이름과 뜻은 같습니다.
예제
거스름돈 7300원을 천 원짜리와 백 원짜리로 나눕니다. '계산해 찍기'는 값 두기 → 계산하기 → 찍기 세 걸음으로 쓰고, 걸음마다 주석 머리줄을 답니다.
# 1. 값 두기
change = 7300
# 2. 계산하기
bills = change // 1000
rest = change % 1000
coins = rest // 100
# 3. 찍기
print('천 원', bills)
print('백 원', coins)
천 원 7
백 원 35번 줄의 rest는 천 원짜리 7장을 내고 남은 300입니다. 6번 줄은 그 300을 100으로 나눠 백 원짜리 수 3을 구합니다. 2번 줄의 change처럼 처음에 한 번 값을 두고 다시 붙이지 않는 이름을 고정값이라고 합니다. 다른 거스름돈을 나누려면 이 한 줄만 고치면 됩니다.
자주 틀리는 곳
틀린 생각: /는 몫을 낸다.
초등학교에서 배운 '몫과 나머지' 나눗셈 습관으로 7 / 2를 3으로 읽기 쉽지만, /는 소수점 아래까지 나눕니다.
print(7 / 2)
print(7 // 2)
3.5
31번 줄의 /는 3.5를 내고, 몫 3은 2번 줄의 //가 냅니다.
맞는 규칙: /는 소수점 아래까지 나눈 실수를 내고, 몫만 내는 것은 //입니다. 장 수나 시간처럼 몫이 필요하면 //를 씁니다.
틀린 생각: 나누어떨어지면 /도 정수를 낸다.
수학에서 6 ÷ 2는 딱 3이라 정수가 나올 것 같지만, /의 결과는 늘 실수입니다.
print(6 / 2)
print(type(6 / 2))
3.0
<class 'float'>6 / 2는 3이 아니라 3.0으로 찍히고, type()도 float(실수)라고 알려 줍니다.
맞는 규칙: /는 나누어떨어져도 늘 실수를 냅니다. 정수끼리 나눈 몫을 정수로 얻으려면 //를 씁니다.
틀린 생각: -7 // 2는 -3.5에서 소수점 아래를 버린 -3이다.
양수에서는 7 // 2가 3.5의 소수점 아래를 버린 3과 같아 이렇게 셈하기 쉽지만, //는 버리지 않고 아래로 내립니다.
print(-7 // 2)
-4-7을 2로 나눈 값은 -3.5이고, 수직선에서 -3.5 바로 왼쪽의 정수는 -3이 아니라 -4입니다.
맞는 규칙: 정수끼리의 //는 나눈 값보다 크지 않은 가장 큰 정수를 냅니다. 나눈 값이 -3.5면 수직선에서 바로 왼쪽 정수 -4를 고르고, 나누어떨어져 -4가 되면 그대로 -4입니다.
틀린 생각: 실수 계산도 늘 딱 떨어진다.
종이에서는 0.1 + 0.2가 정확히 0.3이지만, 컴퓨터로 계산하면 끝자리에 작은 오차가 보입니다.
print(0.1 + 0.2)
0.30000000000000004맞는 규칙: 컴퓨터는 실수를 2진수로 담기 때문에 아주 작은 오차가 생길 수 있습니다. 그래서 이 과목은 가격처럼 딱 맞아야 하는 값을 정수(원 단위)로 씁니다.
확인 문제
1. 예제의 2번 줄을 change = 4900으로 바꿨습니다. 무엇이 찍힐까요? 글자 그대로 쓰세요.
# 1. 값 두기
change = 4900
# 2. 계산하기
bills = change // 1000
rest = change % 1000
coins = rest // 100
# 3. 찍기
print('천 원', bills)
print('백 원', coins)
힌트
'2. 계산하기'의 세 줄을 차례로 따라가세요. 줄마다 쓰인 기호를 먼저 보세요.
정답
천 원 4
백 원 94900을 1000으로 나눈 몫이 4, 나머지가 900이고, 900을 100으로 나눈 몫이 9입니다.
흔한 오답은 천 원 4.9입니다. //도 /처럼 소수점 아래까지 나눈다고 본 것입니다. //는 몫만 냅니다.
2. 예제의 '2. 계산하기'에서 한 줄을 비웠습니다. 결과가 예제와 똑같이 천 원 7과 백 원 3으로 찍히도록 빈칸을 채우세요.
# 1. 값 두기
change = 7300
# 2. 계산하기
bills = change // 1000
rest = ____
coins = rest // 100
# 3. 찍기
print('천 원', bills)
print('백 원', coins)
힌트
rest는 천 원짜리를 내고 남는 돈입니다.
정답
change % 1000입니다.
# 1. 값 두기
change = 7300
# 2. 계산하기
bills = change // 1000
rest = change % 1000
coins = rest // 100
# 3. 찍기
print('천 원', bills)
print('백 원', coins)천 원 7
백 원 3change - bills * 1000도 같은 300을 만들어 맞습니다. 300처럼 수를 직접 써도 같은 화면이 찍히지만, 2번 줄의 change를 바꾸면 따라 바뀌지 않습니다.
흔한 오답은 change // 1000입니다. 남는 돈을 //가 낸다고 본 것입니다. rest를 몫 7에 붙이면 6번 줄이 7 // 100을 계산해 백 원이 0으로 찍힙니다.
3. 걸린 시간 135분을 나눠 봅니다. 무엇이 찍힐까요? 세 줄을 글자 그대로 쓰세요.
minutes = 135
print(minutes // 60)
print(minutes % 60)
print(minutes / 60)
힌트
135분이 몇 시간 몇 분인지 먼저 생각하세요. 그다음 줄마다 쓰인 기호(//·%·/)를 견주어 보세요.
정답
2
15
2.2560으로 나눈 몫 2가 시간, 나머지 15가 분입니다. 4번 줄의 /는 소수점 아래까지 나눠 2.25를 냅니다.
흔한 오답은 셋째 줄의 2.15입니다. 2시간 15분의 15분이 소수점 뒤에 그대로 붙는다고 본 것입니다. 2.25는 2시간과 0.25시간(15분)입니다.
아래 예제 코드의 6번 줄 coins = rest // 100을 coins = rest / 100으로 바꾸면 찍히는 두 줄을 봅니다.
처음 펼 때 약 6MB를 받습니다.컴퓨터에서 해 보기
파이썬 3.14. Tab을 누르면 다음 단추나 칸으로 갑니다. 들여쓰기는 빈칸 네 개입니다. Enter는 앞줄 들여쓰기를 잇고, 콜론 뒤에서는 한 단계 더 들여 씁니다. Ctrl+Enter로 실행합니다.
'실행'을 누르면 여기에 나옵니다.
여기서 쓴 코드 · 내 예상은 저장하지도 운영자에게 보내지도 않습니다. 페이지를 새로 열면 처음 코드입니다.