11차시: 함수 (Functions) 학습 패키지

함수는 특정 작업을 수행하는 코드 블록으로, 반복적인 작업을 효율적으로 처리하고 코드의 가독성을 높이는 데 필수적입니다. 기초적인 정의부터 클로저, 데코레이터와 같은 심화 개념까지 단계별로 학습해 보겠습니다.

1. 파이썬 예제 코드: 함수

가. 기초 예시 코드 (5개)

함수의 정의, 호출, 매개변수 전달 및 결과 반환의 기본 원리를 익힙니다.

1. 가장 기본적인 함수 정의 및 호출

# 매개변수와 반환값이 없는 가장 단순한 형태의 함수입니다.

def say_hello():
    """'안녕하세요!'를 출력하는 함수"""
    print("안녕하세요!")

# 함수 호출
say_hello()

2. 매개변수(Parameter)를 받는 함수

# 외부로부터 데이터를 전달받아 처리하는 함수입니다.

def greet(name):
    """이름을 받아 인사하는 함수"""
    print(f"반갑습니다, {name}님!")

# 함수 호출
greet("홍길동")
greet("구운몽")

3. 반환 값(Return Value)이 있는 함수

# 계산 결과를 호출한 곳으로 되돌려주는 함수입니다.

def add(a, b):
    """두 숫자를 더한 결과를 반환하는 함수"""
    return a + b

# 함수 호출 및 결과 저장
result = add(10, 5)
print(f"10 + 5 = {result}")

4. 여러 개의 매개변수와 반환 값

# 파이썬 함수는 콤마를 사용해 여러 값을 한꺼번에 반환할 수 있습니다.

def calculate_rectangle(width, height):
    """사각형의 넓이와 둘레를 계산하여 반환하는 함수"""
    area = width * height
    perimeter = 2 * (width + height)
    return area, perimeter

# 함수 호출 및 결과 저장 (튜플 형태로 반환됨)
rect_area, rect_perimeter = calculate_rectangle(10, 20)
print(f"넓이: {rect_area}, 둘레: {rect_perimeter}")

5. 기본값 매개변수 (Default Parameter)

# 매개변수에 미리 값을 정해두면 호출 시 생략이 가능합니다.

def power(number, exponent=2):
    """숫자의 거듭제곱을 구하는 함수 (기본값은 제곱)"""
    return number ** exponent

print(f"3의 제곱: {power(3)}")      # exponent=2 사용
print(f"2의 10승: {power(2, 10)}") # exponent=10 사용

나. 응용 예시 코드 (4개)

가변 인자 처리, 람다 함수 등 함수를 더 유연하게 사용하는 방법을 다룹니다.

1. 가변 인자 (*args) 활용

# 몇 개의 인자가 들어올지 모를 때 유용합니다.

def sum_all(*args):
    """입력받은 모든 숫자의 합을 구하는 함수"""
    total = 0
    for num in args:
        total += num
    return total

print(f"합계: {sum_all(1, 2, 3, 4, 5)}")

2. 키워드 가변 인자 (**kwargs) 활용

# 인자 이름을 지정하여 딕셔너리 형태로 데이터를 받습니다.

def print_info(**kwargs):
    """사용자 정보를 출력하는 함수"""
    for key, value in kwargs.items():
        print(f"{key}: {value}")

print_info(이름="인수샘", 역할="선생님", 전공="파이썬")

3. 람다(Lambda) 함수

# 이름 없이 한 줄로 정의하는 익명 함수입니다.

# 일반 함수
def multiply(x, y): return x * y

# 람다 함수
lambda_multiply = lambda x, y: x * y

print(f"결과: {lambda_multiply(10, 20)}")

# 정렬 등에서 키로 활용
names = ["홍길동", "구운몽", "인수샘"]
names.sort(key=lambda x: len(x)) # 이름 길이순 정렬
print(f"정렬 결과: {names}")

4. 재귀 함수 (Recursive Function)

# 함수 내부에서 자기 자신을 호출하여 문제를 해결합니다.

def factorial(n):
    """팩토리얼을 구하는 재귀 함수"""
    if n == 1:
        return 1
    return n * factorial(n - 1)

print(f"5! = {factorial(5)}")

다. 심화 예시 코드 (4개)

클로저, 데코레이터 등 함수 지향 프로그래밍의 핵심 심화 개념입니다.

1. 일급 객체로서의 함수

# 파이썬에서 함수는 변수에 담거나 다른 함수의 인자로 전달될 수 있습니다.

def apply_operation(func, x, y):
    """전달받은 함수(func)를 x, y에 적용하는 함수"""
    return func(x, y)

def add(a, b): return a + b
def sub(a, b): return a - b

print(f"더하기 적용: {apply_operation(add, 10, 5)}")
print(f"빼기 적용: {apply_operation(sub, 10, 5)}")

2. 클로저 (Closure)

# 내부 함수가 외부 함수의 변수를 기억하고 있는 상태를 말합니다.

def outer_func(base_num):
    """바깥 함수: 기준 숫자를 기억"""
    def inner_func(x):
        """안쪽 함수: 기준 숫자와 자신의 인자를 곱함"""
        return base_num * x
    return inner_func

# base_num(5)를 기억하는 함수가 반환됨
multiplier_by_5 = outer_func(5)
print(f"5 * 3 = {multiplier_by_5(3)}")

3. 데코레이터 (Decorator)

# 기존 함수의 코드를 수정하지 않고 기능을 추가할 때 사용합니다.

import time

def timer_decorator(original_func):
    """함수의 실행 시간을 측정하는 데코레이터"""
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = original_func(*args, **kwargs)
        end_time = time.time()
        print(f"'{original_func.__name__}' 실행 시간: {end_time - start_time:.5f}초")
        return result
    return wrapper

@timer_decorator
def long_task(n):
    """합계를 구하는 작업 시뮬레이션"""
    return sum(range(n))

long_task(1000000)

4. 제너레이터 (Generator)

# yield를 사용하여 데이터를 하나씩 생성하며 메모리를 절약합니다.

def number_generator(n):
    """0부터 n-1까지 숫자를 생성하는 제너레이터"""
    for i in range(n):
        yield i

for num in number_generator(5):
    print(f"생성된 숫자: {num}")