2011-05-06 3 views
29

파이썬 문서는 압축의 역 동작과이 코드를 제공한다. 누군가이 경우에 * 연산자가 어떻게 작동하는지 설명 할 수 있습니까? 내가 이해하는 한, *는 이진 연산자이고 곱셈 또는 얕은 복사에 사용될 수 있습니다 ... 어느 쪽도 여기에 해당하지 않는 것 같습니다.풀기 상기 * 연산자

+2

가능한 중복 c를, 다시 A, B, 원본과 나는 [이유는 무엇입니까 X, Y = 우편 (* 우편 (A는, B)) 파이썬에서 작동?] (HTTP : // 유래. com/questions/2511300/why-does-xy-zipzipa-b-work-in-python) – schnaader

답변

18

zip(*zipped)은 "zip"에 대한 인수로 zipped의 각 요소를 공급한다는 것을 의미합니다. zip은 행렬을 바꾸는 것과 비슷합니다. 행렬을 다시 시작하면 시작한 곳으로 되돌아갑니다.

>>> a = [(1, 2, 3), (4, 5, 6)] 
>>> b = zip(*a) 
>>> b 
[(1, 4), (2, 5), (3, 6)] 
>>> zip(*b) 
[(1, 2, 3), (4, 5, 6)] 
53

hammar's answerzip() 함수의 경우 역전이 작동하는 방식을 설명하지만 더 일반적인 의미로 인수 압축 풀기를 살펴 보는 것이 유용 할 수 있습니다. 이제 우리는 간단한 기능을하는이 있다고 가정하자 일부 인수를 취합니다

>>> def do_something(arg1, arg2, arg3): 
...  print 'arg1: %s' % arg1 
...  print 'arg2: %s' % arg2 
...  print 'arg3: %s' % arg3 
... 
>>> do_something(1, 2, 3) 
arg1: 1 
arg2: 2 
arg3: 3 

대신 직접 인수, 우리는 (그 문제에 대한 또는 튜플) 목록을 만들 수 있습니다를 개최하고, 을 풀고 다음 파이썬에게 지정 이 목록 및 함수의 인수로 그 내용을 사용

충분히 인수 (또는 너무 많은)이없는 경우이 정상으로 작동
>>> arguments = [42, 'insert value here', 3.14] 
>>> do_something(*arguments) 
arg1: 42 
arg2: insert value here 
arg3: 3.14 

:

>>> arguments = [42, 'insert value here'] 
>>> do_something(*arguments) 
--------------------------------------------------------------------------- 
TypeError         Traceback (most recent call last) 

/home/blair/<ipython console> in <module>() 

TypeError: do_something() takes exactly 3 arguments (2 given) 

함수를 정의 할 때 동일한 수식을 사용하여 원하는 수의 위치 인수를 허용 할 수 있습니다.(**

>>> show_args(*arguments) 
Argument 0: 42 
Argument 1: insert value here 

당신은 이중 별표를 사용하여 키워드 인수 비슷한 일을 수행 할 수 있습니다

>>> def show_args(*args): 
...  for index, value in enumerate(args): 
...   print 'Argument %d: %s' % (index, value) 
... 
>>> show_args(1, 2, 3) 
Argument 0: 1 
Argument 1: 2 
Argument 2: 3 

물론 당신이 결합 할 수있는 두 가지 기술 : 그들은 튜플로 기능 부여) 및 사전 :

>>> def show_kwargs(**kwargs): 
...  for arg, value in kwargs.items(): 
...   print '%s = %s' % (arg, value) 
... 
>>> show_kwargs(age=24, name='Blair') 
age = 24 
name = Blair 

그리고, 물론, 당신이 사전을 통해 키워드 인수를 전달할 수 있습니다 :

>>> values = {'name': 'John', 'age': 17} 
>>> show_kwargs(**values) 
age = 17 
name = John 

이 두 가지를 혼합 완벽하게 수용, 그리고 당신은 항상 함수에 인수 및 옵션 추가 인수를 요구 한 수

>>> def mixed(required_arg, *args, **kwargs): 
...  print 'Required: %s' % required_arg 
...  if args: 
...   print 'Extra positional arguments: %s' % str(args) 
...  if kwargs: 
...   print 'Extra keyword arguments: %s' % kwargs 
... 
>>> mixed(1) 
Required: 1 
>>> mixed(1, 2, 3) 
Required: 1 
Extra positional arguments: (2, 3) 
>>> mixed(1, 2, 3, test=True) 
Required: 1 
Extra positional arguments: (2, 3) 
Extra keyword arguments: {'test': True} 
>>> args = (2, 3, 4) 
>>> kwargs = {'test': True, 'func': min} 
>>> mixed(*args, **kwargs) 
Required: 2 
Extra positional arguments: (3, 4) 
Extra keyword arguments: {'test': True, 'func': <built-in function min>} 

당신이 선택적 키워드 인수를 복용하는 경우 당신은 기본값을 갖고 싶어 당신이 사전 다루고있는 기억 때문에 당신은 키가 존재하지 않을 경우 사용할 기본 값으로 그 get() 방법을 사용할 수 있습니다 :

>>> def take_keywords(**kwargs): 
...  print 'Test mode: %s' % kwargs.get('test', False) 
...  print 'Combining function: %s' % kwargs.get('func', all) 
... 
>>> take_keywords() 
Test mode: False 
Combining function: <built-in function all> 
>>> take_keywords(func=any) 
Test mode: False 
Combining function: <built-in function any> 
+3

+1 예제와 함께 상세한 설명을 위해! –

-2

을 나는 우편 인 경우 목록의 압축 된 목록을 압축 해제하기 위해이 일을 제안한다 izip_longest으로 수행 :

>>> a =[2,3,4,5,6] 
>>> b = [5,4,3,2] 
>>> c=[1,0]] 

>>>[list([val for val in k if val != None]) for k in 
             zip(*itertools.izip_longest(a,b,c))] 

izip_longest 가장 긴 것보다 짧은 목록에 없음을 추가하지 않습니다로서, 나는 사전에 없음을 제거하지 않습니다. 그리고 난의

[[2, 3, 4, 5, 6], [5, 4, 3, 2], [1, 0]]