파이썬의 비밀스러운 삶: 숨겨진 Return

발행: (2026년 2월 2일 오후 04:31 GMT+9)
5 min read
원문: Dev.to

Source: Dev.to

함수 결과가 None인 이유와 해결 방법.

Timothy는 화면을 보며 환하게 웃었다. 그는 방금 Margaret가 보여준 대로 가격 스크립트를 깔끔하고 정돈된 함수들로 리팩터링한 끝이었다.

“이제 훨씬 깔끔해졌어,” 라며 Run 버튼을 눌렀다. “작동하는지 보자.”

화면에 다음과 같이 표시되었다.

Calculating Tax...
Tax is: 15.0
Final Price: None

Timothy의 미소는 진짜 당황스러운 표정으로 바뀌었다. “이상하네,” 그가 조용히 말했다. “최종 가격이 None이야. 그런데 바로 앞 줄에서는 15.0을 출력했잖아. 그 숫자는 어디로 갔을까?”

Margaret는 책상에서 고개를 들어 미소 지었다. “두 번째 눈이 필요해?”

“제발요,” Timothy가 말했다. “뭘 놓쳤는지 모르겠어요. calculate_tax 안에서 tax 변수를 계산했어요. 출력했으니 확실히 15.0이 들어 있죠. 그런데 메인 함수에서 쓰려면 사라지는 것 같아요.”

그는 코드를 보여주었다:

def calculate_tax(price, rate):
    tax = price * rate
    print(f"Tax is: {tax}")

def main():
    price = 100
    rate = 0.15

    # Timothy expects 'tax_amount' to hold 15.0
    tax_amount = calculate_tax(price, rate)

    final_price = price + tax_amount
    print(f"Final Price: {final_price}")

if __name__ == "__main__":
    main()

암시적 None

Margaret는 친절히 고개를 끄덕였다. “무슨 일이 일어나고 있는지 정확히 보이네요. 계산은 완벽히 했지만, 함수를 ‘답을 돌려주라’고 알려주지 않았어요.”

그녀는 설명했다: “Python에는 조용한 규칙이 있습니다. 모든 함수는 반드시 무언가를 반환해야 합니다. 명시적으로 반환값을 지정하지 않으면, Python은 기본적으로 None을 정중히 반환합니다.”

Timothy는 깨달았다, “그러니까 tax_amount = calculate_tax(...) 라고 썼을 때, 15.0을 잡아낸 게 아니라 그 기본값인 None을 잡아낸 거군요?”

“맞아요,” Margaret가 말했다. “숫자를 계산하고 화면에 보여줬지만, 함수는 그 뒤에 메모를 남기지 않고 끝났어요.”

배턴 전달하기

“그렇군요,” Timothy가 말했다. “그럼 데이터를 공식적으로 돌려줘야겠네요.”

“정확히 그렇습니다,” Margaret가 답했다. “return 키워드를 사용합니다. 마치 릴레이 경주와 같습니다. 함수가 자신의 구간을 달리고, return은 다음 주자에게 배턴을 건네는 순간이죠. 기억하세요: 함수가 값을 반환하면 즉시 실행을 멈춥니다.”

그녀는 코드를 이렇게 고쳤다:

def calculate_tax(price, rate):
    tax = price * rate
    return tax  # Explicitly hand the value back

def main():
    price = 100
    rate = 0.15

    # Now, the function hands back 15.0
    tax_amount = calculate_tax(price, rate)

    # And we can use it for math!
    final_price = price + tax_amount
    print(f"Final Price: {final_price}")

if __name__ == "__main__":
    main()

Output

Final Price: 115.0

Timothy는 미소 지었다. “print는 사람에게 보여주기 위한 것이고, return은 코드에게 전달하기 위한 것이군요.”

Margaret의 치트 시트

  • Concept: Data Flow vs. Side Effects
  • Trap: 계산하거나 값을 출력하는 것이 프로그램의 다른 부분에서 그 값을 사용할 수 있게 만든다고 착각하기.
  • Rule: 함수가 return 문 없이 끝에 도달하면 기본적으로 None을 반환한다.
  • Fix: return을 사용해 결과를 호출자에게 전달한다.
print(x)   # Show it to the human (Side Effect)
return x   # Give it to the computer (Data Flow)

다음 에피소드에서 Margaret와 Timothy는 “그림자 이름”이라는 문제에 직면합니다—여기서 Timothy는 변수 이름을 liststr로 지정하면 왜 예상치 못한 문제가 발생하는지 배우게 됩니다.

Back to Blog

관련 글

더 보기 »

Python 클로저: JavaScript에서 온 경우

책과 비디오를 통한 학습 > “Books – 주제에 대한 깊이 있는 지식 습득 > Videos – 특정 technology를 빠르게 익히기” 나는 여전히 책을 집어 든다.

Python 3.13 및 3.14이 이제 사용 가능

빌드와 함수가 이제 Python 3.13 및 Python 3.14를 지원하며, 이전에 지원하던 Python 3.12와 함께 사용할 수 있습니다. Python 버전을 지정하지 않은 프로젝트는 계속…

눈이 전부다: Agentic Design Loop 닫기

LLM‑Assisted Coding을 위한 긴밀한 피드백 루프의 힘 LLM이 실제로 코딩에 효과를 발휘하게 하는 요소는—출력을 신중히 검토하는 것 외에도—긴밀한 피드백 루프입니다.