파이썬 함수 정의하기

파이썬 함수 정의하기

같은 일을 여러 번 반복하게 되면 그 로직을 함수로 묶고 싶어져요. 파이썬은 def 키워드로 함수를 정의해요. 함수 이름, 매개변수 목록, 본문으로 구성되고, 선택적으로 반환값을 돌려줘요. 이 장은 함수 정의부터 기본값·키워드 인자 같은 고급 기능까지 다뤄요.

출처: 6. Defining Functions

함수 정의는 def 키워드로 시작해요. 함수 이름 뒤에 괄호로 감싼 매개변수 목록이 오고, 콜론 뒤에 들여쓴 함수 본문이 와요. return 문이 함수를 끝내고 값을 돌려주는데, return이 없으면 None을 돌려줘요.

>>> def fib(n):    # write Fibonacci series up to n
...     """Print a Fibonacci series up to n."""
...     a, b = 0, 1
...     while a < n:
...         print(a, end=' ')
...         a, b = b, a+b
...     print()
...
>>> fib(2000)
0 1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987 1597

함수 본문의 첫 줄에 따옴표로 감싼 문자열을 넣으면 이게 **독스트링(docstring)**이 돼요. 함수의 목적을 설명하는 문서 역할이자, 도구들이 함수 정보를 보여줄 때 참조하는 대상이에요. 파이썬 커뮤니티는 항상 독스트링을 쓰는 걸 권장해요.

기본값 인자

함수 매개변수에 기본값을 지정할 수 있어요. 함수를 호출할 때 그 인자를 생략하면 기본값이 사용돼요. 주의할 점은 기본값은 함수 실행이 아니라 정의 시점에 한 번 평가된다는 거예요. 그래서 가변 객체를 기본값으로 쓰면 의도와 다르게 동작할 수 있어요.

def ask_ok(prompt, retries=4, reminder='Please try again!'):
    while True:
        reply = input(prompt)
        if reply in {'y', 'ye', 'yes'}:
            return True
        if reply in {'n', 'no', 'nop', 'nope'}:
            return False
        retries = retries - 1
        if retries < 0:
            raise ValueError('invalid user response')
        print(reminder)

키워드 인자

함수는 위치 인자(positional)로도, kwarg=value 형태의 키워드 인자(keyword)로도 호출할 수 있어요. 키워드 인자는 이름으로 값을 전달하니, 어떤 인자가 어디에 들어가는지 명확해져요.

def parrot(voltage, state='a stiff', action='voom', type='Norwegian Blue'):
    ...

파라미터 앞에 *를 붙이면 그 이후는 키워드 전용(keyword-only)이 돼요. **를 붙이면 여러 키워드 인자를 딕셔너리로, * 하나면 여러 위치 인자를 튜플로 받을 수 있어요.

def cheeseshop(kind, *arguments, **keywords):
    ...

람다 표현식

lambda 키워드로 이름 없는 작은 함수를 만들 수 있어요. sort 같은 곳에서 정렬 키 함수로 흔히 쓰여요.

>>> pairs = [(1, 'one'), (2, 'two'), (3, 'three'), (4, 'four')]
>>> pairs.sort(key=lambda pair: pair[1])
>>> pairs
[(4, 'four'), (1, 'one'), (3, 'three'), (2, 'two')]

도큐멘테이션과 어노테이션

함수에는 독스트링으로 문서를 달고, 파라미터·반환값에 **타입 어노테이션(type annotation)**을 붙일 수 있어요. 어노테이션은 실행 시 강제하지 않지만, 코드의 의도를 드러내고 도구의 힌트가 돼요.

def f(ham: str, eggs: str = 'eggs') -> str:
    print("Annotations:", f.__annotations__)
    print("Arguments:", ham, eggs)
    return ham + ' and ' + eggs

정리하면, 파이썬 함수는 def로 시작해 return으로 끝나고, 기본값·키워드 인자·람다·독스트링·어노테이션까지 상황에 맞춰 조합할 수 있어요. 이 장이 그 핵심 기능들을 하나씩 짚어 주는 역할을 해요.

더 알아보기