파이썬

[python] **(이중 별표/별표) 및 *(별표/별표)는 매개변수에 대해 무엇을 합니까?

zooheon 2022. 8. 22. 23:02
반응형

무엇 *args**kwargs의미합니까?

def foo(x, y, *args):
def bar(x, y, **kwargs):

 

*argsand 는 파이썬 문서의 함수 정의**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

*lPython 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개의 위치 인수만 허용하며 그 이후의 모든 것은 *키워드 인수로만 전달할 수 있습니다.

메모:

  • 키워드 인수 전달에 의미상 사용되는 Python dict은 임의로 정렬됩니다. 그러나 Python 3.6에서 키워드 인수는 삽입 순서를 기억하도록 보장됩니다.
  • "요소의 순서는 **kwargs이제 키워드 인수가 함수에 전달된 순서와 일치합니다." - Python 3.6의 새로운 기능
  • 사실, CPython 3.6의 모든 dicts는 삽입 순서를 구현 세부 사항으로 기억할 것이며, 이는 Python 3.7에서 표준이 됩니다.

 

***함수를 호출할 때도 사용할 수 있다는 점도 주목할 가치가 있습니다. 이것은 목록/튜플 또는 사전을 사용하여 여러 인수를 함수에 직접 전달할 수 있는 바로 가기입니다. 예를 들어 다음 기능이 있는 경우:

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}

 

반응형