Python
함수
Python 함수 정의, 매개변수, lambda, map/filter/reduce, closure, decorator 정리
1) 함수(Function)
함수란?
여러 문장을 하나의 이름으로 묶어 필요할 때 호출하는 코드 블록
장점: 코드 재사용, 중복 제거, 유지보수 향상, 가독성 향상
함수의 종류
| 종류 | 설명 |
|---|---|
| 내장 함수(Built-in) | Python 기본 제공 (print, len, max, sum 등) |
| 사용자 정의 함수 | 개발자가 직접 생성 (def 키워드) |
| 3rd Party 함수 | 다른 개발자가 만들어놓은 함수(라이브러리) |
함수 정의와 호출
def 함수이름(매개변수):
실행문
return 결과
result = add(10, 20) # 호출
반환(Return)
- 함수 종료 + 값 반환
return이 없으면None반환- 여러 값 반환 → 실제로는 Tuple 반환
def swap(a, b):
return b, a
x, y = swap(10, 20)
2) 매개변수(Parameter)
기본값(Default Parameter)
def plus(a, b=1):
return a + b
plus(5) # 6
기본값 있는 매개변수 뒤에는 기본값 없는 매개변수가 올 수 없음
키워드 인수(Keyword Argument)
plus(b=10, a=20) # 순서 관계없이 호출 가능
인수 전달 방식
| 타입 | 전달 방식 | 원본 영향 |
|---|---|---|
| Scalar (int, float 등) | 값 전달 | 함수 내 변경해도 원본 영향 없음 |
| Vector (list, dict 등) | 참조 전달 | 함수 내 수정 시 원본도 변경 |
# Scalar: 변경 없음
n = 10
def f(x):
x = x + 1
f(n)
print(n) # 10
# Vector: 원본 변경
li = [10, 20, 30]
def f(ar):
ar[0] = 1000
f(li)
print(li) # [1000, 20, 30]
3) 함수 고급
순수 함수(Pure Function)
- 동일한 입력 → 항상 동일한 출력
- 외부 상태 변경 없음 (Side Effect 없음)
Unpacking
# Sequence
def func(a, b): return a + b
func(*[10, 20]) # func(10, 20)
# Dict (키와 매개변수 이름 매핑)
func(**{"a": 10, "b": 20})
가변 매개변수
def total(*args): # Tuple로 받음
return sum(args)
def profile(**kwargs): # Dict로 받음
print(kwargs)
Docstring
def add(a, b):
"""두 수를 더한다."""
return a + b
help(add)
Type Hint
def add(a: int, b: int) -> int:
return a + b
4) 함수형 프로그래밍
lambda (익명 함수)
lambda x: x * x
# 일반 함수 동일
def f(x):
return x * x
고차 함수
map — 모든 요소 변환
list(map(lambda x: x + 1, [1, 2, 3])) # [2, 3, 4]
filter — 조건 만족 요소만 선택
list(filter(lambda x: x > 2, [1, 2, 3, 4])) # [3, 4]
reduce — 모든 데이터를 하나로 누적
from functools import reduce
reduce(lambda x, y: x + y, [1, 2, 3, 4]) # 10
5) Scope
| 키워드 | 범위 |
|---|---|
| (없음) | Local: 함수 내부 변수 |
global |
함수 외부 전역 변수 수정 |
nonlocal |
중첩 함수에서 바깥 함수 변수 수정 |
6) Closure
함수를 리턴하여 외부 함수의 지역 변수를 기억
def calc():
a = 3
def mul(x):
return a * x
return mul
f = calc()
print(f(5)) # 15
7) Decorator
기존 함수를 수정하지 않고 기능을 추가
import time
def logging(func):
def logged(*args):
start = time.time()
result = func(*args)
elapsed = time.time() - start
print(f"실행 시간: {elapsed}")
return result
return logged
@logging
def factorial(n):
return 1 if n < 2 else n * factorial(n-1)
활용: 로깅, 실행 시간 측정, 인증, 캐싱
메모이제이션 (lru_cache)
from functools import lru_cache
@lru_cache()
def fibonacci(n):
if n <= 2:
return 1
return fibonacci(n-1) + fibonacci(n-2)
댓글