Python 的迭代器與zip詳解

2022-09-24 14:39:19 字數 2189 閱讀 4133

目錄

首先丟擲乙個困擾本人許久的問題:

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 等...