使用es6-shim.min.js:1 Uncaught SyntaxError: Unexpected token <
zone.js:1 Uncaught SyntaxError: Unexpected token <
Reflect.js:1 Uncaught SyntaxError: Unexpected token <
system.src.js:1 Uncaught SyntaxError: Unexpected token <
systemjs.config.js:1 Uncaught SyntaxError: Unexpected token <
rahul:20 Uncaught ReferenceError: System is not defined(anonymous function) @ rahul:20
bundle.min.js:1 Uncaught SyntaxError: Unexpected token <
,我可以从x = [1,2,3,4]
获得一个迭代器。
使用这个迭代器,我可以使用zip函数创建一个包含两个项目的元组。
i = iter(x)
即使我可以使用此语法来获得相同的结果。
>>> i = iter(x)
>>> zip(i,i)
[(1, 2), (3, 4)]
这是如何工作的? >>> zip(*[i] * 2)
[(1, 2), (3, 4)]
和zip(i,i)
的迭代器如何工作?
答案 0 :(得分:9)
迭代器就像一个项目流。您只能一次查看流中的项目,并且只能访问第一个元素。要查看流中的某些内容,您需要将其从流中删除,一旦您从流的顶部获取内容,它就会从流中消失。
当您致电zip(i, i)
时,zip
首先查看第一个流并取出一个项目。然后它查看第二个流(恰好是与第一个流相同的流)并取出一个项目。然后它从这两个项目中生成一个元组,并反复重复这个元素直到流中没有任何内容。
也许更容易看出我是否在纯python中编写zip
函数(为简单起见,只有2个参数)。它看起来像 1 :
def zip(a, b):
out = []
try:
while True:
item1 = next(a)
item2 = next(b)
out.append((item1, item2))
except StopIteration:
return out
现在假设你在谈论a
和b
是同一个对象的情况。在这种情况下,我们只需在迭代器(在您的示例中为next
)上调用i
两次,它将按顺序从i
中取出前两项并将它们打包成元组。
一旦我们理解了zip(i, i)
行为方式的原因,zip(*([i] * 2))
并不太难。让我们从里到外读出表达式......
[i] * 2
这只是创建一个新的列表(长度为2),其中两个元素都是对迭代器i
的引用。所以它与zip(*[i, i])
是一样的(当你想要重复两次以上的事情时,写起来会更方便)。 *
解压缩是python中常见的习惯用法,您可以在the python tutorial中找到更多信息。它的要点是python接受iterable并“解包”它,好像每个iterable项都是函数的一个单独的位置参数。所以:
zip(*[i, i])
做同样的事情:
zip(i, i)
现在鲍勃是我们的叔叔。我们刚开始全圈,因为zip(i, i)
是讨论开始的地方。
1 这个示例代码绝对不仅仅是前面提到的只接受2个参数。例如,zip
可能会在输入参数上调用iter
,这样它就可以用于任何可迭代的(不仅仅是迭代器),但这应该足以得到点...
答案 1 :(得分:0)
每次从迭代器中获取一个项目时,它都会停留在该位置,而不是“#34;倒带”。&#34;因此zip(i, i)
获取i
中的第一项,然后获取i
中的第二项,并将其作为tuple
返回。它继续为每个可用对执行此操作,直到迭代器耗尽。
zip(*[i]*2)
通过将list
乘以[i, i]
来创建i
2
,然后将其与最左边的*
解包,实际上,它将i
和i
两个参数发送到zip
,产生与第一个代码段相同的结果。