무엇 *args
을 **kwargs
의미합니까?
def foo(x, y, *args):
def bar(x, y, **kwargs):
무엇 *args
을 **kwargs
의미합니까?
def foo(x, y, *args):
def bar(x, y, **kwargs):
*args
and 는 파이썬 문서의 함수 정의**kwargs
에 대한 섹션에서 설명한 대로 함수에 임의의 수의 인수를 허용하는 일반적인 관용구 입니다.
*args
모든 함수 매개변수 를 튜플로 제공 합니다 .
def foo(*args):
for a in args:
print(a)
foo(1)
# 1
foo(1,2,3)
# 1
# 2
# 3
사전으로 형식 매개변수에 해당 하는 것을 제외한 **kwargs
모든
키워드 인수 를 제공합니다.
def bar(**kwargs):
for a in kwargs:
print(a, kwargs[a])
bar(name='one', age=27)
# name one
# age 27
두 관용구를 일반 인수와 혼합하여 고정 인수와 일부 가변 인수를 허용할 수 있습니다.
def foo(kind, *args, **kwargs):
pass
이것을 반대로 사용할 수도 있습니다:
def foo(a, b, c):
print(a, b, c)
obj = {'b':10, 'c':'lee'}
foo(100,**obj)
# 100 10 lee
*l
관용구 의 또 다른 사용법은 함수를 호출할 때 인수 목록의 압축을 푸는 것입니다.
def foo(bar, lee):
print(bar, lee)
l = [1,2]
foo(*l)
# 1 2
*l
Python 3에서는 할당의 왼쪽 에서 사용할 수 있습니다 ( Extended Iterable Unpacking ), 이 컨텍스트에서는 튜플 대신 목록을 제공하지만:
first, *rest = [1,2,3,4]
first, *l, last = [1,2,3,4]
또한 Python 3은 새로운 의미 체계를 추가합니다( PEP 3102 참조 ).
def func(arg1, arg2, arg3, *, kwarg1, kwarg2):
pass
예를 들어 다음은 python 3에서는 작동하지만 python 2에서는 작동하지 않습니다.
>>> x = [1, 2]
>>> [*x]
[1, 2]
>>> [*x, 3, 4]
[1, 2, 3, 4]
>>> x = {1:1, 2:2}
>>> x
{1: 1, 2: 2}
>>> {**x, 3:3, 4:4}
{1: 1, 2: 2, 3: 3, 4: 4}
이러한 함수는 3개의 위치 인수만 허용하며 그 이후의 모든 것은 *
키워드 인수로만 전달할 수 있습니다.
dict
은 임의로 정렬됩니다. 그러나 Python 3.6에서 키워드 인수는 삽입 순서를 기억하도록 보장됩니다.**kwargs
이제 키워드 인수가 함수에 전달된 순서와 일치합니다." - Python 3.6의 새로운 기능
*
및 **
함수를 호출할 때도 사용할 수 있다는 점도 주목할 가치가 있습니다. 이것은 목록/튜플 또는 사전을 사용하여 여러 인수를 함수에 직접 전달할 수 있는 바로 가기입니다. 예를 들어 다음 기능이 있는 경우:
def foo(x,y,z):
print("x=" + str(x))
print("y=" + str(y))
print("z=" + str(z))
다음과 같은 작업을 수행할 수 있습니다.
>>> mylist = [1,2,3]
>>> foo(*mylist)
x=1
y=2
z=3
>>> mydict = {'x':1,'y':2,'z':3}
>>> foo(**mydict)
x=1
y=2
z=3
>>> mytuple = (1, 2, 3)
>>> foo(*mytuple)
x=1
y=2
z=3
참고: 의 키 mydict
이름은 function 의 매개변수와 정확히 동일해야 합니다 foo
. 그렇지 않으면 다음을 던질 것입니다 TypeError
.
>>> mydict = {'x':1,'y':2,'z':3,'badnews':9}
>>> foo(**mydict)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: foo() got an unexpected keyword argument 'badnews'
단일 *는 추가 위치 인수가 여러 개 있을 수 있음을 의미합니다. foo()
와 같이 호출할 수 있습니다 foo(1,2,3,4,5)
. foo()의 본문에서 param2는 2-5를 포함하는 시퀀스입니다.
이중 **은 추가 명명된 매개변수가 얼마든지 있을 수 있음을 의미합니다. bar()
와 같이 호출할 수 있습니다 bar(1, a=2, b=3)
. bar()의 본문에서 param2는 {'a':2, 'b':3 }을 포함하는 사전입니다.
다음 코드로:
def foo(param1, *param2):
print(param1)
print(param2)
def bar(param1, **param2):
print(param1)
print(param2)
foo(1,2,3,4,5)
bar(1,a=2,b=3)
출력은
1
(2, 3, 4, 5)
1
{'a': 2, 'b': 3}
[python] __init__() 메서드로 Python super() 이해하기 [중복] (0) | 2022.08.22 |
---|---|
[python] 함수 데코레이터를 만들고 함께 연결하려면 어떻게 해야 합니까? (0) | 2022.08.22 |
[python] 시간 지연은 어떻게 합니까? [복제하다] (0) | 2022.08.22 |
[python] 열 값을 기반으로 DataFrame에서 행을 어떻게 선택합니까? (0) | 2022.08.22 |
[python] 할당 후 예기치 않게 변경되지 않도록 목록을 복제하려면 어떻게 해야 합니까? (0) | 2022.08.22 |