为什么 x,y = zip(*zip(a,b)) 在 Python 中有效?
我真的很喜欢Python的zip()
函数,几乎每次都用,真是太棒了。不过有时候我想做zip()
的反向操作,心里想“我以前知道怎么做的”,然后就去谷歌搜索python unzip,最后想起来原来是用这个神奇的*
来解压一个被压缩的元组列表。就像这样:
x = [1,2,3]
y = [4,5,6]
zipped = zip(x,y)
unzipped_x, unzipped_y = zip(*zipped)
unzipped_x
Out[30]: (1, 2, 3)
unzipped_y
Out[31]: (4, 5, 6)
这到底是怎么回事?这个神奇的星号在干嘛?它还能用在其他地方吗?Python里还有哪些神秘又难以搜索的酷炫东西呢?
7 个回答
9
这对于多个参数也很有用:
def foo(*args):
print args
foo(1, 2, 3) # (1, 2, 3)
# also legal
t = (1, 2, 3)
foo(*t) # (1, 2, 3)
而且,你可以使用两个星号来处理关键字参数和字典:
def foo(**kwargs):
print kwargs
foo(a=1, b=2) # {'a': 1, 'b': 2}
# also legal
d = {"a": 1, "b": 2}
foo(**d) # {'a': 1, 'b': 2}
当然,你还可以把这些结合起来使用:
def foo(*args, **kwargs):
print args, kwargs
foo(1, 2, a=3, b=4) # (1, 2) {'a': 3, 'b': 4}
这些功能真的很不错,也很实用。
18
星号(*)的作用类似于在Lisp和Scheme中所说的apply
。简单来说,它会把你的列表里的内容拿出来,然后用这些内容作为参数来调用一个函数。
44
在Python的教程中,有关于星号(*)的说明,具体可以在解包参数列表这一部分找到。