Python - 5. 함수
2025. 1. 19. 18:56ㆍ프로그래밍 언어/Python
Python에서 함수는 코드의 재사용성을 높이고, 프로그램의 구조를 효율적으로 설계하는 데 필수적인 도구입니다. 이번 섹션에서는 함수의 정의와 다양한 활용 방법을 다룹니다.
5.1 함수 정의와 호출
함수 정의
def greet(name):
"""사용자에게 인사를 출력하는 함수
Args:
name (str): 사용자 이름
Returns:
None
"""
print(f"Hello, {name}!")
함수 호출
greet("Alice") # Hello, Alice!
5.2 매개변수와 반환값
매개변수
함수는 호출 시 입력값(매개변수)을 받을 수 있습니다.
def add(a, b):
return a + b
result = add(3, 5)
print(result) # 8
기본값 매개변수
def greet(name, message="Hello"):
print(f"{message}, {name}!")
greet("Alice") # Hello, Alice!
greet("Bob", "Hi") # Hi, Bob!
5.3 가변 매개변수 (*args, **kwargs)
*args: 위치 매개변수
def sum_all(*args):
return sum(args)
print(sum_all(1, 2, 3, 4)) # 10
**kwargs: 키워드 매개변수
def print_info(**kwargs):
for key, value in kwargs.items():
print(f"{key}: {value}")
print_info(name="Alice", age=25, job="Engineer")
실행 결과:
name: Alice
age: 25
job: Engineer
5.4 순수 함수와 부작용
순수 함수
입력값에만 의존하고 외부 상태를 변경하지 않는 함수입니다.
def pure_function(x, y):
return x + y
print(pure_function(2, 3)) # 5
순수 함수의 장점
- 테스트와 디버깅이 용이
- 함수 호출이 항상 동일한 결과를 반환
- 병렬 처리에 적합
부작용
함수가 외부 상태를 변경하거나 외부 상태에 영향을 받는 경우입니다.
# 부작용 예제
external_list = []
def add_to_list(item):
external_list.append(item)
add_to_list(1)
print(external_list) # [1]
5.5 재귀 함수
재귀 함수는 자기 자신을 호출하는 함수입니다. 보통 종료 조건이 필요합니다.
팩토리얼 예제
def factorial(n):
if n == 1:
return 1
return n * factorial(n - 1)
print(factorial(5)) # 120
제한사항
Python에서는 최대 재귀 깊이가 제한되어 있으며, sys.getrecursionlimit()으로 확인할 수 있습니다. 재귀 깊이가 초과되면 RecursionError가 발생합니다.
import sys
print(sys.getrecursionlimit()) # 기본값: 1000
5.6 람다 함수와 고차 함수
람다 함수
짧은 익명 함수를 작성할 때 사용합니다.
square = lambda x: x ** 2
print(square(5)) # 25
고차 함수
다른 함수를 매개변수로 받거나 반환하는 함수입니다.
# map 함수
nums = [1, 2, 3, 4]
squared = list(map(lambda x: x ** 2, nums))
print(squared) # [1, 4, 9, 16]
# filter 함수
even_nums = list(filter(lambda x: x % 2 == 0, nums))
print(even_nums) # [2, 4]
5.7 제너레이터와 이터레이터
제너레이터
값을 필요할 때 하나씩 생성하는 함수입니다. yield 키워드를 사용합니다.
def generate_numbers():
for i in range(5):
yield i
for num in generate_numbers():
print(num)
실행 결과:
0
1
2
3
4
제너레이터의 메모리 효율성
제너레이터는 전체 데이터를 메모리에 저장하지 않고 필요한 값만 생성하므로 메모리 사용량이 적습니다.
이터레이터
__iter__와 __next__ 메서드를 구현한 객체입니다.
class Counter:
def __init__(self, start, end):
self.current = start
self.end = end
def __iter__(self):
return self
def __next__(self):
if self.current > self.end:
raise StopIteration
self.current += 1
return self.current - 1
counter = Counter(1, 5)
for num in counter:
print(num)
5.8 함수 내 함수와 클로저
함수 내 함수
함수 안에서 다른 함수를 정의할 수 있습니다.
def outer():
def inner():
print("This is the inner function.")
inner()
outer()
클로저
함수 내에서 정의된 함수가 외부 함수의 변수를 참조하는 경우입니다.
def make_multiplier(factor):
def multiplier(number):
return number * factor
return multiplier
double = make_multiplier(2)
print(double(5)) # 10
클로저 사용 시 주의사항
- 클로저가 참조하는 변수는 외부 함수가 종료된 후에도 메모리에 유지됩니다.
- 참조하는 변수를 변경하려면 nonlocal 키워드를 사용해야 합니다.
def counter():
count = 0
def increment():
nonlocal count
count += 1
return count
return increment
c = counter()
print(c()) # 1
print(c()) # 2
5.9 데코레이터
데코레이터는 기존 함수에 기능을 추가하는 데 사용됩니다.
기본 데코레이터
def decorator(func):
def wrapper():
print("Before the function call.")
func()
print("After the function call.")
return wrapper
@decorator
def say_hello():
print("Hello!")
say_hello()
실행 결과:
Before the function call.
Hello!
After the function call.
매개변수가 있는 함수 데코레이터
def decorator_with_args(func):
def wrapper(*args, **kwargs):
print("Before the function call.")
result = func(*args, **kwargs)
print("After the function call.")
return result
return wrapper
@decorator_with_args
def add(a, b):
return a + b
print(add(3, 5)) # Before the function call. After the function call. 8
이번 섹션에서는 함수의 정의부터 고급 활용까지 다뤘습니다.
'프로그래밍 언어 > Python' 카테고리의 다른 글
Python - 7. 파일 입출력 (0) | 2025.01.19 |
---|---|
Python - 6. 딕셔너리와 튜플 (0) | 2025.01.19 |
Python - 4. 리스트와 문자열 심화 (0) | 2025.01.19 |
Python - 3. 제어문 (0) | 2025.01.19 |
Python - 2. 연산과 연산자 (0) | 2025.01.19 |