본문으로 건너뛰기

돌려받은 값 쓰기

파이썬 목차함수레슨 39 / 59

목차

함수가 return으로 돌려준 값은 함수를 부른 자리에 놓입니다. 그 값에 이름을 붙이거나 식과 다른 함수의 인자로 쓸 수 있고, return을 만나면 함수는 그 자리에서 끝납니다.

print로 찍기만 하는 함수는 결과를 화면에 보여 줄 뿐이라, 그 결과로 다시 계산할 수 없습니다. 값을 돌려받아야 합계에 더하고 다른 함수에 넘길 수 있습니다. 이 레슨에서는 돌려받은 값이 식 안에서 어떻게 쓰이는지와, return이 함수를 언제 끝내는지 봅니다.

6단계 중 1단계. 함수 price를 만들고, 부른 결과로 식을 계산하는 코드입니다.

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]))
실행 결과
4000

2번 줄이 첫 값 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)
실행 결과
7500

9번 줄과 10번 줄은 돌려받은 3500과 4000에 이름을 붙이고, 11번 줄이 두 값을 더해 찍습니다. 값을 돌려주는 함수라서 결과로 계속 계산할 수 있습니다.

자주 틀리는 곳

틀린 생각: return 뒤에 쓴 줄도 함수가 끝나기 전에 실행된다.

return 아래에 줄이 더 있으니 그 줄까지 실행한 뒤 함수가 끝날 것처럼 보입니다. return은 그 자리에서 함수를 끝냅니다.

def f():
    return 1
    print('끝')


print(f())
실행 결과
1

3번 줄은 실행되지 않아 '끝'이 찍히지 않습니다.

맞는 규칙: 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줄입니다.

실행 결과
12000

price(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를 받습니다.컴퓨터에서 해 보기

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

파이썬 목차로