从 itertools 模块导入 izip 会在 Python3.x 中产生 NameError

我试图像下面这样导入 izip 模块:

from itertools import izip

然而,在最近从 Python 2.7改为 Python 3之后,它似乎不起作用了。

我试图写到一个 csv 文件:

writer.writerows(izip(variable1,2))

但我没有运气。仍然遇到一个错误。

81939 次浏览

在 Python 3中,内置的 zip与2.X 中的 itertools.izip做相同的工作(返回迭代器而不是列表)。zip实现几乎完全是从 旧的 izip复制粘贴过来的,只是改了几个名字并添加了 pickle 支持。

下面是 Python 2和3中的 zip和 Python 2中的 izip之间的基准测试:

Python 2.7 :

from timeit import timeit


print(timeit('list(izip(xrange(100), xrange(100)))',
'from itertools import izip',
number=500000))


print(timeit('zip(xrange(100), xrange(100))', number=500000))

产出:

1.9288790226
1.2828938961

Python 3 :

from timeit import timeit


print(timeit('list(zip(range(100), range(100)))', number=500000))

产出:

1.7653984297066927

在这种情况下,因为 zip的参数必须支持迭代,所以不能使用2作为参数。因此,如果你想写2个变量作为一个 CSV 行,你可以把他们放在一个元组或列表:

writer.writerows((variable1,2))

还可以从 itertools导入 zip_longest作为一个更灵活的函数,可以在不同大小的迭代器上使用它。

帮助我的方法之一是:

try:
from itertools import izip as zip
except ImportError: # will be 3.x series
pass

在 python3中直接使用 zip而不是 izip,不需要导入任何东西。

详情请浏览 给你