
함수가 만든 결과를 밖으로 꺼내기

지난 글에서는 함수에 값을 건네는 매개변수와 인자를 살펴봤어요. 이번엔 반대 방향입니다. 함수 안에서 뭔가를 계산하고, 그 결과를 함수 밖으로 돌려주는 방법이 반환값이에요.
예를 들어 두 수를 더하는 함수를 만들어 볼게요.
def add(a, b):
result = a + b
return result
answer = add(3, 5)
print(answer) # 8
add(3, 5)를 호출하면 함수 안에서 3 + 5를 계산하고, return result가 그 값을 호출한 자리로 보내요. 그래서 answer에는 8이 들어갑니다. 매개변수가 함수로 들어가는 값이라면, 반환값은 함수에서 나오는 값인 셈이죠.
이렇게 결과를 돌려받으면 다른 계산에 이어 쓰기도 편해요.
total = add(3, 5) * 2
print(total) # 16
함수 안에서 화면에 출력하는 것과 호출한 곳에 결과를 돌려주는 건 달라요. print()는 화면에 보여 주고, return은 값을 돌려줍니다. 계산 결과를 다음 코드에서 써야 한다면 보통 return이 필요해요.
return을 만나면 함수는 끝나요

return은 결과를 보내는 순간 함수 실행도 끝냅니다. 그 아래에 있는 코드는 실행되지 않아요. 처음엔 저도 결과만 툭 넘기는 줄 알았다가, 뒤에 써 둔 코드가 왜 안 도는지 한참 찾곤 했어요. 네, 범인은 return이었습니다.
def check_age(age):
if age < 0:
return "나이는 음수일 수 없어요"
return f"입력한 나이: {age}"
나이가 음수면 첫 번째 return에서 바로 끝나고, 그렇지 않으면 아래쪽 return까지 진행해요. 이런 식으로 조건에 따라 일찍 끝내면 불필요한 else를 줄이고 흐름을 읽기 쉽게 만들 수 있습니다.
def is_even(number):
if number % 2 == 0:
return True
return False
물론 이 예시는 return number % 2 == 0 한 줄로도 쓸 수 있어요. 그래도 처음에는 조건을 나눠 쓰면서 반환되는 시점을 확인해 보면 이해하기 쉬워요. 함수 안에서 return을 여러 번 쓸 수 있지만, 한 번 실행된 뒤에는 함수가 끝난다는 점을 기억해 두세요.
결과를 여러 개 돌려줄 수도 있어요

함수 하나가 값 하나만 반환해야 하는 건 아니에요. 파이썬에서는 쉼표로 값을 나란히 반환할 수 있습니다.
def get_name_and_age():
return "민지", 28
person = get_name_and_age()
print(person) # ('민지', 28)
여러 값을 반환한 것처럼 보이지만, 실제로는 값들이 튜플 하나로 묶여서 돌아와요. 튜플은 여러 값을 한데 담는 자료 구조였죠. 앞서 배운 내용이 여기서 다시 등장합니다.
각 값을 변수에 따로 담고 싶다면 이렇게 받을 수 있어요.
name, age = get_name_and_age()
print(name) # 민지
print(age) # 28
이걸 언패킹이라고 불러요. 반환하는 값의 개수와 받는 변수의 개수가 맞아야 합니다. 함수가 두 값을 주는데 변수 하나로 각각 받으려 하면 오류가 나요. 여러 정보를 함께 돌려줄 때 유용하지만, 반환값이 너무 많아지면 각 값이 뭘 뜻하는지 헷갈릴 수 있어요. 그럴 땐 딕셔너리나 작은 자료 구조로 이름을 붙여 주는 방법도 생각해 볼 만합니다.
아무것도 돌려주지 않으면 None

함수에 return을 직접 적지 않으면 어떻게 될까요? 파이썬은 그 함수가 None을 반환한 것으로 처리합니다. None은 “값이 없음”을 나타내는 특별한 값이에요.
def say_hello(name):
print(f"안녕, {name}!")
result = say_hello("지수")
print(result) # None
인사말은 화면에 출력됐지만, 함수가 그 문자열을 반환한 건 아니에요. 그래서 result에는 None이 들어갑니다. 화면에 보여 주는 게 목적이라면 괜찮지만, 인사말을 다른 문자열과 합치거나 저장하고 싶다면 반환하도록 바꿔야 해요.
def make_hello(name):
return f"안녕, {name}!"
message = make_hello("지수")
print(message)
그리고 함수 안에서 return만 쓰거나 return None이라고 적어도 결과는 None이에요. 예를 들어 처리할 데이터가 없을 때 None을 반환하면, 호출한 쪽에서 결과가 있는지 확인할 수 있습니다.
def find_user(user_id):
if user_id == 1:
return "민지"
return None
user = find_user(99)
if user is None:
print("사용자를 찾지 못했어요")
None인지 확인할 때는 user == None보다 user is None을 자주 씁니다. 둘 다 비슷하게 보이지만, is None이 “이 값이 None인가?”를 확인하는 익숙한 표현이에요.
호출하는 쪽까지 생각하며 반환하기
함수를 만들 때는 “이 함수가 어떤 값을 받아서, 무엇을 돌려줘야 할까?”를 같이 정하면 좋아요. 간단히 확인할 땐 print()로 바로 보여 줘도 되지만, 결과를 이어서 사용할 거라면 return으로 넘겨주세요.
- 호출한 쪽에서 다시 쓸 값이면
return으로 돌려주기 - 여러 값을 함께 보내면 튜플로 반환된다는 점 기억하기
- 반환할 결과가 없으면
None이 될 수 있음 return을 만나면 그 함수의 실행은 끝남
매개변수는 함수로 값을 넣는 문, 반환값은 함수에서 결과를 꺼내는 문이라고 생각하면 편해요. 다음 글에서는 함수 안팎에서 같은 이름의 변수가 어떻게 다르게 동작하는지, 즉 스코프와 변수의 범위를 이어서 살펴볼게요.
![]() | ![]() |


첫 댓글을 남겨보세요.