Python版本3.3有zip這個用法嗎?
按理來說,這個code是沒錯的,會return出[(0,3),(1,1),(2,4)]的結果,但是最後一行那是什麼?誰能解釋一下?
回答:當然是有的!下面具體分析不同:
- 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 "&
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
&
※我的Live -- 爬蟲從入門到進階
※python寫的CGI腳本,用print為什麼不是列印到控制台,而是發送到客戶端?
※喵哥的Django學習筆記1:安裝
※寫爬蟲不會正則表達式?看這篇文章試試
※PY交易(一)使用Pygame
TAG:Python |