请解释python zip和解包解决方案

Dis*_*ami 2 python python-3.x iterable-unpacking

Python 3学习者:

这个问题有以下公认的答案:

rr,tt = zip(*[(i*10, i*12) for i in xrange(4)])
Run Code Online (Sandbox Code Playgroud)

返回两个元组.如果有人可以打破答案并解释它在Python 3中做了什么(我知道range()在Python 3中返回迭代器),我将不胜感激.我理解列表理解但是我对解压缩感到困惑(我认为你只能使用星号表达式作为赋值目标的一部分).

我同样对以下代码感到困惑.我理解结果和拉链(或者我认为),但是星号表达再次击败了我.

x2, y2 = zip(*zip(x, y))
Run Code Online (Sandbox Code Playgroud)

这个:

>>> x = [1, 2, 3]
>>> y = [4, 5, 6]
>>> zipped = zip(x, y)
>>> list(zipped)
[(1, 4), (2, 5), (3, 6)]
>>> x2, y2 = zip(*zip(x, y))
>>> x == list(x2) and y == list(y2)
True
Run Code Online (Sandbox Code Playgroud)

Mar*_*ers 5

*expression参数解包应用于函数调用.它采用expression部分,其具有解析到的序列,并且使得每个元素在该序列中的单独参数的函数.

因此,zip(x, y)返回一个序列,该序列中的每个元素都成为外部 zip()函数的参数.

因为zip(*[(i*10, i*12) for i in xrange(4)])它可能更清楚一些; 这里有几个要素:

  • [(i*10, i*12) for i in xrange(4)] (应该range()在python 3中)创建一个包含4个元组的列表,[(0, 0), (10, 12), (20, 24), (30, 36)]
  • zip(*...)然后,该部分将获取这4个元组中的每一个,并将这些元素作为参数传递给zip()函数.
  • zip()获取每个元组并将它们的元素配对; 每个元组两个元素意味着结果是2个列表,每个元素包含4个值.

因为zip()函数返回两个序列,所以可以将它们分配给两个变量.

我会发现以下是相同表达式的更易读的版本:

rr, tt = tuple(range(0, 40, 10)), tuple(range(0, 48, 12))
Run Code Online (Sandbox Code Playgroud)