파이썬에서 **의 이름은 무엇입니까? 무엇을하지만 어떤 데이터 구조를

파이썬을 프로그래밍 할 때 때로는 **변환을하기 위해 수행합니다 . 나는 그것이 무엇을하지만 어떤 데이터 구조를 조작하고 있는지 이해합니까? A dict와 다른 것은 무엇입니까? array? **운영자 의 이름이 있습니까?



답변

이것은 연산자가 아니므로 실제로 이름이 없지만 “구문 규칙”으로 정의됩니다 . 따라서 다음과 같이 호출해야합니다.

  • “키워드 인수 압축 풀기 구문”

당신이 인수 목록이있는 경우 *args,이라고 “인수 풀기” 같은 방식으로 **kwargs호출 “키워드 인수 풀고” .

당신이의 왼쪽에 그것을 사용하는 경우 =, 같은에서 a, *middle, end = my_tuple, 당신은 말할 것 “튜플 풀고” .

전체적으로 세 가지 유형의 (단일 매개 변수) 인수가 있습니다.

def f(x)  # x: positional argument
def f(x, y=0)  # y: keyword argument
def f(x, *xs, y=0)  # y: keyword-only argument

*args인수는 “변수 위치 매개 변수”를 호출 **kwargs은 “변수 키워드 매개 변수”입니다. 가변 위치 매개 변수는 전달한 모든 인수를 사용하므로 키워드 전용 인수는 위치 적으로 지정할 수 없습니다.

이 중 대부분은 PEP 03623102 와 문서 의 제어 흐름 섹션 에서 찾을 수 있습니다 . 함수 시그니처 오브젝트 PEP는 초안 일 뿐이며 용어는 한 사람의 아이디어 일 수 있습니다. 그러나 어쨌든 그들은 좋은 용어입니다. 🙂

따라서 *and **인수는 해당 데이터 구조의 압축을 풉니 다.

args = (1, 2, 3)  # usually a tuple, always an iterable[1]

f(*args)  f(1, 2, 3)

# and 

kwargs = {"a": 1, "b": 2, "c": 3}  # usually a dict, always a mapping*

f(**kwargs) -> f(a=1, b=2, c=3)

[1] : 반복 가능 객체는 객체 구현 __iter__()방법 및 맵핑 구현 객체 keys()__getitem__(). 이 프로토콜을 지원하는 모든 객체는 생성자 tuple()및에 의해 이해 dict()되므로 인수의 압축을 풀 때 사용할 수 있습니다.


답변

이름이 없다고 생각합니다. 에서 파이썬 문서 “인수 목록을 풀기”에서, 그것은 단지라고 있어요 “를 **-operator.”

“다른”데이터 구조가 무엇을 의미하는지 잘 모르겠습니다. 당신이 할 경우 f(**kwargs)에는 사전에 압축 해제 kwargs키 – 값 쌍의 순서로한다. 다른 구조가 관련된 것을 보지 못했습니다.

명확성을 위해 위의 문서에서 예제 를 복사합니다 .

>>> def parrot(voltage, state='a stiff', action='voom'):
...     print "-- This parrot wouldn't", action,
...     print "if you put", voltage, "volts through it.",
...     print "E's", state, "!"
...
>>> d = {"voltage": "four million", "state": "bleedin' demised", "action": "VOOM"}
>>> parrot(**d)
-- This parrot wouldn't VOOM if you put four million volts through it. E's bleedin' demised !

참조 : * 인수와 ** kwargs로는 무엇을 의미합니까?


답변

특정 운영자에게 무엇을 호출해야하는지 확실치 않거나 이름이 지정되지 않은 경우 언제든지 Waka Waka Bang Splat 을 참조하여 무엇을 호출해야하는지 파악할 수 있습니다. 이 경우 에는 기호에 대한 대체 이름 이 있지만이를 **호출합니다 .double-splat


답변