웹사이트 검색

Python 3에서 *args 및 **kwargs를 사용하는 방법


소개

In 매개변수는 지정된 함수가 허용할 수 있는 인수를 지정하는 명명된 엔티티입니다.

프로그래밍할 때 코드의 가능한 모든 사용 사례를 인식하지 못할 수 있으며 모듈로 작업하는 미래의 프로그래머 또는 코드와 상호 작용하는 사용자를 위해 더 많은 옵션을 제공하고 싶을 수 있습니다. 코드에서 *args**kwargs를 사용하여 가변 개수의 인수를 함수에 전달할 수 있습니다.

전제 조건

컴퓨터나 서버에 Python 3가 설치되어 있고 프로그래밍 환경이 설정되어 있어야 합니다. 프로그래밍 환경이 설정되지 않은 경우 운영 체제(Ubuntu, CentOS, Debian 등)에 적합한 서버의 프로그래밍 환경에 대한 설치 및 설정 가이드를 참조할 수 있습니다.

*args 이해

Python에서 *args의 단일 별표 형식은 키워드가 없는 가변 길이 인수 목록을 함수에 보내는 매개 변수로 사용할 수 있습니다. 별표(*)가 여기에서 중요한 요소라는 점은 주목할 가치가 있습니다. args라는 단어는 언어에 의해 시행되지는 않지만 확립된 기존 관용구이기 때문입니다.

정보: 이 자습서의 예제 코드를 따라하려면 python3 명령을 실행하여 로컬 시스템에서 Python 대화형 셸을 엽니다. 그런 다음 >>> 프롬프트 뒤에 추가하여 예제를 복사, 붙여넣기 또는 편집할 수 있습니다.

두 개의 인수를 사용하는 일반적인 함수를 살펴보겠습니다.

def multiply(x, y):
    print (x * y)

위의 코드에서 xy를 인수로 사용하여 함수를 빌드한 다음 함수를 호출할 때 x에 해당하는 숫자를 사용해야 합니다. y. 이 경우 x에 대해 정수 5를 전달하고 y에 대해 정수 4를 전달합니다.

def multiply(x, y):
    print (x * y)

multiply(5, 4)

이제 위의 코드를 실행할 수 있습니다.

  1. python lets_multiply.py

multiply(x,y) 함수에 따라 정수 5와 4가 곱해졌음을 보여주는 다음 출력을 받게 됩니다.

Output
20

나중에 2가 아닌 3개의 숫자를 곱하기로 결정하면 어떻게 될까요? 아래와 같이 함수에 숫자를 추가하려고 하면 오류가 발생합니다.

def multiply(x, y):
    print (x * y)

multiply(5, 4, 3)
Output
TypeError: multiply() takes 2 positional arguments but 3 were given

따라서 나중에 더 많은 인수를 사용해야 할 것 같으면 *args를 매개변수로 대신 사용할 수 있습니다.

함수 매개변수로 xy를 제거하고 대신 *args :

def multiply(*args):
    z = 1
    for num in args:
        z *= num
    print(z)

multiply(4, 5)
multiply(10, 9)
multiply(2, 3, 4)
multiply(3, 5, 10, 6)

이 코드를 실행하면 다음 각 함수 호출에 대한 제품을 받게 됩니다.

Output
20 90 24 900

가변 길이 인수 목록을 함수에 보내기 위해 *args를 사용했기 때문에 원하는 만큼 많은 인수를 함수 호출에 전달할 수 있었습니다.

*args를 사용하면 함수 내에서 다양한 양의 비키워드 인수를 허용하는 보다 유연한 코드를 만들 수 있습니다.

**kwargs 이해하기

**kwargs의 이중 별표 형식은 키워드 가변 길이 인수 사전을 함수에 전달하는 데 사용됩니다. 다시 말하지만, 두 개의 별표(**)는 kwargs라는 단어가 언어에 의해 강제되지는 않지만 일반적으로 사용되기 때문에 여기서 중요한 요소입니다.

*args와 마찬가지로 **kwargs는 제공하려는 많은 인수를 사용할 수 있습니다. 그러나 **kwargs는 키워드를 할당해야 한다는 점에서 *args와 다릅니다.

먼저 함수에 전달하는 **kwargs 인수를 인쇄해 보겠습니다. 이를 위해 짧은 함수를 만들 것입니다.

def print_kwargs(**kwargs):
        print(kwargs)

다음으로 함수에 전달된 몇 가지 키워드 인수를 사용하여 함수를 호출합니다.

def print_kwargs(**kwargs):
        print(kwargs)

print_kwargs(kwargs_1="Shark", kwargs_2=4.5, kwargs_3=True)

위의 프로그램을 실행하고 출력을 살펴보겠습니다.

  1. python print_kwargs.py
Output
{'kwargs_3': True, 'kwargs_2': 4.5, 'kwargs_1': 'Shark'}

현재 사용 중인 Python 3 버전에 따라 사전 데이터 유형이 정렬되지 않을 수 있습니다. Python 3.6 이상에서는 키-값 쌍을 순서대로 받지만 이전 버전에서는 쌍이 임의의 순서로 출력됩니다.

주목해야 할 중요한 점은 kwargs라는 사전이 생성되고 다른 사전으로 작업할 수 있는 것처럼 작업할 수 있다는 것입니다.

