파이썬의 비밀스러운 삶: 숨겨진 Return
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는 변수 이름을 list나 str로 지정하면 왜 예상치 못한 문제가 발생하는지 배우게 됩니다.