파이썬 함수 심화 - 매개변수와 기본값 한 번에 정리
지난 글에서 함수 만드는 법을 익히셨는데, 막상 써보니까 좀 귀찮은 부분이 있지 않으셨나요?
호출할 때마다 인자를 전부 다 넣어줘야 하고, 순서도 정확히 맞춰야 하고. 하나라도 빼먹으면 빨간 에러가 떡하니 뜨고요. 저도 처음엔 "함수가 편하다더니 이게 뭐야" 싶었거든요.
근데 파이썬은 이걸 훨씬 유연하게 호출하는 방법을 마련해뒀어요. 오늘은 그 얘기를 해볼게요.
매개변수와 인자, 용어부터 가볍게
자주 헷갈리는 두 단어부터 정리할게요.
- 매개변수(parameter): 함수를 정의할 때 괄호 안에 적는 이름
- 인자(argument): 함수를 호출할 때 실제로 넣는 값
def greet(name): # name은 매개변수
print(f"안녕, {name}")
greet("지훈") # "지훈"은 인자
솔직히 둘을 엄격히 구분 안 하고 그냥 "함수에 넣는 거"라고 이해하셔도 코딩하는 데는 지장 없어요. 다만 책이나 에러 메시지에서 이 단어들이 튀어나올 때 당황만 안 하시면 됩니다.
python 기본값으로 함수 호출 줄이기
이제 본론이에요. 기본값 매개변수라는 녀석입니다.
매개변수에 미리 값을 정해두면, 호출할 때 안 넘겨도 알아서 그 값을 쓰는 기능이거든요.
def greet(name, greeting="안녕"): # greeting에 기본값 지정
print(f"{greeting}, {name}님!")
greet("지훈") # 기본값 "안녕" 사용
greet("민지", "반가워요") # 기본값 대신 "반가워요"
실행 결과:
안녕, 지훈님!
반가워요, 민지님!
별거 아닌 것 같아도 막상 써보면 진짜 편해요. 자주 쓰는 값을 기본으로 깔아두고, 필요할 때만 바꿔주면 되거든요.
키워드 인자 - 카페 주문서처럼 부르기
함수 호출을 카페 주문에 비유해볼게요.
"아메리카노 라지 핫" 이렇게 순서대로 외치는 게 위치 인자예요. 빠르긴 한데 순서를 헷갈리면 망해요.
반대로 "메뉴는 아메리카노, 사이즈는 라지, 온도는 따뜻하게요"라고 하나씩 짚어 부르는 게 키워드 인자고요.
def book_room(date, name, people=1):
print(f"{date}에 {name}님 {people}명 예약")
# 매개변수 이름을 직접 지정해서 전달
book_room(name="지훈", date="2026-05-01", people=2)
실행 결과:
2026-05-01에 지훈님 2명 예약
매개변수 이름을 직접 적으니까 순서를 바꿔도 잘 작동하잖아요. 그리고 코드를 나중에 다시 봤을 때 "이 값이 뭐였더라" 하는 일도 줄어들어요.
위치와 키워드 섞어 쓰기
둘을 섞어 쓰는 것도 가능합니다. 단, 위치 인자가 먼저, 키워드 인자가 뒤에 와야 해요.
def order(menu, size="미디엄", temp="hot"):
print(f"{menu} / {size} / {temp}")
order("아메리카노") # 기본값만 사용
order("라떼", size="라지") # 일부만 키워드로
order("녹차", temp="ice", size="스몰") # 키워드끼리는 순서 무관
args, *kwargs 맛보기
가끔 인자를 몇 개 받을지 모를 때가 있어요. 그럴 때 쓰는 게 *args와 **kwargs입니다.
이름 앞에 별 하나가 붙으면 위치 인자를 묶어서 받아요.
def sum_all(*nums): # 들어온 값들이 nums에 튜플로 묶임
return sum(nums)
print(sum_all(1, 2, 3)) # 6
print(sum_all(10, 20, 30, 40)) # 100
별 두 개가 붙으면 키워드 인자들을 딕셔너리로 받고요.
def print_info(**info): # 키=값 쌍이 info에 딕셔너리로 묶임
for key, value in info.items():
print(f"{key}: {value}")
print_info(이름="지훈", 나이=25, 도시="서울")
args, kwargs라는 이름은 그냥 관습이에요. *nums, **options 이런 식으로 자유롭게 지어도 돼요. 핵심은 별이 한 개냐 두 개냐, 그거예요.
처음에 자주 하는 실수
기본값 매개변수는 뒤로 몰아주세요
def func(a=1, b): # SyntaxError!
pass
기본값이 있는 매개변수 뒤에 일반 매개변수가 오면 에러가 나요. "기본값은 뒤쪽에 모아둔다", 이거 하나만 기억하시면 됩니다.
가변 기본값 함정
이건 좀 무서운 함정인데, 한 번은 짚고 가야 해요.
def add_item(item, basket=[]): # 위험!
basket.append(item)
return basket
이렇게 빈 리스트 []를 기본값으로 쓰면, 호출할 때마다 같은 리스트가 재사용되면서 결과가 누적돼요. 처음 보면 "이게 왜 이래?" 싶으실 거예요.
해결법은 간단합니다. 기본값으로 빈 리스트나 빈 딕셔너리 대신 None을 쓰고, 함수 안에서 새로 만들어주세요.
def add_item(item, basket=None):
if basket is None:
basket = [] # 호출할 때마다 새로 만들기
basket.append(item)
return basket
원리까지 깊게 파고들지 않아도 괜찮아요. "리스트 기본값은 위험하다, None 쓰자" 이거 하나만 기억해두세요.
실습 과제
영수증 출력 함수를 직접 만들어보세요.
def print_receipt(customer, *items, **options):
print(f"--- {customer}님 영수증 ---")
for item in items: # *items: 메뉴들이 튜플로
print(f"- {item}")
if options: # **options: 옵션이 딕셔너리로
print("[옵션]")
for key, value in options.items():
print(f"{key}: {value}")
print_receipt("지훈", "아메리카노", "치즈케이크", 결제="카드", 포인트적립=True)
직접 돌려보시고 메뉴 개수를 늘려보거나 옵션을 더 추가해보세요. 별 한 개와 별 두 개의 차이가 손으로 익혀질 거예요.
함수를 좀 더 유연하게 다룰 수 있게 됐죠? 이제 함수 하나도 꽤 똑똑하게 만들 수 있어요.
근데 사실 좋은 함수는 굳이 우리가 다 만들 필요가 없어요. 이미 다른 사람이 만들어둔 좋은 함수가 엄청 많거든요. 다음 글에서는 그걸 가져다 쓰는 방법, 즉 모듈과 import를 다뤄볼게요. 파이썬이 왜 그렇게 강력한지 그때부터 진짜 체감하실 거예요.
제 글이 도움이 되셨다면 댓글 & 공감 부탁드려요 😀
'Application > Python' 카테고리의 다른 글
| [Python] 파이썬 파일 읽기와 쓰기: open, read, write 한 번에 정리 (0) | 2026.05.04 |
|---|---|
| [Python] 파이썬 모듈과 import 사용법, 남이 만든 도구 가져다 쓰기 (0) | 2026.04.30 |
| [Python] 파이썬 함수 기초: def로 만들고 return으로 돌려받기 (0) | 2026.04.27 |
| [Python] 파이썬 튜플과 딕셔너리, 한 번에 정리 (0) | 2026.04.23 |
| [Python] 파이썬 리스트 완벽 정리: 초보도 한 번에 이해하는 python list 사용법 (0) | 2026.04.22 |