프로그래밍 언어/Python

매개 변수에 붙는 ** 와 * 의 의미

Rateye 2021. 12. 16. 09:54
728x90
반응형
질문 : ** (이중 별표 / 별표) 및 * (별표 / 별표)는 매개 변수에 대해 무엇을합니까?

다음 메서드 정의에서 ***param2 무엇을합니까?

def foo(param1, *param2):
def bar(param1, **param2):
답변

*args**kwargs 는 Python 문서의 함수 정의 에 대한 추가 섹션에 설명 된대로 함수에 임의의 수의 인수를 허용하는 일반적인 관용구입니다.

*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

Python 3에서는 할당의 왼쪽에 *l 을 사용할 수 있습니다 (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

이러한 함수는 3 개의 위치 인수 만 허용하며 * 이후의 모든 것은 키워드 인수로만 전달할 수 있습니다.

참고

  • 키워드 인수 전달에 의미 론적으로 사용되는 Python dict 그러나 Python 3.6에서 키워드 인수는 삽입 순서를 기억하도록 보장됩니다.
  • **kwargs 의 요소 순서는 이제 키워드 인수가 함수에 전달 된 순서와 일치합니다." -Python 3.6의 새로운 기능
  • 사실, CPython 3.6의 모든 딕셔너리는 삽입 순서를 구현 세부 사항으로 기억할 것입니다. 이것은 Python 3.7에서 표준이됩니다.
출처 : https://stackoverflow.com/questions/36901/what-does-double-star-asterisk-and-star-asterisk-do-for-parameters
728x90
반응형