[python] 함수 호출의 별표

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

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

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

uniqueCrossTabs = list(itertools.chain(uniqueCrossTabs))



답변

* 는 “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))


답변

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

>>> 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)


답변

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

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]


답변