python 迭代器與生成器的初步認識使用

2021-10-23 11:00:15 字數 3371 閱讀 2663

迭代是python最強大的功能之一,是訪問集合元素的一種方式,是乙個可以記住遍歷的位置的物件。

迭代器物件從集合的第乙個元素開始訪問,直到所有的元素被訪問完結束。迭代器只能往前不會後退。

迭代器有兩個基本的方法:iter() 和 next()。

遞迴和迭代的區別:遞迴是內部指標等待的乙個過程,需要一直巢狀得到結果,而迭代是遍歷的過程,前面的過程結束後可以進行下一項,不需要等待

字串,列表或元組物件都可用於建立迭代器

for迴圈實際上實現了__iter__()方法生成了乙個迭代器物件,然後一步步next(for迴圈實際上就是一步步next) 直到報錯並返回 , 是乙個完整的過程

對於序列如此,對於字典和檔案等也是如此,統一生成迭代器來迴圈

所以,凡是能被for迴圈的物件內部都有乙個__iter__()方法:如dict list set tuple 內部都有__iter__方法

for i in file: 所以讀取檔案用for,檔案生成迭代器是一行行讀,前面讀完的行記憶體就**掉了,不占用記憶體

next()內建函式實際上就是實現物件內部的__next__()方法,效果一樣

list=[1,2,3,4]

it = iter(list) # 建立迭代器物件

print (next(it)) # 輸出迭代器的下乙個元素

把乙個類作為乙個迭代器使用需要在類中實現兩個方法iter() 與next() 。

iter() 方法返回乙個特殊的迭代器物件, 這個迭代器物件實現了next() 方法並通過 stopiteration 異常標識迭代的完成。

next() 方法(python 2 裡是 next())會返回下乙個迭代器物件。

class

mynumbers

:def

__iter__

(self)

: self.a =

1return self

def__next__

(self)

:if self.a <=20:

x = self.a

self.a +=

1return x

else

:raise stopiteration

myclass = mynumbers(

)myiter =

iter

(myclass)

for x in myiter:

print

(x)

在 python 中,使用了 yield 的函式被稱為生成器(generator),或者說 一邊迴圈一邊計算的機制,稱為生成器:generator

跟普通函式不同的是,生成器是乙個返回迭代器的函式,只能用於迭代操作,更簡單點理解生成器就是乙個迭代器。

在呼叫生成器執行的過程中,每次遇到 yield 時函式會暫停並儲存當前所有的執行資訊,返回 yield 的值, 並在下一次執行 next() 方法時從當前位置繼續執行,呼叫乙個生成器函式,返回的是乙個迭代器物件。

為什麼要用生成器?

列表所有資料都在記憶體中,如果有海量資料的話將會非常耗記憶體。

如:僅僅需要訪問前面幾個元素,那後面絕大多數元素占用的空間都白白浪費了。如果列表元素按照某種演算法推算出來,那我們就可以在迴圈的過程中不斷推算出後續的元素,這樣就不必建立完整的list,從而節省大量的空間。

簡單一句話:我又想要得到龐大的資料,又想讓它占用空間少,那就用生成器!

生成器的工作原理

(1)生成器(generator)能夠迭代的關鍵是它有乙個next()方法 工作原理就是通過重複呼叫next()方法,直到捕獲乙個異常。

(2)帶有 yield 的函式不再是乙個普通函式,而是乙個生成器generator。可用next()呼叫生成器物件來取值。next 兩種方式 t.next() | next(t)。可用for 迴圈獲取返回值(每執行一次,取生成器裡面乙個值)

(基本上不會用next()來獲取下乙個返回值,而是直接使用for迴圈來迭代)。

(3)yield相當於 return 返回乙個值,並且記住這個返回的位置,下次迭代時,**從yield的下一條語句開始執行。

(4).send() 和next()一樣,都能讓生成器繼續往下走一步(下次遇到yield停),但send()能傳乙個值,這個值作為yield表示式整體的結果

——換句話說,就是send可以強行修改上乙個yield表示式值。比如函式中有乙個yield賦值,a = yield 5,第一次迭代到這裡會返回5,a還沒有賦值。第二次迭代時,使用.send(10),那麼,就是強行修改yield 5表示式的值為10,本來是5的,那麼a=10

import sys

deffibonacci

(n):

# 生成器函式 - 斐波那契

a, b, counter =0,

1,0while

true:if

(counter > n)

:return

yield a

a, b = b, a + b

counter +=

1f = fibonacci(10)

# f 是乙個迭代器,由生成器返回生成

while

true

:try

:print

(next

(f), end=

" ")

except stopiteration:

sys.exit(

)

1

#encoding:utf-8

2def

yield_test

(n):

3for i in

range

(n):

4yield call(i)

5print

("i="

,i)6

print

("done.")7

8def

call

(i):

9return i*210

11for i in yield_test(5)

:12print

(i,","

)>>

>

0, i=0

2, i=1

4, i=2

6, i=3

8,

i=4

done.

>>

>

Python生成器與迭代器

生成器只有在用的時候會出現在記憶體中,對比列表全部存在記憶體中,減少了記憶體占用 next 函式 依次取生成器的值 s x 2 for x in range 1000 中括號是列表解析,小括號表示生成一系列值,就是生成器 s at 0x7fa20aa8b048 print next s 用next ...

python 迭代器與生成器

迭代器和生成器 print 1 in 1,2,3 print 1 not in 1,2,3 print 4 in print 4 not in 1,2,3 print x not in dlkjfxfei 可迭代物件 iterable 可以被next 函式呼叫並不斷返回下乙個值 知道沒有資料時丟擲s...

Python 迭代器與生成器

一 迭代器 理解迭代器需要搞清楚容器 container 迭代器協議 可迭代物件 iterable 迭代器 iterator 生成器 generator 1 容器 container 容器是一種把多個元素組織在一起的資料結構,容器中的元素可以逐個地迭代獲取,可以用in,not in關鍵字判斷元素是否...