2

这里有一个 Python 3 学习者:

问题有以下公认的答案:

rr,tt = zip(*[(i*10, i*12) for i in xrange(4)])

它返回两个元组。如果有人能分解答案并解释它对 Python 3 的作用,我将不胜感激(我知道 Python 3 中的range()返回迭代器)。我理解列表推导,但我对拆包感到困惑(我认为您只能使用星号表达式作为分配目标的一部分)。

我对下面的代码同样感到困惑。我理解结果和压缩(或认为我知道),但星号表达式再次让我打败了。

x2, y2 = zip(*zip(x, y))

从此:_

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

1 回答 1

7

*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 个值。

Because the zip() function produces two sequences, they can be assigned to the two variables.

I would have found the following a far more readable version of the same expression:

rr, tt = tuple(range(0, 40, 10)), tuple(range(0, 48, 12))
于 2013-03-29T15:25:52.760 回答