CodeGym /행동 /Python SELF KO /함수 매개변수의 고급 사용법

함수 매개변수의 고급 사용법

Python SELF KO
레벨 14 , 레슨 3
사용 가능

7.1 함수 인자 모두 받기

Python에서는 함수 내부에서 전달된 모든 매개변수를 얻을 수 있는 몇 가지 아주 편리한 방법이 있어. 함께 살펴보자.

*args 사용하기

*args는 변수 개수의 위치(일반) 인자를 함수에 전달할 수 있게 해줘. 이 인자들은 튜플로 패킹되어 함수 내부에서 처리될 수 있어.


def print_numbers(*args):
    for arg in args:
        print(arg)
        
print_numbers(1, 2, 3, 4, 5)

설명

print_numbers 함수는 튜플 args에 패킹된 임의의 개수의 위치 인자를 받아. 우리는 for 루프를 사용해 함수 내부에서 인자들을 반복할 수 있어.

장점

  • 유연성: 함수에 임의의 개수의 인자를 전달할 수 있어.
  • 범용성: 매개변수 수가 불확실한 함수에 사용할 수 있어.

**kwargs 사용하기

**kwargs는 변수 개수의 이름이 있는 인자를 함수에 전달할 수 있게 해줘. 이 인자들은 딕셔너리로 패킹되어 함수 내부에서 처리될 수 있어.


def print_person_info(**kwargs):
    for key, value in kwargs.items():
        print(f"{key}: {value}")
        
print_person_info(name="Alice", age=30, city="New York")

설명

print_person_info 함수는 딕셔너리 kwargs에 패킹된 임의의 수의 이름 있는 인자를 받아. 우리는 딕셔너리 메소드 items()를 사용해 함수 내부에서 인자들을 반복할 수 있어.

장점

  • 유연성: 함수에 임의의 개수의 이름이 있는 인자를 전달할 수 있어.
  • 가독성: 이름 있는 인자는 함수 호출을 더 읽기 쉽게 만들어줘.

7.2 인자의 타입 고정하기

오직 위치 인자

Python 3.8 이상에서는 오직 위치로만 전달할 수 있는 위치 인자를 가진 함수를 정의할 수 있어. 함수 정의에서 기호 /을 사용해 이걸 할 수 있어.


def greet(name, /, greeting="Hello"):
    print(f"{greeting}, {name}!")
        
greet("Alice")  # 출력: Hello, Alice!
greet("Alice", greeting="Hi")  # 출력: Hi, Alice!
# greet(name="Alice")  # 오류: TypeError

설명

greet 함수는 오직 위치로만 전달할 수 있는 인자 name을 받아. 인자들은 / 앞에 위치로만 전달될 수 있어.

이 방법은 인자 전달 방식을 제한하여, 가독성을 개선하고 오류를 방지할 수 있게 해줘.

오직 이름 있는 인자 (Keyword-Only Arguments)

오직 이름으로만 전달할 수 있는 함수 매개변수도 정의할 수 있어. 함수 정의에서 기호 *를 사용해 이걸 할 수 있어.


def greet(*, name, greeting="Hello"):
    print(f"{greeting}, {name}!")
        
greet(name="Alice")  # 출력: Hello, Alice!
greet(name="Alice", greeting="Hi")  # 출력: Hi, Alice!
# greet("Alice")  # 오류: TypeError

greet 함수는 오직 이름으로만 전달할 수 있는 인자 name을 받아. 인자들은 * 뒤에 이름으로만 전달될 수 있어.

이 방법은 인자 이름을 명시적으로 지정하게 강제하여 코드의 가독성을 개선해줘.

위치와 이름 있는 인자 결합하기

최대한의 유연성을 위해 위치와 이름 있는 인자를 결합할 수도 있어.


def greet(name, /, *, greeting="Hello"):
    print(f"{greeting}, {name}!")
        
greet("Alice")  # 출력: Hello, Alice!
greet("Alice", greeting="Hi")  # 출력: Hi, Alice!
# greet(name="Alice")  # 오류: TypeError

greet 함수는 오직 위치로만 전달할 수 있는 인자 name과 이름으로 반드시 전달해야 하는 인자 greeting을 가져. /*를 사용하면 위치와 이름 있는 인자를 결합할 수 있어.

세 가지 모든 상황의 전체 예제:


def full_example(a, b, /, c, d, *, e, f):
    print(f"a={a}, b={b}, c={c}, d={d}, e={e}, f={f}")
        
# 다양한 인자와 같이 함수를 호출
full_example(1, 2, 3, 4, e=5, f=6)  # 모든 인자가 올바르게 전달됨
# full_example(a=1, b=2, c=3, d=4, e=5, f=6)  # 오류: TypeError

설명

  • 오직 위치 인자: ab는 오직 위치로만 전달해야 해.
  • 일반 위치 또는 이름 있는 인자: cd는 위치로도 이름으로도 전달할 수 있어.
  • 오직 이름 있는 인자: ef는 오직 이름으로만 전달해야 해.
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION