파이썬을 프로그래밍 할 때 때로는 **
변환을하기 위해 수행합니다 . 나는 그것이 무엇을하지만 어떤 데이터 구조를 조작하고 있는지 이해합니까? 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 0362 및 3102 와 문서 의 제어 흐름 섹션 에서 찾을 수 있습니다 . 함수 시그니처 오브젝트 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 !
답변
특정 운영자에게 무엇을 호출해야하는지 확실치 않거나 이름이 지정되지 않은 경우 언제든지 Waka Waka Bang Splat 을 참조하여 무엇을 호출해야하는지 파악할 수 있습니다. 이 경우 에는 기호에 대한 대체 이름 이 있지만이를 **
호출합니다 .double-splat