python中使用zip函數出現

在python中使用zip函數,出現<zip object at 0x02A9E418>錯誤的原因是,你是用的是python2點多的版本,python3.0對python做了改動

  1. zip方法在Python 2 和Python 3中的不同
  2. 爲何有這種不同
  3. 更多註解

問題一:zip方法在Python 2 和Python 3中的不同
Python 2 的代碼演示:
$ python2
>>> a = zip((1, 2), (3, 4))
>>> a
[(1, 2), (3, 4)]
#  可以看到這裏返回的是一個list
Python 3 的代碼演示:
$ python3
>>> a = zip((1, 2), (3, 4))
>>> a
<zip object at 0x1007096c8>
# 可以看到這裏返回的是一個對象,這裏就是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__'
]
# 這裏值得注意的是 '__iter__' 和 '__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 "<stdin>", line 1, in <module>
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
<map object at 0x100707ed0>
>>> list(a)  # 如果不習慣,可以自己手動轉化爲list,也是寫兼容代碼需要注意的地方
[1, 2, 3]
$ python2
>>> a = map(abs, [1, 2, -3])
>>> a
[1, 2, 3] 
所以運行方法是
>>> t=['name','age','gender']
>>> t2=['milo',30,'male']

>>> for each in zip(t,t2):
    print(each)

運行結果:

('name', 'milo')
('age', 30)
('gender', 'male')


for each in zip(t,t2):
    print(each)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章