目錄
首先丟擲乙個困擾本人許久的問題:
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))
輸出為:
[1,2,3程式設計客棧,4,5,6]
第二次鍵入 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(_))
輸出為:
www.cppcns.comect at 0x0000020594445a00>
[, ]12
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))
輸出為:
[(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))
輸出為:
(1,)
(2,)
(3,)
(1,)
(2,)
(3,)
(1,)
(2,)
(3,)
在熟悉迭代器和zip()函式的同時,掌握了乙個將一維資料變為二維資料的方法。
本文標題: python 的迭代器與zip詳解
本文位址: /jiaoben/python/434879.html
iter a 2 迭代器與zip()應用
iter 是python中的迭代器,不太使用,下面展示兩種功能。1.用於簡單迭代 in 53 a out 53 1,2,3,4,5,6 in 54 b iter a in 55 list b out 55 1,2,3,4,5,6 in 57 type b out 57 list iterator2....
Python 迭代物件與迭代器
可迭代物件 iterable 可以直接作用於for迴圈的物件統稱為可迭代物件。可以用isinstance 去判斷乙個物件是否是可迭代物件 iterable 可以直接作用於for的資料型別一般分兩種 1 集合資料型別,如list tuple dict set string 2 generator,包括...
python的迭代器 Python 迭代器
迭代器 迭代是訪問集合元素的一種方式。迭代器是乙個可以記住遍歷的位置的物件。迭代器物件從集合的第乙個元素開始訪問,直到所有的元素被訪問完結束。迭代器只能往前不會後退。可迭代物件 以直接作用於 for 迴圈的資料型別有以下幾種 一類是集合資料型別,如 list tuple dict set str 等...