함수 호출의 별표


111

나는 itertools.chain을 사용하여 다음과 같은 방식으로 목록 목록을 "평탄화"합니다.

uniqueCrossTabs = list(itertools.chain(*uniqueCrossTabs))

이것이 말하는 것과 다른 점 :

uniqueCrossTabs = list(itertools.chain(uniqueCrossTabs))

8
한 번 봐 가지고 인자리스트 풀기 자세한 내용은 파이썬 문서에 있습니다.
Kai

8
**연산자 도 확인해야합니다 *. 키워드 인수와 동일한 작업을 수행합니다 .
Sean Vieira 2011 년

답변:


181

* 는 "splat"연산자입니다. 목록을 입력으로 받아 함수 호출에서 실제 위치 인수로 확장합니다.

그렇다면 uniqueCrossTabs이었다 [ [ 1, 2 ], [ 3, 4 ] ], 그 다음 itertools.chain(*uniqueCrossTabs)말과 동일itertools.chain([ 1, 2 ], [ 3, 4 ])

이것은 그냥 전달하는 것과 분명히 다릅니다 uniqueCrossTabs. 귀하의 경우에는 병합하려는 목록 목록이 있습니다. 어떤 itertools.chain()일은 각 위치 인수가 그 자체로 반복 가능한 당신이 그것을 통과하는 모든 위치 인수의 연결의 반복자를 반환한다.

즉, 각 목록을에 uniqueCrossTabs인수로 전달하여 chain()함께 연결하고 싶지만 별도의 변수에 목록이 없으므로 다음을 사용합니다.* 연산자를 하여 목록 목록을 여러 목록 인수로 확장합니다.

Jochen Ritzel이 주석에서 지적했듯이이 chain.from_iterable()작업에는이 작업에 더 적합합니다. 시작하는 이터 러블의 단일 이터 러블을 가정하기 때문입니다. 그러면 코드가 간단 해집니다.

uniqueCrossTabs = list(itertools.chain.from_iterable(uniqueCrossTabs))

9
@larsmans :이 용어가 Ruby 세계에서 더 인기가 있다고 생각하지만 Python에서도 허용되는 것 같습니다. ;-)
Cameron

1
@larsmans : 흥미 롭군요! 나는 항상 그것이 실제 캐릭터 자체가 아닌 인수 목록으로 목록을 푸는 작업을 언급한다고 생각했습니다.
Cameron

1
모든 사람들이 문자열을 반복 가능한 것으로 보지 않기 때문에 문자열이 최선의 예가 아닐 수도 있습니다. BTW : 대신 chain(*it)내가 쓸 것 chain.from_iterable(it).
Jochen Ritzel 2011 년

@Jochen : 당신 말이 맞습니다. 대신 숫자를 사용하도록 변경하겠습니다. 또한 from_iterable존재하는 줄도 몰랐습니다 ! 곧 제 답변에 추가하겠습니다
Cameron

1
@Ramy : *목록을 함수에 대한 위치 인수 로 분해 하기위한 것입니다 (예, 매우 구체적입니다). 당신은 for l in uniqueCrossTabs:그것들을 반복 할 수 있습니다 . 안타깝게도 *목록을 함수에 전달할 때만 작동하기 때문에 작업 을보기가 어렵습니다 (목록을 첫 번째 매개 변수로 전달하는 대신 목록 *의 각 요소가 별도의 매개 변수로 차례로 전달되도록합니다). , 마치 매개 변수 목록에서 쉼표로 구분하여 입력 한 것처럼)
Cameron

72

함수 호출을 위해 시퀀스를 별도의 인수로 분할합니다.

>>> def foo(a, b=None, c=None):
...   print a, b, c
... 
>>> foo([1, 2, 3])
[1, 2, 3] None None
>>> foo(*[1, 2, 3])
1 2 3
>>> def bar(*a):
...   print a
... 
>>> bar([1, 2, 3])
([1, 2, 3],)
>>> bar(*[1, 2, 3])
(1, 2, 3)

예제와 함께 간결한 설명. +1!
AruniRC

28

개념을 설명 / 사용하는 다른 방법 일뿐입니다.

import random

def arbitrary():
    return [x for x in range(1, random.randint(3,10))]

a, b, *rest = arbitrary()

# a = 1
# b = 2
# rest = [3,4,5]

3
이것은 다른 중요하지 언급
게르 솜

1
이 답변은 질문에 구체적으로 적용되지는 않지만 별표의 중요한 적용입니다. 같은 맥락에서 함수 정의에 또 다른 중요한 응용 프로그램이 있습니다. def func(a, b, *args):자세한 내용은 이 답변 을 참조하십시오.
ASL
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.