Skip to main content

함수 정의하기

학습 목표

  • def 키워드로 함수를 정의하고 호출할 수 있다
  • return 문으로 값을 반환하고, 다중 반환값을 사용할 수 있다
  • docstring으로 함수를 문서화할 수 있다
  • 기본값 매개변수를 올바르게 사용할 수 있다

왜 중요한가

함수는 프로그래밍의 가장 기본적인 추상화 단위입니다. 잘 설계된 함수는 코드의 재사용성과 가독성을 크게 높입니다. ML/DL에서 데이터 전처리, 모델 학습, 평가 등 모든 단계가 함수 단위로 구성됩니다.

함수 정의와 호출

# 함수 정의
def greet(name):
    """인사 메시지를 출력합니다."""
    print(f"안녕하세요, {name}님!")

# 함수 호출
greet("김철수")      # 안녕하세요, 김철수님!
greet("이영희")      # 안녕하세요, 이영희님!

매개변수와 인자

def add(a, b):        # a, b: 매개변수 (Parameter)
    return a + b

result = add(3, 5)    # 3, 5: 인자 (Argument)
print(result)          # 8
용어위치설명
매개변수 (Parameter)함수 정의함수가 받을 값의 이름
인자 (Argument)함수 호출실제로 전달하는 값

return 문

# 값 반환
def square(x):
    return x ** 2

result = square(5)
print(result)  # 25

# return 없는 함수 -> None 반환
def print_hello():
    print("Hello")

result = print_hello()
print(result)  # None

# 조건부 반환
def absolute(x):
    if x >= 0:
        return x
    return -x

# 조기 반환 (Early Return) 패턴
def divide(a, b):
    if b == 0:
        return None  # 조기 반환으로 에러 방지
    return a / b

다중 반환값

# 튜플로 여러 값 반환
def min_max(numbers):
    return min(numbers), max(numbers)

low, high = min_max([3, 1, 4, 1, 5, 9])
print(f"최소: {low}, 최대: {high}")  # 최소: 1, 최대: 9

# 딕셔너리로 반환 (이름이 있는 반환값)
def analyze_text(text):
    words = text.split()
    return {
        "word_count": len(words),
        "char_count": len(text),
        "unique_words": len(set(words))
    }

stats = analyze_text("hello world hello")
print(stats)  # {"word_count": 3, "char_count": 17, "unique_words": 2}

기본값 매개변수

# 기본값 설정
def greet(name, greeting="안녕하세요"):
    print(f"{greeting}, {name}님!")

greet("김철수")                    # 안녕하세요, 김철수님!
greet("이영희", "반갑습니다")       # 반갑습니다, 이영희님!

# ML 관련 기본값 예제
def train(model, epochs=10, lr=0.001, batch_size=32):
    print(f"학습 설정: epochs={epochs}, lr={lr}, batch_size={batch_size}")

train(model)                           # 모든 기본값 사용
train(model, epochs=50, lr=0.01)       # 일부만 변경
기본값으로 가변 객체(리스트, 딕셔너리)를 사용하면 안 됩니다! 함수 정의 시 한 번만 생성되어 모든 호출에서 공유됩니다.
# 잘못된 예
def append_to(item, target=[]):
    target.append(item)
    return target

print(append_to(1))   # [1]
print(append_to(2))   # [1, 2]  <- 예상: [2]

# 올바른 방법
def append_to(item, target=None):
    if target is None:
        target = []
    target.append(item)
    return target

print(append_to(1))   # [1]
print(append_to(2))   # [2]  <- 정상!

Docstring

docstring은 함수의 목적, 매개변수, 반환값을 설명하는 문서화 문자열입니다.
def calculate_bmi(weight, height):
    """체질량지수(BMI)를 계산합니다.

    Args:
        weight: 체중 (kg)
        height: 키 (m)

    Returns:
        BMI 값 (float)

    Raises:
        ValueError: 체중이나 키가 0 이하인 경우

    Examples:
        >>> calculate_bmi(70, 1.75)
        22.857142857142858
    """
    if weight <= 0 or height <= 0:
        raise ValueError("체중과 키는 양수여야 합니다")
    return weight / (height ** 2)

# docstring 확인
help(calculate_bmi)
print(calculate_bmi.__doc__)

함수는 객체다

Python에서 함수는 일급 객체(First-class Object)입니다. 변수에 할당하고, 인자로 전달하고, 반환값으로 사용할 수 있습니다.
# 변수에 할당
def square(x):
    return x ** 2

f = square
print(f(5))   # 25

# 함수를 인자로 전달
def apply(func, value):
    return func(value)

print(apply(square, 4))   # 16
print(apply(len, "hello"))  # 5

# 리스트에 함수 저장
operations = [square, abs, len]
for op in operations:
    print(op.__name__)

AI/ML에서의 활용

# 데이터 전처리 함수
def preprocess(text, lowercase=True, strip=True, remove_digits=False):
    """텍스트를 전처리합니다."""
    if strip:
        text = text.strip()
    if lowercase:
        text = text.lower()
    if remove_digits:
        text = "".join(c for c in text if not c.isdigit())
    return text

# 평가 지표 함수
def accuracy(y_true, y_pred):
    """정확도를 계산합니다."""
    correct = sum(1 for t, p in zip(y_true, y_pred) if t == p)
    return correct / len(y_true)

y_true = [1, 0, 1, 1, 0]
y_pred = [1, 0, 0, 1, 0]
print(f"정확도: {accuracy(y_true, y_pred):.1%}")  # 정확도: 80.0%
동사 + 명사 조합이 좋습니다. get_data(), calculate_loss(), save_model() 등. Python은 snake_case를 사용합니다.
일반적으로 한 화면(20-30줄) 이내를 권장합니다. 하나의 함수는 하나의 작업만 수행해야 합니다(단일 책임 원칙).

체크리스트

  • def로 함수를 정의하고 호출할 수 있다
  • return으로 값을 반환하고, 다중 반환값을 사용할 수 있다
  • 기본값 매개변수의 가변 객체 함정을 이해한다
  • Google 스타일 docstring을 작성할 수 있다

다음 문서