파이썬 문서는 압축의 역 동작과이 코드를 제공한다. 누군가이 경우에 * 연산자가 어떻게 작동하는지 설명 할 수 있습니까? 내가 이해하는 한, *는 이진 연산자이고 곱셈 또는 얕은 복사에 사용될 수 있습니다 ... 어느 쪽도 여기에 해당하지 않는 것 같습니다.풀기 상기 * 연산자
답변
과 같이 사용될 때, * (별표, 또한 "플랫"연산자 일부 원 알고는) 목록에서 인수를 풀고하는 신호입니다. 예제와 함께 더 자세한 정의는 http://docs.python.org/tutorial/controlflow.html#unpacking-argument-lists을 참조하십시오.
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)]
hammar's answer은 zip()
함수의 경우 역전이 작동하는 방식을 설명하지만 더 일반적인 의미로 인수 압축 풀기를 살펴 보는 것이 유용 할 수 있습니다. 이제 우리는 간단한 기능을하는이 있다고 가정하자 일부 인수를 취합니다
>>> 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>
+1 예제와 함께 상세한 설명을 위해! –
을 나는 우편 인 경우 목록의 압축 된 목록을 압축 해제하기 위해이 일을 제안한다 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]]
가능한 중복 c를, 다시 A, B, 원본과 나는 [이유는 무엇입니까 X, Y = 우편 (* 우편 (A는, B)) 파이썬에서 작동?] (HTTP : // 유래. com/questions/2511300/why-does-xy-zipzipa-b-work-in-python) – schnaader