파이썬 함수 기초: def로 만들고 return으로 돌려받기
코드를 좀 짜다 보면 똑같은 줄을 자꾸 반복해서 쓰고 있는 자신을 발견하실 거예요. 예를 들어 사람 이름 다섯 명한테 "안녕하세요"를 출력해주려면 print 다섯 번 쓰면 되긴 하는데요. 이게 50명이면요? 그리고 인사말을 살짝 바꾸려면 50줄을 다 고쳐야 하나요?
이럴 때 쓰라고 만든 게 함수예요.
지난 글에서 튜플과 딕셔너리로 여러 데이터를 묶는 법을 봤잖아요. 이번엔 코드 자체를 묶는 차례입니다.
파이썬 함수가 뭔가요? 자판기를 떠올려보세요
함수는 거창한 게 아니에요. 이름이 붙은 코드 묶음이에요.
자판기를 한번 떠올려보세요. 동전을 넣고 버튼을 누르면 음료가 나오죠. 한 번 만들어두면 백 번이고 천 번이고 똑같이 동작합니다. 함수도 똑같아요. 입력을 받아서 → 안에서 무언가 처리하고 → 결과를 돌려주는 작은 기계 한 대를 만든다고 보시면 됩니다.
수학에서 배운 함수랑 비슷한 개념이긴 한데요. 파이썬 함수는 훨씬 자유로워요. 숫자뿐 아니라 글자도 받을 수 있고, 결과를 돌려주지 않고 그냥 화면에 뭔가 띄워주기만 해도 되거든요.
python def 문법: 함수 만드는 법
함수를 만들 때 쓰는 키워드가 def예요. define(정의하다)의 줄임말입니다.
def hello(): # def + 함수이름 + () + 콜론
print("안녕하세요") # 본문은 들여쓰기 4칸
이게 끝이에요. 그런데 이 코드를 실행하면 화면에 뭐가 나올까요?
아무것도 안 나옵니다.
처음에 이 부분에서 많이들 당황하시는데요. def는 "이런 함수가 있어요"라고 등록만 해두는 거예요. 실제로 동작시키려면 한 번 더 불러줘야 합니다.
def hello():
print("안녕하세요")
hello() # 안녕하세요
hello() # 안녕하세요 ← 한 번 만들어두고 계속 재사용
레시피를 적어놓는 것과 실제로 요리를 하는 건 다르잖아요. 그거랑 똑같다고 생각하시면 됩니다.
매개변수: 함수에 값을 넣어주기
매번 똑같은 인사말만 나오면 재미없죠. 이름을 받아서 그 사람한테 인사하는 함수를 만들어볼게요.
def greet(name): # 괄호 안에 받을 자리를 만든다
print(f"{name}님, 반가워요")
greet("민수") # 민수님, 반가워요
greet("지영") # 지영님, 반가워요
괄호 안에 들어간 name을 매개변수라고 부르고요. 호출할 때 실제로 넣은 "민수", "지영" 같은 값을 인자라고 합니다. 용어가 헷갈리시면 일단 "받을 자리"랑 "넣는 값"으로만 기억하셔도 충분해요.
파이썬 return으로 값 돌려받기
여기서부터가 진짜예요. 함수가 결과값을 함수 밖으로 돌려주려면 return을 씁니다.
def add(a, b):
return a + b # a와 b를 더한 값을 밖으로 돌려준다
result = add(3, 5)
print(result) # 8
print(add(10, 20) + 100) # 130
돌려받은 값은 변수에 담을 수도 있고, 바로 다른 연산에 끼워 쓸 수도 있어요. 함수가 마치 숫자나 문자열처럼 값으로 변신하는 셈이죠.
return은 두 가지 일을 동시에 해요. 값을 밖으로 돌려주고, 동시에 함수 실행을 거기서 끝내버립니다.
def add(a, b):
return a + b
print("이 줄은 영원히 실행 안 돼요") # 도달 불가능
return 아래에 코드를 적어도 절대 실행되지 않아요. 함수는 return을 만나는 순간 곧장 자기 일을 끝내고 밖으로 나옵니다.
print와 return, 헷갈리지 마세요
이게 이 글에서 제일 중요한 부분이에요. 처음 함수 배울 때 거의 모든 분이 한 번씩 걸려 넘어지는 지점이거든요.
def add_print(a, b):
print(a + b) # 화면에 보여주기만 한다
def add_return(a, b):
return a + b # 값을 밖으로 돌려준다
x = add_print(3, 5) # 화면에 8이 출력됨
y = add_return(3, 5) # 화면엔 아무것도 안 나옴
print(x) # None ← print만 한 함수는 None을 돌려줘요
print(y) # 8
print(y * 2) # 16
# print(x * 2) # 에러! None * 2 는 안 됨
차이를 한 줄로 정리하면 이렇습니다.
print는 사람한테 보여주는 것, return은 다른 코드한테 넘겨주는 것.
print만 있고 return이 없는 함수는 자동으로 None을 돌려줘요. 그래서 그 결과를 다시 계산에 쓰려고 하면 TypeError가 터집니다. 초보자분들이 가장 자주 만나는 함정이에요.
실용 예제: BMI 계산기
함수가 진짜 빛을 발하는 순간은 같은 계산을 여러 번 할 때입니다.
def calc_bmi(weight, height_m):
bmi = weight / (height_m ** 2) # BMI 공식
return round(bmi, 2) # 소수점 둘째 자리까지
print(calc_bmi(65, 1.70)) # 22.49
print(calc_bmi(80, 1.75)) # 26.12
함수 하나 만들어두니까 가족 전체 BMI를 한 줄씩만 추가해서 구할 수 있죠. 만약 함수가 없었다면 BMI 공식을 매번 새로 적어야 했을 거예요.
자주 만나는 에러 두 가지
NameError: name 'greet' is not defined
함수를 정의하기 전에 호출했을 때 나는 에러예요. 파이썬은 위에서 아래로 코드를 읽으니까, 함수 정의가 호출보다 먼저 와야 합니다.
TypeError: missing 1 required positional argument
매개변수는 두 개인데 인자를 하나만 넣은 경우예요. add(3, 5)로 써야 할 걸 add(3)이라고 쓰면 이 에러가 납니다.
실습 과제
원의 넓이를 구해주는 함수 circle_area(r)을 직접 만들어보세요. 반지름을 받아서 3.14 * r * r을 돌려주면 됩니다. 다 만들었으면 반지름 5와 10을 넣어서 결과를 확인해보세요. 막히시면 댓글로 남겨주셔도 좋습니다.
오늘은 함수의 가장 기본적인 모양만 다뤘어요. 그런데 실제로 함수를 쓰다 보면 "이 매개변수는 안 넣으면 기본값을 쓰고 싶다"든가, "인자를 몇 개나 받을지 모르겠다" 같은 상황이 자주 생기거든요. 다음 글에서는 함수를 훨씬 더 유연하게 쓰는 방법, 매개변수와 기본값에 대해 이야기해볼게요.
제 글이 도움이 되셨다면 댓글 & 공감 부탁드려요 😀
'Application > Python' 카테고리의 다른 글
| [Python] 파이썬 모듈과 import 사용법, 남이 만든 도구 가져다 쓰기 (0) | 2026.04.30 |
|---|---|
| [Python] 파이썬 함수 심화 - 매개변수와 기본값 한 번에 정리 (0) | 2026.04.28 |
| [Python] 파이썬 튜플과 딕셔너리, 한 번에 정리 (0) | 2026.04.23 |
| [Python] 파이썬 리스트 완벽 정리: 초보도 한 번에 이해하는 python list 사용법 (0) | 2026.04.22 |
| [Python] 파이썬 반복문, for문과 while 완벽 정리 (0) | 2026.04.21 |