파이썬에서 함수(function)란 특정 용도의 코드를 한 곳에 모아 놓은 것입니다. 반복되는 코드를 함수로 만들어두면 재사용이 쉬워지고, 코드의 가독성도 높아집니다.
def 키워드에 함수 이름을 지정하고 ()와 콜론 :을 붙인 뒤, 다음 줄에 원하는 코드를 작성합니다. 이때 코드는 반드시 들여쓰기를 해야 합니다.
# 함수 정의
def greet():
print("안녕하세요!")
print("파이썬 함수입니다.")
# 함수 호출
greet()
# 안녕하세요!
# 파이썬 함수입니다.
이렇게 함수를 사용하는 것을 "함수를 호출한다"고 표현합니다.
⚠️ 함수를 만들기 전에 먼저 호출하면 에러가 발생합니다. 파이썬은 코드를 위에서 아래로 순차적으로 실행하기 때문에, 함수 정의가 호출보다 위에 있어야 합니다.
# ❌ 함수 정의 전에 호출 → NameError
# greet()
# ✅ 함수 정의가 먼저
def greet():
print("안녕하세요!")
greet()
함수에서 값을 받으려면 () 괄호 안에 변수 이름을 지정합니다. 이 변수를 매개변수(parameter)라고 합니다.
# 매개변수가 하나인 함수
def greet(name):
print(f"안녕하세요, {name}님!")
greet("홍길동") # 안녕하세요, 홍길동님!
매개변수를 여러 개 지정할 수도 있습니다.
# 매개변수가 여러 개인 함수
def add(a, b):
print(f"{a} + {b} = {a + b}")
add(3, 5) # 3 + 5 = 8
💡 함수를 호출할 때 전달하는 값은 인수(argument)라고 합니다. 매개변수는 함수를 정의할 때, 인수는 함수를 호출할 때 사용하는 용어입니다.
함수 본문 첫 줄에 큰따옴표 세 개(""")로 감싼 문자열을 넣으면 독스트링(docstring)이 됩니다. 함수의 용도를 설명하는 역할을 하며, help() 함수로 확인할 수 있습니다.
def add(a, b):
"""두 수를 더한 결과를 반환하는 함수입니다.
Args:
a: 첫 번째 숫자
b: 두 번째 숫자
Returns:
두 수의 합
"""
return a + b
# 독스트링 확인
help(add)
return은 함수 바깥으로 값을 반환합니다. 반환된 값은 변수에 저장하여 활용할 수 있습니다.
# return으로 값 반환
def add(a, b):
return a + b
result = add(3, 5)
print(result) # 8
함수에서 값을 여러 개 반환할 때는 값이나 변수를 콤마로 구분합니다. 이때 실제로는 튜플이 반환됩니다.
# 여러 값 반환 (실제로는 튜플 반환)
def get_min_max(numbers):
return min(numbers), max(numbers)
# 튜플로 받기
result = get_min_max([3, 1, 7, 2, 9])
print(result) # (1, 9)
print(type(result)) # <class 'tuple'>
# 언패킹으로 각각 받기
min_val, max_val = get_min_max([3, 1, 7, 2, 9])
print(min_val) # 1
print(max_val) # 9
return은 값을 반환하는 것 외에도 함수를 즉시 종료하는 역할을 합니다. return 아래의 코드는 실행되지 않습니다.
def check_age(age):
if age < 0:
return # 값 없이 return하면 None을 반환하고 함수 종료
print(f"나이: {age}")
check_age(-1) # 아무것도 출력되지 않음
check_age(25) # 나이: 25
프레임(frame)이란 메모리에서 함수와 함수에 속한 변수가 저장되는 독립적인 공간입니다. 함수가 호출될 때마다 새로운 프레임이 생성되고, 함수가 끝나면 프레임이 사라집니다.
전역 프레임(global frame)은 파이썬 스크립트 전체에서 접근할 수 있는 공간으로, 함수 바깥에서 만든 변수가 이곳에 저장됩니다.
함수는 스택(stack) 방식으로 호출됩니다. 스택은 후입선출(LIFO) 구조로, 가장 나중에 호출된 함수가 가장 먼저 종료됩니다.
def func_a():
print("A 시작")
func_b() # func_b 호출 → 스택에 추가
print("A 끝")
def func_b():
print("B 시작")
func_c() # func_c 호출 → 스택에 추가
print("B 끝")
def func_c():
print("C 시작")
print("C 끝") # func_c 종료 → 스택에서 제거
func_a()
위 코드의 콜 스택 변화를 시각화하면 다음과 같습니다.