**kwargs를 사용하는 방법을 보여주는 또 다른 짧은 프로그램을 만들어 봅시다. 여기서 우리는 이름 사전을 환영하는 함수를 만들 것입니다. 먼저 두 이름의 사전으로 시작합니다.

def print_values(**kwargs):
    for key, value in kwargs.items():
        print("The value of {} is {}".format(key, value))

print_values(my_name="Sammy", your_name="Casey")

이제 프로그램을 실행하고 출력을 볼 수 있습니다.

  1. python print_values.py
Output
The value of your_name is Casey The value of my_name is Sammy

다시 말하지만 사전은 순서가 지정되지 않을 수 있으므로 Casey라는 이름이 먼저 출력되거나 Sammy라는 이름이 먼저 출력될 수 있습니다.

이제 함수에 추가 인수를 전달하여 **kwargs가 포함하려는 많은 인수를 허용함을 보여줍시다.

def print_values(**kwargs):
    for key, value in kwargs.items():
        print("The value of {} is {}".format(key, value))

print_values(
            name_1="Alex",
            name_2="Gray",
            name_3="Harper",
            name_4="Phoenix",
            name_5="Remy",
            name_6="Val"
        )

이 시점에서 프로그램을 실행하면 다음과 같은 출력이 표시되며 다시 정렬되지 않을 수 있습니다.

Output
The value of name_2 is Gray The value of name_6 is Val The value of name_4 is Phoenix The value of name_5 is Remy The value of name_3 is Harper The value of name_1 is Alex

**kwargs를 사용하면 프로그램에서 키워드 인수를 유연하게 사용할 수 있습니다. **kwargs를 매개변수로 사용하면 최종적으로 함수에 전달할 인수 수를 알 필요가 없습니다.

인수 순서 지정

함수 또는 함수 호출 내에서 인수를 정렬할 때 인수는 특정 순서로 발생해야 합니다.

  1. 정식 위치 인수
  2. *args
  3. 키워드 인수
  4. **kwargs

실제로 *args**kwargs와 함께 명시적 위치 매개변수로 작업할 때 함수는 다음과 같습니다.

def example(arg_1, arg_2, *args, **kwargs):
...

그리고 *args**kwargs 외에 명명된 키워드 매개변수와 함께 위치 매개변수로 작업할 때 함수는 다음과 같습니다.

def example2(arg_1, arg_2, *args, kw_1="shark", kw_2="blobfish", **kwargs):
...

Python 코드에서 구문 오류가 발생하지 않도록 함수를 만들 때 인수의 순서를 염두에 두는 것이 중요합니다.

함수 호출에서 *args 및 **kwargs 사용

*args**kwargs를 사용하여 함수에 인수를 전달할 수도 있습니다.

먼저 *args가 있는 예를 살펴보겠습니다.

def some_args(arg_1, arg_2, arg_3):
    print("arg_1:", arg_1)
    print("arg_2:", arg_2)
    print("arg_3:", arg_3)

args = ("Sammy", "Casey", "Alex")
some_args(*args)

위의 함수에는 arg_1, arg_arg_3로 정의된 세 개의 매개 변수가 있습니다. 함수는 이러한 각 인수를 인쇄합니다. 그런 다음 iterable(이 경우 튜플)로 설정된 변수를 만들고 별표 구문을 사용하여 해당 변수를 함수에 전달할 수 있습니다.

python some_args.py 명령으로 프로그램을 실행하면 다음과 같은 결과가 나타납니다.

Output
arg_1: Sammy arg_2: Casey arg_3: Alex

위의 프로그램을 iterable 명명된 매개변수로 수정할 수도 있습니다.

def some_args(arg_1, arg_2, arg_3):
    print("arg_1:", arg_1)
    print("arg_2:", arg_2)
    print("arg_3:", arg_3)

my_list = [2, 3]
some_args(1, *my_list)

위의 프로그램을 실행하면 다음과 같은 결과가 출력됩니다.

Output
arg_1: 1 arg_2: 2 arg_3: 3

마찬가지로 키워드가 있는 **kwargs 인수를 사용하여 함수를 호출할 수 있습니다. 3개의 키-값 쌍이 있는 사전과 같은 변수를 설정하고(여기서는 kwargs를 사용하지만 원하는 대로 호출할 수 있음) 3개의 인수가 있는 함수에 전달합니다. :

def some_kwargs(kwarg_1, kwarg_2, kwarg_3):
    print("kwarg_1:", kwarg_1)
    print("kwarg_2:", kwarg_2)
    print("kwarg_3:", kwarg_3)

kwargs = {"kwarg_1": "Val", "kwarg_2": "Harper", "kwarg_3": "Remy"}
some_kwargs(**kwargs)

python some_kwargs.py 명령을 사용하여 위의 프로그램을 실행해 보겠습니다.

Output
kwarg_1: Val kwarg_2: Harper kwarg_3: Remy

함수를 호출할 때 *args**kwargs를 사용하여 인수를 전달할 수 있습니다.

결론

가변 개수의 인수를 함수에 전달하기 위해 함수 정의 내에서 *args**kwargs의 특수 구문을 사용할 수 있습니다.

*args**kwargs를 허용하는 생성 함수는 인수 목록 내의 입력 수가 상대적으로 적게 유지될 것으로 예상되는 상황에서 가장 잘 사용됩니다. *args**kwargs의 사용은 주로 가독성과 편의성을 제공하기 위한 것이지만 주의해서 사용해야 합니다.