IT & Programming/python

파이썬 기본 매개변수(함수전달값)

오스카리 2025. 5. 17. 21:47

파이썬에서 함수 정의 시 사용할 수 있는 기본 매개변수 값(Default Parameter Value)
함수를 호출할 때 인자를 생략해도 기본값을 사용하도록 만드는 기능입니다.

이는 함수의 유연성을 높이는 핵심 문법 중 하나입니다. 아래에 개념, 문법, 예제 코드, 작동 방식, 주의사항을 상세하게 설명하겠습니다.


1. 기본 매개변수 값이란?

정의:

함수를 정의할 때 매개변수에 기본값을 설정해두면, 함수 호출 시 그 값을 생략해도
자동으로 기본값을 사용하게 되는 기능입니다.

문법:

def 함수명(매개변수1=기본값1, 매개변수2=기본값2):
    ...

2. 기본 매개변수 사용 예제

def greet(name, message="안녕하세요"):
    print(f"{name}님, {message}")

함수 호출 예

greet("홍길동")               # 기본 메시지 사용
greet("김영희", "반갑습니다")  # 직접 메시지 지정

출력 결과

홍길동님, 안녕하세요
김영희님, 반갑습니다

3. 작동 원리

  • message="안녕하세요" 부분에서 message에 기본값을 할당한 상태
  • 만약 greet() 호출 시 message 값을 생략하면 "안녕하세요"가 자동으로 들어감

4. 여러 개의 매개변수 조합

def order(menu, count=1, size="M"):
    print(f"{menu} {count}개 - 사이즈: {size}")

사용 예

order("아메리카노")              # count=1, size="M"
order("라떼", 2)                 # size="M" 유지
order("카푸치노", 3, "L")        # 모든 매개변수 직접 지정

출력 결과

아메리카노 1개 - 사이즈: M
라떼 2개 - 사이즈: M
카푸치노 3개 - 사이즈: L

5. 주의할 점

1) 기본값은 반드시 뒤에서부터 설정해야 함

잘못된 예:

def test(x=5, y):  # 오류 발생
    ...

오류 메시지:

SyntaxError: non-default argument follows default argument

이유: 기본값이 있는 매개변수 뒤에는 기본값이 없는 매개변수를 둘 수 없음

올바른 예:

def test(y, x=5):
    ...

2) 기본값으로 mutable 객체 (list, dict 등) 사용 시 주의

예제:

def add_item(item, container=[]):
    container.append(item)
    return container

이렇게 하면 함수 호출 시마다 list가 공유되어 버그 발생 가능성 있음

수정된 안전한 버전:

def add_item(item, container=None):
    if container is None:
        container = []
    container.append(item)
    return container

6. 실전 응용 예제: 이메일 전송 함수

def send_email(to, subject="제목 없음", content="내용이 없습니다."):
    print(f"[To] {to}")
    print(f"[Subject] {subject}")
    print(f"[Content] {content}")

호출 예

send_email("test@example.com")
send_email("user@example.com", content="메일 내용만 보냄")

7. 요약 정리

구분 설명

정의 인자를 생략해도 기본값으로 대체 가능
위치 항상 뒤쪽부터 설정해야 함
장점 함수 유연성 향상, 인자 생략 허용
주의 list, dict 같은 변경 가능한 객체 기본값 사용 자제

 

아래는 기본 매개변수값과 함께 가변 인자 (*args, **kwargs) 를 사용하는 확장 설명입니다.
이 조합은 실무에서 함수에 전달되는 인자의 수나 형태가 유동적인 경우 매우 유용하게 사용됩니다.


1. 용어 정리

문법 의미 설명

*args 위치 인자 모음 여러 개의 인자를 튜플 형태로 전달받음
**kwargs 키워드 인자 모음 여러 개의 키워드 인자를 딕셔너리 형태로 전달받음
기본값 선택적 인자 처리 생략 가능하게 기본값 설정

2. 기본값 + *args 사용 예제

함수 정의

def print_items(title="리스트", *items):
    print(f"[{title}]")
    for item in items:
        print(f"- {item}")

호출 예

print_items("장바구니", "사과", "바나나", "오렌지")
print_items("할 일 목록")

출력 결과

[장바구니]
- 사과
- 바나나
- 오렌지

[할 일 목록]

설명

  • title은 기본값이 있으며, 필요 시 변경 가능
  • *items는 개수 제한 없이 인자를 받을 수 있음 (튜플로 받음)

3. 기본값 + **kwargs 사용 예제

함수 정의

def create_user(name, age=18, **extra_info):
    print(f"이름: {name}")
    print(f"나이: {age}")
    for key, value in extra_info.items():
        print(f"{key}: {value}")

호출 예

create_user("홍길동", email="hong@test.com", city="Seoul")
create_user("김영희", age=25, hobby="reading")

출력 결과

이름: 홍길동
나이: 18
email: hong@test.com
city: Seoul

이름: 김영희
나이: 25
hobby: reading

설명

  • name은 필수 인자
  • age는 기본값 설정
  • **extra_info는 키-값 쌍 형태로 확장 인자를 모두 수용

4. 기본값 + *args + **kwargs 혼합 예제

def log_event(event="DEFAULT", *args, **kwargs):
    print(f"[이벤트]: {event}")
    print("[데이터]:", args)
    print("[추가 정보]:", kwargs)

호출 예

log_event("사용자 로그인", "user123", "성공", ip="192.168.0.1", browser="Chrome")

출력 결과

[이벤트]: 사용자 로그인
[데이터]: ('user123', '성공')
[추가 정보]: {'ip': '192.168.0.1', 'browser': 'Chrome'}

5. 함수 정의 시 매개변수 순서 규칙

파이썬 함수 정의에서 매개변수는 반드시 다음 순서를 따라야 합니다:

  1. 위치 인자 (예: a)
  2. 기본값 있는 위치 인자 (예: b=1)
  3. 가변 위치 인자 *args
  4. 키워드 전용 인자 (예: c → def func(*args, c) 형태로 강제됨)
  5. 기본값 있는 키워드 인자
  6. 가변 키워드 인자 **kwargs

예시 (정상적 정의)

def example(a, b=0, *args, c=1, **kwargs):
    ...

6. 실전 응용 예제: 로그 기록 함수

def save_log(message, level="INFO", *tags, **metadata):
    print(f"[{level}] {message}")
    if tags:
        print("태그:", ", ".join(tags))
    if metadata:
        print("추가 정보:")
        for key, value in metadata.items():
            print(f" - {key}: {value}")

호출 예

save_log("사용자 로그인 시도", "WARN", "login", "auth", ip="192.168.0.1", user="admin")

요약 정리

문법 설명 예시

매개변수=기본값 기본값 지정 level="INFO"
*args 위치 인자 여러 개 ("login", "auth")
**kwargs 키워드 인자 여러 개 ip="...", user="..."

 

반응형