我有一个脚本,我想在Python3.5和IronPython2.7中执行.
该脚本最初是用Python3编写的,所以我有一些类似于下面代码的嵌套循环:
myIter0 = iter(['foo','foo','bar','foo','spam','spam'])
myIter1 = iter(['foo','bar','spam','foo','spam','bar'])
myIter2 = iter([1,2,3,4,5,6])
for a in myIter0:
for b, c in zip(myIter1, myIter2):
if a + b == 'foobar':
print(c)
break
Run Code Online (Sandbox Code Playgroud)
现在,如果我在IronPython2.7中运行它,我得不到相同的结果,因为zip返回一个列表而不是迭代器.
为了避免这个问题,我想我会这样做:
import sys
if sys.version_info.major == 2:
from itertools import izip as _zip
else:
_zip = zip
myIter0 = iter(['foo','foo','bar','foo','spam','spam'])
myIter1 = iter(['foo','bar','spam','foo','spam','bar'])
myIter2 = iter([1,2,3,4,5,6])
for a in myIter0:
for b, c in _zip(myIter1, myIter2):
if a + b == 'foobar':
print(c)
break
Run Code Online (Sandbox Code Playgroud)
有没有更好的方法来做到这一点?
from builtins import zip
Run Code Online (Sandbox Code Playgroud)
在 python2 中你会得到一个itertools.izip ,而在 python3 中你只会得到 zip。
In [1]: from builtins import zip
In [2]: zip([1,2,3,4])
Out[2]: <itertools.izip at 0x7fa16c8496c8>
In [1]: from builtins import zip
In [2]: zip([1,2,3,4])
Out[2]: <zip at 0x7f13dfb9c188>
Run Code Online (Sandbox Code Playgroud)