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)
위의 코드에서 x
와 y
를 인수로 사용하여 함수를 빌드한 다음 함수를 호출할 때 x에 해당하는 숫자를 사용해야 합니다.
및 y
. 이 경우 x
에 대해 정수 5
를 전달하고 y
에 대해 정수 4
를 전달합니다.
def multiply(x, y):
print (x * y)
multiply(5, 4)
이제 위의 코드를 실행할 수 있습니다.
- python lets_multiply.py
multiply(x,y)
함수에 따라 정수 5와 4가 곱해졌음을 보여주는 다음 출력을 받게 됩니다.
Output20
나중에 2가 아닌 3개의 숫자를 곱하기로 결정하면 어떻게 될까요? 아래와 같이 함수에 숫자를 추가하려고 하면 오류가 발생합니다.
def multiply(x, y):
print (x * y)
multiply(5, 4, 3)
OutputTypeError: multiply() takes 2 positional arguments but 3 were given
따라서 나중에 더 많은 인수를 사용해야 할 것 같으면 *args
를 매개변수로 대신 사용할 수 있습니다.
함수 매개변수로 x
및 y
를 제거하고 대신 *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)
이 코드를 실행하면 다음 각 함수 호출에 대한 제품을 받게 됩니다.
Output20
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)
위의 프로그램을 실행하고 출력을 살펴보겠습니다.
- 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")
이제 프로그램을 실행하고 출력을 볼 수 있습니다.
- python print_values.py
OutputThe 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"
)
이 시점에서 프로그램을 실행하면 다음과 같은 출력이 표시되며 다시 정렬되지 않을 수 있습니다.
OutputThe 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
를 매개변수로 사용하면 최종적으로 함수에 전달할 인수 수를 알 필요가 없습니다.
인수 순서 지정
함수 또는 함수 호출 내에서 인수를 정렬할 때 인수는 특정 순서로 발생해야 합니다.
- 정식 위치 인수
*args
- 키워드 인수
**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
명령으로 프로그램을 실행하면 다음과 같은 결과가 나타납니다.
Outputarg_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)
위의 프로그램을 실행하면 다음과 같은 결과가 출력됩니다.
Outputarg_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
명령을 사용하여 위의 프로그램을 실행해 보겠습니다.
Outputkwarg_1: Val
kwarg_2: Harper
kwarg_3: Remy
함수를 호출할 때 *args
및 **kwargs
를 사용하여 인수를 전달할 수 있습니다.
결론
가변 개수의 인수를 함수에 전달하기 위해 함수 정의 내에서 *args
및 **kwargs
의 특수 구문을 사용할 수 있습니다.
*args
및 **kwargs
를 허용하는 생성 함수는 인수 목록 내의 입력 수가 상대적으로 적게 유지될 것으로 예상되는 상황에서 가장 잘 사용됩니다. *args
및 **kwargs
의 사용은 주로 가독성과 편의성을 제공하기 위한 것이지만 주의해서 사용해야 합니다.