함수가 return으로 돌려준 값은 함수를 부른 자리에 놓입니다. 그 값에 이름을 붙이거나 식과 다른 함수의 인자로 쓸 수 있고, return을 만나면 함수는 그 자리에서 끝납니다.
print로 찍기만 하는 함수는 결과를 화면에 보여 줄 뿐이라, 그 결과로 다시 계산할 수 없습니다. 값을 돌려받아야 합계에 더하고 다른 함수에 넘길 수 있습니다.
이 레슨에서는 돌려받은 값이 식 안에서 어떻게 쓰이는지와, return이 함수를 언제 끝내는지 봅니다.
1돌려받은 값은 부른 자리에 놓인다
그림의 코드입니다.
def price(n):
return 4000 * n
print('계산 끝')
total = price(2) + 500
6번 줄은 오른쪽 식 price(2) + 500부터 계산합니다(규칙 2). 먼저 price(2)를 부르면 새 칸에서 n이 2에 붙고, 2번 줄이 4000 * n을 계산한 8000을 돌려줍니다(규칙 5). 돌려받은 8000이 price(2)가 있던 자리에 놓여 식은 8000 + 500이 되고, 8500으로 접힙니다. total은 8500에 붙습니다.
돌려받은 값은 이렇게 식에 쓰거나, 이름을 붙이거나, 다른 함수에 인자로 넘길 수 있습니다. 아래 코드는 무엇을 찍을까요? 마지막 줄까지 정한 뒤 펼쳐 보세요.
def price(n):
return 4000 * n
total = price(2) + 500
print(total)
print(price(3))
price(1)
실행 결과 보기
8500
12000예상과 다르면 그곳이 배울 곳입니다.
7번 줄은 price(3)이 돌려준 12000을 print에 인자로 넘겨 찍습니다. 8번 줄도 price를 불러 4000을 돌려받지만, 그 값을 찍지도 이름을 붙이지도 않아 화면에는 아무것도 나오지 않습니다.
4000이 한 줄 더 찍힌다고 예상했다면, 돌려준 값이 화면에 저절로 나온다고 본 것입니다. 화면에 쓰는 것은 print뿐입니다(규칙 5). 대화형 창에서는 price(1)만 쳐도 4000이 보이지만, 파일에서는 print로 찍은 것만 보입니다(내 컴퓨터에서 돌려 보기).
2return을 만나면 함수는 바로 끝난다
그림 코드의 3번 줄 print('계산 끝')은 한 번도 실행되지 않습니다. return은 값을 돌려주면서 함수를 그 자리에서 끝내, 실행은 3번 줄로 가지 않고 부른 6번 줄로 돌아갑니다.
반복 안에서 만나도 같습니다. 반복이 남아 있어도 함수가 통째로 끝납니다.
def first(prices):
for p in prices:
return p
print(first([4000, 4500]))
40002번 줄이 첫 값 4000에 p를 붙이고, 3번 줄이 4000을 돌려주는 순간 함수가 끝납니다. 둘째 바퀴는 오지 않습니다. 첫 값을 찾는 함수라면 이것으로 맞지만, 값을 모두 더하는 함수에서 return을 반복 안에 두면 첫 값만 돌아옵니다.
3print만 하는 함수의 값은 None이다
return 없이 print만 하는 함수는 None을 돌려줍니다. 그 값으로 계산하면 오류가 납니다.
def price(n):
print(4000 * n)
total = price(2) + 500
8000Traceback (most recent call last): File "main.py", line 5, in <module> total = price(2) + 500 ~~~~~~~~~^~~~~TypeError: unsupported operand type(s) for +: 'NoneType' and 'int'8000은 2번 줄이 화면에 쓴 것이고, price가 돌려준 것은 None입니다. 그래서 5번 줄의 식이 None + 500이 됩니다. 맨 아래 줄은 '+의 양쪽 종류가 NoneType(None의 종류)과 int라 계산할 수 없다'는 뜻입니다.
오류는 5번 줄에서 났지만 고칠 곳은 2번 줄입니다. print(4000 * n)을 return 4000 * n으로 바꾸면 total이 8500에 붙습니다.
예제
돌려받은 값끼리 더하기
메뉴 값을 받아 500원 할인한 값을 돌려주는 함수입니다.
# 1. 받을 값 정하기
def sale(won):
# 2. 계산하기
off = won - 500
# 3. 돌려주기
return off
coffee = sale(4000)
latte = sale(4500)
print(coffee + latte)
75009번 줄과 10번 줄은 돌려받은 3500과 4000에 이름을 붙이고, 11번 줄이 두 값을 더해 찍습니다. 값을 돌려주는 함수라서 결과로 계속 계산할 수 있습니다.
자주 틀리는 곳
틀린 생각: return 뒤에 쓴 줄도 함수가 끝나기 전에 실행된다.
return 아래에 줄이 더 있으니 그 줄까지 실행한 뒤 함수가 끝날 것처럼 보입니다. return은 그 자리에서 함수를 끝냅니다.
def f():
return 1
print('끝')
print(f())
13번 줄은 실행되지 않아 '끝'이 찍히지 않습니다.
맞는 규칙: return은 값을 돌려주며 함수를 그 자리에서 끝냅니다. 함수가 할 일은 모두 return 앞에 씁니다(규칙 5).
틀린 생각: 함수가 돌려준 값은 화면에 저절로 나온다.
대화형 창에서는 식만 쳐도 값이 보여, 파일에서도 그럴 것 같습니다. 돌려준 값은 부른 자리에 놓일 뿐입니다.
def g():
return 3
g()
print('끝')
끝5번 줄이 3을 돌려받지만 아무것도 하지 않아, 화면에는 '끝'만 찍힙니다.
맞는 규칙: 돌려받은 값은 부른 자리에 놓일 뿐이고, 화면에 쓰는 것은 print입니다. 값을 보려면 print(g())처럼 찍습니다(규칙 5).
확인 문제
1. 1절 둘째 코드의 5번 줄을 total = price(2) + price(1)로 바꾸고, 7번 줄과 8번 줄을 지웠습니다. 무엇이 찍힐까요? 마지막 줄까지 글자 그대로 쓰세요.
def price(n):
return 4000 * n
total = price(2) + price(1)
print(total)
힌트
5번 줄의 두 부르기가 각각 무엇을 돌려주는지 적고, 그 값을 부른 자리에 놓아 식을 계산합니다.
정답
모두 1줄입니다.
12000price(2)가 8000을, price(1)이 4000을 돌려주어 식이 8000 + 4000이 됩니다. 부를 때마다 새 칸이 생겨 n이 2와 1에 따로 붙습니다.
흔한 오답은 8000과 4000이 먼저 찍힌 세 줄입니다. 돌려준 값이 화면에 저절로 나온다고 본 것입니다(찍는 것과 돌려주는 것이 같다는 생각). 돌려받은 값은 부른 자리에 놓여 식에 쓰일 뿐이고, 화면에 쓰는 것은 6번 줄의 print입니다(규칙 5).
2. 봉투 수를 받아 봉투 값(한 장 100원)을 돌려주는 함수입니다. 아래 두 줄이 찍히도록 '3. 돌려주기'의 빈칸을 채우세요.
3200
3500
# 1. 받을 값 정하기
def bag(n):
# 2. 계산하기
won = n * 100
# 3. 돌려주기
____
print(3000 + bag(2))
print(3000 + bag(5))
힌트
9번 줄은 bag(2)가 부른 자리에 놓는 값으로 덧셈을 합니다. 그 값을 정하는 줄이 빈칸입니다.
정답
return won입니다.
# 1. 받을 값 정하기
def bag(n):
# 2. 계산하기
won = n * 100
# 3. 돌려주기
return won
print(3000 + bag(2))
print(3000 + bag(5))3200
3500다르게 써도 되는 곳: return n * 100도 같은 값을 돌려줍니다. return 200은 첫 줄만 맞고 둘째 줄이 3500이 아니라 3200으로 찍힙니다 — 인자가 바뀌어도 따라 바뀌지 않습니다.
흔한 오답은 print(won)입니다. 200을 찍은 뒤 bag이 None을 돌려줘, 9번 줄이 3000 + None을 계산하다 TypeError로 멈춥니다. 화면에 찍으면 그 값이 돌아간다고 본 것입니다(찍는 것과 돌려주는 것이 같다는 생각). print는 화면에 쓰고 None을 돌려주며, 부른 자리로 값을 보내는 것은 return입니다(규칙 5).
3. 사흘 걸음 수를 모두 더하려는 함수인데, 12000이 아니라 3000이 찍힙니다. 몇 번 줄을 어떻게 고쳐야 할까요?
def total(days):
steps = 0
for n in days:
steps = steps + n
return steps
record = [3000, 5000, 4000]
print(total(record))
3000힌트
5번 줄이 어느 덩어리에 들었는지, 그 줄이 처음 실행되는 때가 몇째 바퀴인지 봅니다.
정답
5번 줄의 들여쓰기를 8칸에서 4칸으로 줄여 반복 밖으로 꺼냅니다.
def total(days):
steps = 0
for n in days:
steps = steps + n
return steps
record = [3000, 5000, 4000]
print(total(record))12000고치기 전에는 return steps가 반복 덩어리 안에 있어, 첫 바퀴에서 3000을 더하자마자 돌려주고 함수가 끝났습니다. 반복 밖에 두면 세 바퀴를 다 돈 뒤 한 번 돌려줍니다(규칙 5).
흔한 오답은 5번 줄을 맨 앞(0칸)까지 꺼내는 것입니다. 들여쓰기를 모두 빼야 반복 밖이 된다고 본 것입니다. 그러면 return이 함수 몸 밖으로 나가 문법 오류 SyntaxError가 나고, 맨 아래 줄은 'return' outside function(함수 밖의 return)입니다. return은 함수 몸 안에, 반복보다 한 단계 바깥에 둡니다.
6번 줄의 [4000, 4500]을 빈 리스트 []로 바꾸면 무엇이 찍히는지 봅니다.
처음 펼 때 약 6MB를 받습니다.컴퓨터에서 해 보기
파이썬 3.14. Tab을 누르면 다음 단추나 칸으로 갑니다. 들여쓰기는 빈칸 네 개입니다. Enter는 앞줄 들여쓰기를 잇고, 콜론 뒤에서는 한 단계 더 들여 씁니다. Ctrl+Enter로 실행합니다.
'실행'을 누르면 여기에 나옵니다.
여기서 쓴 코드 · 내 예상은 저장하지도 운영자에게 보내지도 않습니다. 페이지를 새로 열면 처음 코드입니다.