中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么理解Python的迭代器與zip

發布時間:2021-11-03 17:18:17 來源:億速云 閱讀:145 作者:iii 欄目:開發技術

這篇文章主要講解了“怎么理解Python的迭代器與zip”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“怎么理解Python的迭代器與zip”吧!

首先拋出一個困擾本人許久的問題:

nums = [1,2,3,4,5,6]
numsIter = iter(nums)
for _ in zip(*[numsIter]*3):
    print(_)
print(list(numsIter))

則控制臺輸出如何?

關于迭代器

1.對于支持迭代的集合對象,可以創建其迭代器對象。迭代器對象儲存了可迭代對象的地址和遍歷的位置,迭代器對象從集合的第一個元素開始訪問,所有的元素被訪問完迭代器被消耗(仍然占地址),但清空儲存的信息(即地址和遍歷位置)。使用list()函數或 * 操作符可以獲取所有遍歷的內容,結束后迭代器被消耗。

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)) 時輸出為空,因為迭代器對象已經找不到地址了。

2.復制迭代器對象,得到的是一個迭代器對象的引用,即地址,而不是新建一個迭代器。因此,遍歷位置是共同的。

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

關于zip

1.在創建zip對象時,并沒有直接生成新數據,而是存儲了要操作對象的迭代器,當真正需要的時候,才通過迭代器遍歷數據。因此,當使用list()函數或 * 操作符解壓zip對象時,當然是會消耗掉儲存的迭代器,使得再一次解壓時返回為空。

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,就是利用了迭代器儲存的遍歷位置,逐一地獲取數據,直到其中一個迭代器被消耗掉。文首的問題就是最好的例子 。

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)
[]

可以看見,實現的功能是把單行數據變成了3列2行。這是怎么做到的呢?執行zip時,依次訪問三個同樣的迭代器,每次訪問,迭代器的遍歷位置都會加1,于是第一輪結束后zip獲取了(1,2,3),同理第二輪則獲取了(4,5,6),隨后迭代器被消耗。第三輪zip對象已經沒有迭代器可用,于是結束執行。最后 print(list(numsIter)) 發現迭代器確實已經被消耗。

3.當使用 print 顯示迭代器或zip對象的內容時,list() 和 * 操作符幾乎沒有區別。但上述例子中,只能用 * 操作符來實現,因為 * 操作符實際上是返回對象的地址和遍歷位置,而 list() 會直接遍歷完畢從而消耗掉迭代器。

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,)
[]

感謝各位的閱讀,以上就是“怎么理解Python的迭代器與zip”的內容了,經過本文的學習后,相信大家對怎么理解Python的迭代器與zip這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

武穴市| 卢湾区| 黔东| 佛坪县| 洮南市| 德清县| 和顺县| 乐山市| 铁力市| 荆州市| 乐都县| 云霄县| 瑞丽市| 灵武市| 磐安县| 安溪县| 荆门市| 于都县| 柘荣县| 黎川县| 博罗县| 万年县| 乌什县| 镇宁| 华阴市| 田东县| 中江县| 兖州市| 贵溪市| 大名县| 马尔康县| 汝城县| 闵行区| 灵武市| 鱼台县| 德化县| 攀枝花市| 闽侯县| 永昌县| 济阳县| 黎城县|