一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語言編程技術及教程分享平臺!
分類導航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務器之家 - 腳本之家 - Python - Python 的迭代器與zip詳解

Python 的迭代器與zip詳解

2022-02-23 13:03埠默笙聲聲聲脈 Python

本篇文章主要介紹Python 的迭代器與zip,可迭代對象的相關概念,有需要的小伙伴可以參考下,希望能夠給你帶來幫助

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

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

則控制臺輸出如何?

關于迭代器

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

?
1
2
3
4
5
6
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.復制迭代器對象,得到的是一個迭代器對象的引用,即地址,而不是新建一個迭代器。因此,遍歷位置是共同的。

?
1
2
3
4
5
6
7
8
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對象時,當然是會消耗掉儲存的迭代器,使得再一次解壓時返回為空。

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

?
1
2
3
4
5
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() 會直接遍歷完畢從而消耗掉迭代器。

?
1
2
3
4
5
6
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,)
[]

總結:

在熟悉迭代器和zip()函數的同時,掌握了一個將一維數據變為二維數據的方法。

本篇文章就到這里了,希望能夠給你帶來幫助,也希望您能夠多多關注服務器之家的更多內容!

原文鏈接:https://www.cnblogs.com/wsy950409/p/15485341.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: www.一区二区三区.com | 久久视频精品3线视频在线观看 | 亚洲视频男人的天堂 | 亚洲国产精品综合久久网络 | 天天综合天天色 | 午夜理伦片免费 | 日本成熟老妇xxxx | 免费看日韩 | 成熟女人50岁一级毛片不卡 | 好大好硬好深好爽gif图 | 高清国语自产拍免费视频国产 | 嗯啊好大好粗 | 久久亚洲高清观看 | 精精国产www视频在线观看免费 | 非洲一级毛片又粗又长aaaa | 波多野结衣在线中文字幕 | kk4444在线影视播放 | 金莲你下面好紧夹得我好爽 | 天天干狠狠操 | 搓光美女衣 | 国产精品久久久久久久久免费观看 | 成年男女免费视频网站 | yy6080午夜国产免费福利 | 亚洲精品免费在线 | 亚洲九九爱| 久久这里都是精品 | 亚洲免费精品 | 国产精品xxxav免费视频 | 513热点网 | 亚洲天天综合 | 男人女人叉叉叉 | 亚洲香蕉网久久综合影院3p | 亚洲国产精品日韩高清秒播 | 美女撒尿部位无遮挡 | 国产精品欧美一区二区 | 免费xxxxx大片在线观看影视 | 日韩首页| 女生被爆操 | 久久人妻少妇嫩草AV无码 | 韩剧在线观看 | 四虎影院久久 |