파이썬 함수의 반환값, return과 None 쉽게 이해하기

in #python • 12 hours ago

return의 비밀 결과를 돌려줘요

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

함수 안의 계산 결과가 return을 통해 호출한 곳으로 전달되는 흐름

지난 글에서는 함수에 값을 건네는 매개변수와 인자를 살펴봤어요. 이번엔 반대 방향입니다. 함수 안에서 뭔가를 계산하고, 그 결과를 함수 밖으로 돌려주는 방법이 반환값이에요.

예를 들어 두 수를 더하는 함수를 만들어 볼게요.

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은 결과를 보내는 순간 함수 실행도 끝냅니다. 그 아래에 있는 코드는 실행되지 않아요. 처음엔 저도 결과만 툭 넘기는 줄 알았다가, 뒤에 써 둔 코드가 왜 안 도는지 한참 찾곤 했어요. 네, 범인은 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을 만나면 그 함수의 실행은 끝남

매개변수는 함수로 값을 넣는 문, 반환값은 함수에서 결과를 꺼내는 문이라고 생각하면 편해요. 다음 글에서는 함수 안팎에서 같은 이름의 변수가 어떻게 다르게 동작하는지, 즉 스코프와 변수의 범위를 이어서 살펴볼게요.

(html comment removed: aistudio:footer )

AIWD 소모임AI 자동화 오픈톡

원문: https://aiwd.kro.kr/autoblog/post/382