python迭代器生成器-迭代器和list區別


迭代 生成

for循環遍歷的原理

for循環遍歷的原理就是迭代,in后面必須是可迭代對象

為什么要有迭代器

對於序列類型:字符串、列表、元組,我們可以使用索引的方式迭代取出其包含的元素。但對於字典、集合、文件等類型是沒有索引的,若還想取出其內部包含的元素,則必須找出一種不依賴於索引的迭代方式,這就是迭代器

1.可迭代對象

__iter__方法的對象,都是可迭代對象,有以下6種

可迭代的對象:Python內置str、list、tuple、dict、set、file都是可迭代對象

"zx".__iter__()
["zx"].__iter__()
{"zx":"wl"}.__iter__()
("zx",).__iter__()
{"z","x"}.__iter__()
with open("prize.txt","r") as file:
    file.__iter__()

2.迭代器對象

1.可迭代的對象執行__iter__方法得到的返回值是迭代器對象。2.迭代器對象指的是即內置有__iter__又內置有__next__方法的對象

list=[1,2,3,4,5,6]
zx=list.__iter__()
while True:
    try:
        print(zx.__next__())
    except:
        break

文件類型是迭代器對象

open('a.txt').__iter__()
open('a.txt').__next__()

迭代器對象一定是可迭代對象,而可迭代對象不一定是迭代器對象

生成器

生成器就是一種迭代器。迭代器有一個特點就是可以被next()函數調用並不斷返回下一個值的對象,並且只能迭代它們一次。原因很簡單,因為它們不是全部存在內存里,它們只在要調用的時候在內存里生成。

生成器就是迭代器(函數返回的結果就是生成器,而且它同時有__iter____next__

def zx():
    yield 1
    yield 2
x=zx()

x.__next__()
x.__iter__()

實驗室

每次__next__之后,會執行到相應的yield不會執行下面的內容。

為啥?這個實驗執行了呢,因為用了for,他不知道最后執行到哪里,他就會一直__next__,直到最后拋出異常,然而for in里面自帶捕獲異常的內容,所有沒有打印異常信息。

def func():
    yield [1,1,23]  # yield會使函數func()變成生成器對象,因此他就具有__iter__方法
    print(789) # yield會停止函數,當運行下一次next才會繼續運行下面的代碼
    yield 101112 # 一個yield對應一個next
    print(131415)

g = func()
for i in g:
    print(i)

[1, 1, 23]
789
101112
131415

關於迭代器和和生成器的區別

生成器是一種特殊的迭代器,生成器實現了迭代器協議--iter--,--next--

生成器是可以改變迭代的值的,然而迭代器隨意改值會有問題

關於迭代器和list的區別

list直接把所有數據加載到內存

而迭代器是一個一個取值,在需要下一個值的時候才回去計算取出這個值到內存(可以把迭代器想象成一個生成器的代碼,一次next,運行下面的代碼,然后返回值)

關於迭代器深入的信息可以查看大佬博客
https://www.cnblogs.com/deeper/p/7565571.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM