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