Python 的迭代器與zip詳解
首先拋出一個(gè)困擾本人許久的問(wèn)題:
nums = [1,2,3,4,5,6] numsIter = iter(nums) for _ in zip(*[numsIter]*3): print(_) print(list(numsIter))
則控制臺(tái)輸出如何?
關(guān)于迭代器
1.對(duì)于支持迭代的集合對(duì)象,可以創(chuàng)建其迭代器對(duì)象。迭代器對(duì)象儲(chǔ)存了可迭代對(duì)象的地址和遍歷的位置,迭代器對(duì)象從集合的第一個(gè)元素開(kāi)始訪問(wèn),所有的元素被訪問(wèn)完迭代器被消耗(仍然占地址),但清空儲(chǔ)存的信息(即地址和遍歷位置)。使用list()函數(shù)或 * 操作符可以獲取所有遍歷的內(nèi)容,結(jié)束后迭代器被消耗。
nums = [1,2,3,4,5,6] numsIter = iter(nums) print(nums) print(list(nums)) print(nums) print(list(nums))
輸出為:
<list_iterator object at 0x00000205944619D0>
[1,2,3,4,5,6]
<list_iterator object at 0x00000205944619D0>
[]
第二次鍵入 print(list(nums)) 時(shí)輸出為空,因?yàn)榈鲗?duì)象已經(jīng)找不到地址了。
2.復(fù)制迭代器對(duì)象,得到的是一個(gè)迭代器對(duì)象的引用,即地址,而不是新建一個(gè)迭代器。因此,遍歷位置是共同的。
nums = [1,2,3,4,5,6] numsIter = iter(nums) numsIter_list = [numsIter] * 2 print(numsIter) print(numsIter_list) for _ in numsIter_list: print(next(_))
輸出為:
<list_iterator object at 0x0000020594445A00>
[<list_iterator object at 0x0000020594445A00>, <list_iterator object at 0x0000020594445A00>]
1
2
關(guān)于zip
1.在創(chuàng)建zip對(duì)象時(shí),并沒(méi)有直接生成新數(shù)據(jù),而是存儲(chǔ)了要操作對(duì)象的迭代器,當(dāng)真正需要的時(shí)候,才通過(guò)迭代器遍歷數(shù)據(jù)。因此,當(dāng)使用list()函數(shù)或 * 操作符解壓zip對(duì)象時(shí),當(dāng)然是會(huì)消耗掉儲(chǔ)存的迭代器,使得再一次解壓時(shí)返回為空。
P = [1,2,3] Q = [4,5,6] PQ_zip = zip(P,Q) print(PQ_zip) print(list(PQ_zip)) print(list(PQ_zip))
輸出為:
<zip object at 0x0000020594520140>
[(1, 4), (2, 5), (3, 6)]
[]
2.zip之所以能work,就是利用了迭代器儲(chǔ)存的遍歷位置,逐一地獲取數(shù)據(jù),直到其中一個(gè)迭代器被消耗掉。文首的問(wèn)題就是最好的例子 。
nums = [1,2,3,4,5,6] numsIter = iter(nums) for _ in zip(*[numsIter]*3): print(_) print(list(numsIter))
輸出為:
(1, 2, 3)
(4, 5, 6)
[]
可以看見(jiàn),實(shí)現(xiàn)的功能是把單行數(shù)據(jù)變成了3列2行。這是怎么做到的呢?執(zhí)行zip時(shí),依次訪問(wèn)三個(gè)同樣的迭代器,每次訪問(wèn),迭代器的遍歷位置都會(huì)加1,于是第一輪結(jié)束后zip獲取了(1,2,3),同理第二輪則獲取了(4,5,6),隨后迭代器被消耗。第三輪zip對(duì)象已經(jīng)沒(méi)有迭代器可用,于是結(jié)束執(zhí)行。最后 print(list(numsIter)) 發(fā)現(xiàn)迭代器確實(shí)已經(jīng)被消耗。
3.當(dāng)使用 print 顯示迭代器或zip對(duì)象的內(nèi)容時(shí),list() 和 * 操作符幾乎沒(méi)有區(qū)別。但上述例子中,只能用 * 操作符來(lái)實(shí)現(xiàn),因?yàn)?* 操作符實(shí)際上是返回對(duì)象的地址和遍歷位置,而 list() 會(huì)直接遍歷完畢從而消耗掉迭代器。
nums = [1,2,3] numsIter = iter(nums) print(numsIter) for _ in zip(list(numsIter)*3): print(_) print(list(numsIter))
輸出為:
<list_iterator object at 0x0000020594445B80>
(1,)
(2,)
(3,)
(1,)
(2,)
(3,)
(1,)
(2,)
(3,)
[]
總結(jié):
在熟悉迭代器和zip()函數(shù)的同時(shí),掌握了一個(gè)將一維數(shù)據(jù)變?yōu)槎S數(shù)據(jù)的方法。
本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
NumPy對(duì)數(shù)組按索引查詢實(shí)戰(zhàn)方法總結(jié)
數(shù)組的高級(jí)操作主要是組合數(shù)組,拆分?jǐn)?shù)組,tile數(shù)組和重組元素,下面這篇文章主要給大家介紹了關(guān)于NumPy對(duì)數(shù)組按索引查詢的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2022-08-08Python HTMLTestRunner測(cè)試報(bào)告view按鈕失效解決方案
這篇文章主要介紹了Python HTMLTestRunner測(cè)試報(bào)告view按鈕失效解決方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-05-05Python?matplotlib實(shí)戰(zhàn)之散點(diǎn)圖繪制
散點(diǎn)圖,又名點(diǎn)圖、散布圖、X-Y圖,是將所有的數(shù)據(jù)以點(diǎn)的形式展現(xiàn)在平面直角坐標(biāo)系上的統(tǒng)計(jì)圖表,本文主要為大家介紹了如何使用Matplotlib繪制散點(diǎn)圖,需要的可以參考下2023-08-08用Python爬取618當(dāng)天某東熱門商品銷量數(shù)據(jù),看看大家喜歡什么!
618購(gòu)物節(jié),準(zhǔn)備分析一波購(gòu)物節(jié)大家都喜歡買什么?本文以某東為例,Python爬取618活動(dòng)的暢銷商品數(shù)據(jù),并進(jìn)行數(shù)據(jù)清洗,最后以可視化的方式從不同角度去了解暢銷商品中,名列前茅的商品是哪些?銷售數(shù)據(jù)如何?用戶好評(píng)如何?等等,需要的朋友可以參考下2021-06-06Python批量自動(dòng)修改文件名,按指定的格式自動(dòng)命名方式
這篇文章主要介紹了Python批量自動(dòng)修改文件名,按指定的格式自動(dòng)命名方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08Python實(shí)現(xiàn)將絕對(duì)URL替換成相對(duì)URL的方法
這篇文章主要介紹了Python實(shí)現(xiàn)將絕對(duì)URL替換成相對(duì)URL的方法,涉及Python字符串操作及正則匹配的相關(guān)技巧,需要的朋友可以參考下2015-06-06如何將Yolov5的detect.py修改為可以直接調(diào)用的函數(shù)詳解
YOLOv4還沒(méi)有退熱,YOLOv5已經(jīng)發(fā)布,下面這篇文章主要給大家介紹了關(guān)于如何將Yolov5的detect.py修改為可以直接調(diào)用的函數(shù)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-04-04高質(zhì)量Python代碼編寫的5個(gè)優(yōu)化技巧
這篇文章主要為大家詳細(xì)介紹了編寫高質(zhì)量Python代碼的5個(gè)優(yōu)化技巧,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-11-11Python讀取圖片屬性信息的實(shí)現(xiàn)方法
這篇文章介紹了利用Python讀取圖片屬性信息的方法,讀取的內(nèi)容包括GPS 信息、圖片分辨率、圖片像素、設(shè)備商、拍攝設(shè)備等,有需要的朋友們可以參考借鑒。2016-09-09