回答:当然是有的!下面具体分析不同:zip方法在Python 2 和Python 3中的不同
为何有这种不同
更多注解
问题一:zip方法在Python 2 和Python 3中的不同
Python 2 的代码演示:
$ python2
>>> a = zip((1, 2), (3, 4))
>>> a
[(1, 3), (2, 4)]
# 可以看到这里返回的是一个list
Python 3 的代码演示:
$ python3
>>> a = zip((1, 2), (3, 4))
>>> a
# 可以看到这里返回的是一个对象,这里就是2和3的不同点
>>> dir(a) # 查看a的相关属性
["__class__", "__delattr__", "__dir__", "__doc__", "__eq__", "__format__", "__ge__", "__getattribute__", "__gt__", "__hash__", "__init__", "__iter__", "__le__", "__lt__", "__ne__", "__new__", "__next__", "__reduce__", "__reduce_ex__", "__repr__", "__setattr__", "__sizeof__", "__str__", "__subclasshook__"]
# 这里值得注意的是"__next__"方法,说明a是一个迭代器
# 既然知道了a是一个迭代器,我们也就基本明白了a的用法了
### 和Python2的区别(一):返回的是一个迭代器,而不是一个list本身
>>> for i in a: print(i) # in 方法
...
(1, 3)
(2, 4)
>>> next(a) # 我们测试__next__方法
Traceback (most recent call last):
File "", line 1, in
StopIteration # 说明next方法是支持的
>>> a = zip((1, 2), (3, 4)) # 这里需要重新赋值,迭代器只能遍历一次
>>> next(a)
(1, 3) # 运行良好
### 返回迭代器
问题二:为何有这种不同
我想最重要的原因是节约了不少的内存吧。Python的运行效率和编译类型的语言自然是没法比,但是能优化就优化一点吧~谁不想有更高的追求呢。
问题三:更多注解
这个zip在不同版本的不同反应了python的一个演变:大部分返回list的函数不在返回list,而是返回一个支持遍历的对象,比如map、fiter之类的,基本的例子如下:
$ python3
>>> a = map(abs, [1, 2, -3])
>>> a
>>> list(a) # 如果不习惯,可以自己手动转化为list,也是写兼容代码需要注意的地方
[1, 2, 3]
$ python2
>>> a = map(abs, [1, 2, -3])
>>> a
[1, 2, 3]
注:《Learning Python》by Mark Lutz,第五版很不错,值得推荐。