Python生成器和迭代器,with上下文管理工具

2021-09-18 01:22:01 字數 1950 閱讀 5052

1.生成器:

1.1 起源:

如果列表中有一萬個元素,我們只想要訪問前面幾個元素,對其進行相關操作,通過for迴圈方式效率太低,並且後面的元素會浪費記憶體,還會受到記憶體限制,所以產生生成器來解決這個問題。

1.2 啥是生成器:

通過某種演算法推演出我們所需要的內容,而不必建立所有的列表元素。這種一邊迴圈一遍計算的機制叫做生成器(generator)。通過使用yield返回值函式,每次呼叫yield都會暫停,將值返回出去進行計算處理。生成器類似於返回值為陣列的乙個函式,這個函式可以接受引數,可以被呼叫,但是,不同於一般的函式會一次性返回包括了所有數值的陣列,生成器一次只能產生乙個值,這樣消耗的記憶體數量將大大減小。生成器也是乙個更加複雜的迭代器。

1.3 建立生成器:

方法一:把列表生成式的 [  ]  改為 (  )  即可。

generator_item = ( i*i for  i  in  range(10))    輸出:at0x000002a4cbf9eba0>

如果要乙個個列印出來,可以通過next()函式獲得generator的下乙個返回值

print(next(generator_item))   ==> 1

print(next(generator_item))   ==> 4

print(next(generator_item))   ==> 9

通過這種方式(呼叫next()方法) ,最後會報錯 stopiteration ,所以一般不用這種方法,一般用for迴圈遍歷生成器

方法二:通過函式的形式建立,典型例子,斐波那契數列

def fib(max):

n,a,b =0,0,1

while n < max:

yield b

a,b =b,a+b

n = n+1

return 'done'

g = fib(6)

while true:

try:

x = next(g)

print('generator: ',x)

except stopiteration as e:

print("生成器返回值:",e.value)

break

2. 迭代器:(迭代就是迴圈)

2.1 定義: 迭代器包含有next方法的實現,在正確的範圍內返回期待的資料以及超出範圍後能夠丟擲stopiteration的錯誤停止迭代。

2.2 我們已經知道,可以直接作用於for迴圈的資料型別有以下幾種:

一類是集合資料型別,如list,tuple,dict,set,str等

一類是generator,包括生成器和帶yield的generator function

這些可以直接作用於for 迴圈的物件統稱為可迭代物件:iterable

可以使用isinstance()判斷乙個物件是否為可iterable物件

生成器不但可以作用於for迴圈,還可以被next()函式不斷呼叫並返回下乙個值,直到最後丟擲stopiteration錯誤表示無法繼續返回下乙個值

使用iter()函式可以將序列轉化為迭代器

2.3 小結

3.  with上下文管理器

一些不得不知道的知識:

上下文管理器:支援上下文管理協議的物件,這種物件實現了__enter__和__exit__方法。

as的作用:將返回的物件賦給乙個變數,以方便以後的使用。

with是乙個物件

執行步驟:

1.當進入語句塊時,先執行__enter__方法,把檔案開啟,並返回該檔案物件

2.執行**塊內容

3.離開**塊的時候,執行__exit__方法,關閉檔案。

在執行過程中,無論遇到什麼異常,都是要離開**塊的,這個時候就由__exit__方法接管了。可以在__exit__中定義,讓異常顯示出來。

Python迭代器和生成器

先說迭代器,對於string list dict tuple等這類容器物件,使用for迴圈遍歷是很方便的。在後台for語句對容器物件呼叫iter 函式,iter 是python的內建函式。iter 會返回乙個定義了next 方法的迭代器物件,它在容器中逐個訪問容器內元素,next 也是python的...

Python迭代器和生成器

迭代器是訪問集合元素的一種方法 是可以記住遍歷的位置的物件。迭代器物件從集合的第乙個元素開始訪問,直到所有的元素被訪問 他有兩個基本的方法,iter 和next 字串,列表或遠足物件都可以用於建立迭代器 list1 1,2,3,4 it1 iter list1 建立迭代器物件 print next ...

python 迭代器和生成器

迭代器是訪問集合元素的一種方式。迭代器物件從集合的第乙個元素開始訪問,直到所有的元素被訪問完結束。迭代器只能往前不會後退,不過這也沒什麼,因為人們很少在迭代途中往後退。另外,迭代器的一大優點是不要求事先準備好整個迭代過程中所有的元素。迭代器僅僅在迭代到某個元素時才計算該元素,而在這之前或之後,元素可...