Python 3学习者:
question有以下接受的答案:
rr,tt = zip(*[(i*10, i*12) for i in xrange(4)])
返回两个元组。如果有人可以打破答案并解释它在Python 3中做了什么(我知道{3}在Python 3中返回迭代器),我将不胜感激。我理解列表理解但是我对解压缩感到困惑(我认为你只能使用星号表达式作为赋值目标的一部分)。
我同样对以下代码感到困惑。我理解结果和拉链(或者我认为)但是星号表达再一次让我击败了。
range()
来自this:
x2, y2 = zip(*zip(x, y))
答案 0 :(得分:5)
*expression
将argument unpacking应用于函数调用。需要expression
部分,具有来解析序列,并使该序列中的每个元素成为函数的单独参数。
因此,zip(x, y)
返回一个序列,该序列中的每个元素都成为外部 zip()
函数的参数。
对zip(*[(i*10, i*12) for i in xrange(4)])
来说,它可能更清晰一些;这里有几个要素:
[(i*10, i*12) for i in xrange(4)]
(在python 3中应为range()
)创建一个包含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))