python 迭代器與生成器

2022-07-23 06:42:14 字數 3571 閱讀 9107

迭代是python最強大的功能之一,是訪問集合元素的一種方式。。

迭代器是乙個可以記住遍歷的位置的物件。

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

迭代器兩個基本的方法iter()next()

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

例:>>>list=[1,2,3,4]

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

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

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

2>>>

迭代器物件可以使用常規for語句進行遍歷:

#!/usr/bin/python3

list=[1,2,3,4]

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

forxinit:

print(x, end="")

輸出結果:1 2 3 4

也可以使用next()函式

#!/usr/bin/python3

importsys# 引入 sys 模組

list=[1,2,3,4]

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

whiletrue:

try:

print(next(it))

exceptstopiteration:

sys.exit()12

34我們知道的迭代器有兩種:一種是呼叫方法直接返回的,一種是可迭代物件通過執行iter方法得到的,迭代器有的好處是可以節省記憶體。

如果在某些情況下,我們也需要節省記憶體,就只能自己寫。我們自己寫的這個能實現迭代器功能的東西就叫生成器。

python中提供的生成器:

1.生成器函式:常規函式定義,但是,使用yield語句而不是return語句返回結果。yield語句一次返回乙個結果,在每個結果中間,掛起函式的狀態,以便下次重它離開的地方繼續執行

2.生成器表示式:類似於列表推導,但是,生成器返回按需產生結果的乙個物件,而不是一次構建乙個結果列表

生成器generator:

本質:迭代器(所以自帶了__iter__方法和__next__方法,不需要我們去實現)

在 python 中,使用了 yield 的函式被稱為生成器(generator)。

乙個包含yield關鍵字的函式就是乙個生成器函式。yield可以為我們從函式中返回值,但是yield又不同於return,return的執行意味著程式的結束,呼叫生成器函式不會得到返回的具體的值,而是得到乙個可迭代的物件。每一次獲取這個可迭代物件的值,就能推動函式的執行,獲取新的返回值。直到函式執行結束。

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

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

以下例項使用 yield 實現斐波那契數列

#!/usr/bin/python3

importsys

deffibonacci(n): # 生成器函式 - 斐波那契

a, b, counter= 0, 1, 0

whiletrue:

if(counter> n):

returnyielda

a, b= b, a+ b

counter+= 1

f= fibonacci(10)# f 是乙個迭代器,由生成器返回生成

whiletrue:

try:

print(next(f), end="")

exceptstopiteration:

sys.exit()

輸出結果:

011235813213455

來看一下有yield和沒有yield的情況會對生成器了解多點:

#!/usr/bin/python3

importsys

deffibonacci(n,w=0):# 生成器函式 - 斐波那契

a,b,counter =0,1,0

whiletrue:

if(counter >n):

returnyielda

a,b =b,a +b

print('%d,%d'%(a,b))

counter +=1f =fibonacci(10,0)# f 是乙個迭代器,由生成器返回生成

whiletrue:

try:

print(next(f),end=" ")

except:

sys.exit()

輸出結果:

01,111,212,323,535,858,13813,211321,342134,553455,895589,144

#!/usr/bin/python3importsys

deffibonacci(n,w=0):# 生成器函式 - 斐波那契a,b,counter =0,1,0whiletrue:if(counter >n):return#yield aa,b =b,a +b

print('%d,%d'%(a,b))counter +=1f =fibonacci(10,0)# f 是乙個迭代器,由生成器返回生成whiletrue:try:print(next(f),end=" ")except:sys.exit()

輸出結果:

1,11,22,33,55,88,1313,2121,3434,5555,8989,144

第二種沒有yield時,函式只是簡單執行,沒有返回迭代器f。這裡的迭代器可以用生成l列表來理解一下:

>>>l =[i fori inrange(0,15)]>>>print(l)[0,1,2,3,4,5,6,7,8,9,10,11,12,13,14]>>>m =(i fori inrange(0,15))>>>print(m)>>>forg inm:...print(g,end=', ')...0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,

這裡的m就像上面的f一樣,是迭代器。

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關鍵字判斷元素是否...