함수는 이름이 붙은 단계 묶음이에요
같은 몇 줄을 두 번 이상 쓰고 있거나 — 작은 로직 덩어리에 이름을 붙이고 싶어지는 순간이라면 — 함수를 쓸 준비가 된 거예요. 함수는 파이썬 프로그램에서 복잡도를 관리하는 첫 번째 실전 도구입니다.
기본 모양:
하나씩 뜯어 보면:
def는 함수 정의를 시작하는 키워드예요.greet는 함수 이름이고요.(name)은 매개변수 목록 — 함수가 받는 입력이에요.- 콜론으로 헤더가 끝나고, 그 아래 들여쓰기된 블록이 본문이에요.
greet("Ada")는 _호출_이에요. 파이썬이name을"Ada"에 묶은 채로 본문을 실행합니다.
함수는 호출되기 전까지 잠들어 있어요. 정의해도 실행되지 않아요. greet("Ada")로 호출해야 비로소 돌아갑니다.
매개변수와 인자
매개변수(parameter) 는 함수 정의 안에 있는 이름이에요. 인자(argument) 는 호출할 때 넘기는 값이고요. 일상 대화에선 별거 아니지만, 에러 메시지를 읽을 때 이 구분이 도움이 돼요.
여기서 base와 exponent가 매개변수, 2와 10이 인자예요. 파이썬은 순서대로 바인딩해요: 첫 인자가 첫 매개변수로, 하는 식으로.
return: 값 돌려주기
print는 화면에 찍고, return은 호출자에게 값을 돌려줘서 쓸 수 있게 해줍니다:
return이 없으면 함수는 기본적으로 None을 반환해요:
return은 함수를 즉시 종료시키기도 해요. 본 로직에 들어가기 전에 경계 상황에서 조기 리턴하는 패턴을 자주 보게 됩니다:
조기 리턴은 본문이 if/else로 깊게 중첩되지 않게 해 줍니다.
기본 인자
매개변수에는 기본값을 줄 수 있어요. 호출자가 값을 주지 않으면 그게 쓰입니다:
기본값이 있는 매개변수는 기본값 없는 매개변수 뒤에 와야 해요. def f(a, b=1, c):는 문법 오류입니다.
가변 기본값 함정
파이썬의 가장 유명한 함정이에요. 보세요:
매 호출이 빈 리스트로 시작할 거라 기대하시겠지만, 기본 리스트가 호출 간에 공유돼서 아이템이 쌓여요. 파이썬은 기본값을 함수가 정의될 때 한 번 평가하고, 그 하나의 리스트를 계속 재사용해요.
안전한 패턴은 기본값으로 None을 쓰고 함수 안에서 리스트를 만드는 거예요:
이제 items를 넘기지 않은 호출은 매번 새 리스트를 받아요. 이 규칙은 리스트, 딕셔너리, 집합 — 모든 가변 타입에 적용돼요.
키워드 인자
위치 대신 이름으로 인자를 넘길 수 있어요. 중간 매개변수를 건너뛰거나 긴 호출을 읽기 좋게 만들 수 있게 해줍니다:
위치 인자와 키워드 인자를 섞을 수 있는데, 위치 인자가 반드시 먼저 와야 해요:
매개변수가 서너 개를 넘으면 키워드 인자를 선호하는 쪽이 호출을 훨씬 읽기 쉽게 만들어줘요.
위치 전용 · 키워드 전용 매개변수
파이썬에서는 일부 매개변수를 위치로만(/ 사용) 또는 키워드로만(* 사용) 넘기게 제한할 수 있어요:
첫날부터 필요한 건 아니에요. API를 설계하면서 호출자가 어떻게 써야 하는지 잠가두고 싶을 때 유용합니다.
Docstring과 이름 짓기
함수 안의 첫 줄은 docstring이 될 수 있어요 — 파이썬이 문서로 취급하는 삼중 따옴표 문자열이에요:
help(), IDE 툴팁, 문서 생성기 같은 도구들이 docstring을 자동으로 읽어줘요. 한 줄짜리라도 없는 것보다 훨씬 낫습니다.
그리고 제발, 이름은 신경 써서:
- 함수 이름은 동사예요:
fetch_profile,compute_total,is_valid. lower_snake_case를 쓰세요.- 불리언을 반환하는 함수는 보통
is_,has_,can_으로 시작해요.
좋은 이름은 호출하는 자리가 주석 없이도 스스로를 설명하게 만듭니다.
순수 함수가 추론하기 더 쉬워요
순수(pure) 함수는 같은 입력에 대해 같은 출력을 내고, 사이드 이펙트가 없어요 — 전역 상태를 바꾸지 않고, (디버깅 목적 외에는) stdout에 출력하지 않고, 파일에 쓰지 않는다는 뜻이에요.
각자 자리가 있지만, 재사용하고 테스트하고 싶은 코드라면 가능한 한 순수 함수 쪽으로 밀어붙이세요.
작은 실전 예제
기본값, 키워드 인자, return을 한 번에 쓰는 함수:
다음: 유연한 인자 리스트
함수가 몇 개의 인자와 함께 호출될지 미리 알 수 없거나 — 들어온 인자를 그대로 다른 함수로 전달하고 싶은 경우가 있어요. *args와 **kwargs가 그걸 해결해 줍니다. 다음 페이지에서 다룹니다.
자주 묻는 질문
파이썬에서 함수는 어떻게 정의하나요?
def 키워드에 이어 함수 이름, 매개변수를 감싸는 괄호, 콜론을 씁니다. 아래 들여쓰기된 블록이 함수 본문이에요. 예: def greet(name): print(f'Hi, {name}').
파이썬에서 return은 뭘 하나요?
return은 함수를 호출한 쪽으로 값을 돌려줍니다. 명시적인 return이 없는 함수는 자동으로 None을 반환해요. return이 실행되는 순간 함수가 바로 종료돼서, 같은 블록 내 뒤에 있는 코드는 건너뛰어집니다.
파이썬에서 기본 인자가 뭔가요?
매개변수에 미리 정해 둔 값을 주어서, 호출자가 값을 주지 않으면 그 값이 쓰이게 하는 거예요. def greet(name='friend'):라면 greet()를 인자 없이 부르면 'friend'가 쓰여요. [] 같은 가변 기본값은 절대 쓰지 마세요 — 안전한 패턴은 아래에서 설명합니다.