오늘은 함수에 대하여 알아보도록 하겠습니다. 함수 아주 중요합니다.

1. 파이썬 함수의 목적과 개요
코드가 길어지고 복잡해지는 절차적 프로그래밍의 한계를 극복하기 위해 함수를 사용합니다.
- 함수 도입의 목적
- 재사용성 확보: 특정 기능을 하나의 단위로 묶어 같은 코드가 중복되는 것을 방지합니다.
- 생산성 및 이익 향상: 코드 작성 및 디버깅 시간이 단축되어 개발 비용이 감소합니다.
- 유지보수 용이: 기능 수정이 필요할 때 해당 함수 내부만 수정하면 되므로 관리가 직관적입니다.
- 절차적 코드와의 관계
- 절차적 코드는 흐름 제어가 복잡해지고 코드가 무한정 길어지는 단점이 있으나, 빠르고 간단한 로직 구현에는 여전히 유효합니다.
- 현대의 파이썬 프로그래밍은 함수(또는 객체) 지향적 구조를 뼈대로 삼고, 그 내부에 절차적 코드를 적절히 혼용하여 유연하게 작성하는 것이 일반적입니다.
2. 함수 구성의 본질
함수는 크게 입력, 처리, 출력 세 가지 핵심 단계로 구성됩니다. (입력과 출력은 설계에 따라 생략 가능합니다.)
- 입력 (Input)
- 외부의 데이터를 함수 내부로 전달하는 통로입니다.
- 매개변수(Parameter): 함수를 '정의'할 때 선언하는 변수입니다.
- 인자(Argument): 함수를 '호출'할 때 실제로 전달하는 데이터입니다. (실무에서는 혼용하여 부르기도 하나, 정확한 에러 디버깅을 위해 구분하는 것이 좋습니다.)
- 처리 (Process)
- 함수의 존재 목적이자 비즈니스 로직을 수행하는 코드 블록입니다.
- 예: 두 수의 덧셈 연산, 사용자 로그인 검증, LLM API 호출 및 응답 처리, 이미지 객체 탐지 모델 서빙 등
- 추가 지식: 좋은 함수는 하나의 기능만 수행하도록 설계해야 합니다. (단일 책임 원칙)
- 출력 (Output)
- 함수 내부의 처리 결과를 외부로 반환(return)합니다.
- 파이썬 함수의 리턴값은 본질적으로 항상 1개입니다. 여러 개의 값을 반환하도록 작성하면, 파이썬 내부적으로 이를 하나의 튜플(Tuple)로 묶어서 반환합니다.
3. 기초 문법 및 함수의 정의
파이썬에서 함수는 def 키워드를 사용하여 정의합니다.
# 함수 정의 기본 문법
# def 함수명([매개변수1, 매개변수2, ...]):
# 처리할 코드 (statements)
# [return [출력값]]
# 1. 함수 정의 (매개변수 x, y 설정)
def add(x, y):
res = x + y # 처리
return res # 반환
# 2. 함수 호출 (인자 50, 100 전달)
# 파이썬은 'Call by Object Reference' 방식을 따릅니다.
result = add(50, 100)
만약 덧셈 로직이 프로그램 수백 곳에서 쓰인다면,
이 로직을 곱셈으로 바꿔야 할 때 add 함수 내부 연산자만 +에서 *로 변경하면 모든 곳에 일괄 적용됩니다.
이것이 함수화를 통한 유지보수의 핵심입니다.
4. 함수의 출력 파트
4.1. 출력이 없는 유형
return 구문을 생략하거나 단독으로 사용하면, 함수는 None 객체를 반환합니다.
# return 키워드가 없는 경우 -> 자동으로 None 반환
def add2(x, y):
print('연산 결과:', x + y)
print(add2(1, 2)) # 연산 결과는 출력되지만, print()가 반환받은 값은 None임
# return 단독 사용 -> 즉시 함수를 종료하고 None 반환
def add4(x, y):
res = x + y
if res < 10:
print('10 미만')
else:
return # 함수 강제 종료
print('함수 처리 완료')
4.2. 여러 값을 반환하는 유형 (튜플 패킹/언패킹)
파이썬은 여러 개의 반환값을 콤마(,)로 나열할 수 있으며, 이는 하나의 튜플로 묶여 반환됩니다.
이를 변수 여러 개로 분해(Unpacking)하여 받을 수 있습니다.
def multi_oper(x, y):
res1 = x + y
res2 = x - y
res3 = x * y
res4 = x / y
return res1, res2, res3, res4 # 4개의 값이 하나의 튜플로 반환됨
# 언패킹을 통한 반환값 수령. 필요 없는 값은 언더스코어(_)로 무시 가능
res_add, res_sub, _, res_div = multi_oper(20, 10)
5. 함수의 입력 파트
함수의 활용도를 극대화하는 다양한 입력(매개변수) 처리 방식입니다.
5.1. 가변 인자 (*args)
인자의 개수가 정해져 있지 않을 때 사용합니다. 매개변수 앞에 *를 붙이면,
입력된 모든 인자가 튜플(Tuple)로 묶여 함수 내부로 전달됩니다. (여기서 *는 포인터가 아닌 패킹 연산자입니다.)
# 가변 인자 적용
def add_ex(*args):
print(args, type(args)) # 입력된 값들은 튜플 형태로 저장됨
return sum(args) # 내장 함수 sum()으로 일괄 합산
print(add_ex(1, 2, 3)) # 출력: 6
print(add_ex(1, 2, 3, 4, 5)) # 출력: 15
5.2. 인자의 기본값 부여 (Default Parameters)
매개변수에 기본값을 설정하면, 함수 호출 시 해당 인자를 생략할 수 있습니다.
머신러닝의 하이퍼파라미터 초기값 설정 등에 매우 빈번하게 사용됩니다.
# 기본값이 지정된 매개변수
def feature_extract(stride=1, padding='same', shape=None):
print(f"stride: {stride}, padding: {padding}, shape: {shape}")
feature_extract() # 모두 기본값 적용
feature_extract(2, 'valid') # 순서대로 덮어쓰기 적용
feature_extract(shape=(2, 2), padding='valid') # 매개변수명(키워드)을 직접 지정하여 세팅
# stride: 1, padding: same, shape: None
# stride: 2, padding: valid, shape: None
# stride: 1, padding: valid, shape: (2, 2)
추가 지식: 파이썬에서 매개변수 기본값으로 가변 객체(예: list=[] 또는 dict={})를 지정하면 함수가 호출될 때마다 해당 객체를 공유하는 치명적인 버그가 발생할 수 있습니다. 기본값은 반드시 None이나 불변 객체로 설정해야 합니다.
def add_item(item, item_list=[]): # 매개변수 기본값으로 가변 객체([]) 사용
item_list.append(item)
return item_list
# 첫 번째 호출
print(add_item("사과"))
# 예상 결과: ["사과"]
# 실제 결과: ["사과"] -> 여기선 정상처럼 보입니다.
# 두 번째 호출 (item_list를 지정하지 않음)
print(add_item("바나나"))
# 예상 결과: ["바나나"]
# 실제 결과: ["사과", "바나나"] -> 이전 호출의 데이터가 남아있습니다!
5.3. 키워드 가변 인자 (kwargs)
매개변수명과 값을 딕셔너리(Dictionary) 형태로 유연하게 받을 때 사용합니다. 주로 라이브러리 업데이트 시 하위 호환성을 유지하거나, 예측할 수 없는 다수의 옵션을 받아야 할 때 활용됩니다.
def check_version(**kwargs):
print(kwargs, type(kwargs))
if not kwargs.get('pi'):
print('1.0 버전으로 처리')
else:
print('2.0 버전으로 처리')
check_version(msg='hi', rank=3, pi=3.14)
# 내부 전달 형태: {'msg': 'hi', 'rank': 3, 'pi': 3.14}
# {'msg': 'hi', 'rank': 3, 'pi': 3.14} <class 'dict'>
# 2.0 버전으로 처리
5.4. 일반, 가변, 키워드 인자의 혼용 규칙
여러 형태의 매개변수를 하나의 함수에서 조합할 수 있습니다. 단, 파이썬 인터프리터가 모호함 없이 인자를 해석할 수 있도록 반드시 다음의 배치 순서를 엄수해야 합니다.
- 배치 순서: 일반 인자(위치 인자) -> 가변 인자(*args) -> 기본값이 있는 일반 인자 -> 키워드 가변 인자(kwargs)
# 올바른 순서의 매개변수 정의
def complex_func(x, y, *args, p=1, q=2, **kwargs):
print(x, y, args, p, q, kwargs)
# 순서 규칙만 지킨다면 호출 시 일부를 생략하거나 키워드를 지정해 자유롭게 사용 가능합니다.
complex_func(10, 20, 30, 40, 50, p=100, msg='hello')
# x=10, y=20
# args=(30, 40, 50)
# p=100 (덮어쓰기), q=2 (기본값)
# kwargs={'msg': 'hello'}
6. 종합 조합
def add7(*c,x=1,y=2,**kwargs):
print(x,y,c,kwargs)
#순서(제일먼저 가변인자가 나온다)만 준수, 뒤의 순서는 상관없다.
add7(10,20,30,40,50,60,pop='hello')
# add7(x=10,20,30,40,50,60,pop='hello')
add7(10,20,30,40,x=50,y=60,pop='hello')
add7(10,20,30,40,y=50,x=60,pop='hello')
add7(10,20,30,40,pop='hello',y=50,x=60)
# 1 2 (10, 20, 30, 40, 50, 60) {'pop': 'hello'}
# 50 60 (10, 20, 30, 40) {'pop': 'hello'}
# 60 50 (10, 20, 30, 40) {'pop': 'hello'}
# 60 50 (10, 20, 30, 40) {'pop': 'hello'}'코딩 개발 > Python' 카테고리의 다른 글
| Python - 함수 지향적 프로그래밍(feat. 숫자 맞추기 게임) (1) | 2026.07.21 |
|---|---|
| Python - 함수의 종류와 활용법 (0) | 2026.07.20 |
| Python - 절차적 프로그래밍2 (숫자 맞추기 게임 만들기 step4 ~ step7) (0) | 2026.07.16 |
| Python - 절차적 프로그래밍1 (숫자 맞추기 만들기 step1 ~ step3) (0) | 2026.07.15 |
| Python - 반복문(break, continue, else, while) (0) | 2026.07.14 |