生成器與迭代器

2021-08-21 06:31:23 字數 2126 閱讀 4302

通過列表推導式,可以直接建立乙個列表,但是收到記憶體限制,列表容量肯定是有限的而且,建立乙個包含100萬個元素的列表,占用很大的儲存空間。如果我們僅僅需要訪問前面幾個元素,後面 後面元素的占用儲存空間就被浪費

所以,如果列表元素可以按照某種演算法算出來,那我們就可以再迴圈當中不斷地推導它,生成元素,這樣就不必建立完整的list,從而大大節省了儲存空間。

在python中,這種一邊迴圈一邊計算的機制,成為生成器:generator

斐波那契數列案例實現生成器:

#數列寫法:1,1,2,3,5,8

#函式寫法

def fib(times):

a = 0

b = 1

n = 1

while n<=times:

print(b)

a,b = b,a+b

n += 1

fib(3)

#生成器寫法

def fib(times):

a = 0

b = 1

n = 1

while n<=times:

yield b

a,b = b,a+b

n+=1

p = fib(5)

print(p)

執行的結果為:

1 #函式寫法執行的結果

1 #函式寫法執行的結果

2 #函式寫法執行的結果

#生成器寫法執行的結果

yield 的作用就是把乙個函式變成乙個生成器, 帶有yield的函式不再是乙個普通的函式。python直譯器會將其視為乙個generator

呼叫fib(5)不會返回fib函式 而是返回乙個迭代器物件,在for迴圈執行時,每次迴圈都會執行fib函式的內部**

迭代是訪問集合元素的一種方式。迭代器是乙個可以記住遍歷的位置的物件。迭代器物件從集合的第一

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

可迭代物件

以直接作用於 for 迴圈的資料型別有以下幾種:

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

一類是 generator ,包括生成器和帶 yield 的generator function。這些可以直接作用於 for 迴圈的物件統稱為可迭代物件:iterable 。

判斷是否是可迭代

可以使用

isinstance()

判斷乙個物件是否是iterable物件:

而生成器不但可以作用於 for 迴圈,還可以被 next() 函式不斷呼叫並返回下乙個值,直到最後丟擲

stopiteration 錯誤表示無法繼續返回下乙個值了。

迭代器可以被

next()

iterator

。可以使用

isinstance()

判斷乙個物件是否是iterator物件:

iter函式

生成器都是

iterator

物件,但

list

、 dict

、 str

雖然是

iterable

,卻不是

iterator

。把 list

、 dict

、 str

等 iterable

變成 iterator

可以使用

iter(

) 函式:

總結:迭代器不一定是生成器,生成器一定是迭代器

凡是可作用於 for 迴圈的物件都是 iterable 型別; 凡是可作用於 next() 函式的物件都是 iterator 型別

集合資料型別如 list 、 dict 、 str 等是 iterable 但不是 iterator ,不過可以通過 iter() 函式獲得乙個iterator 物件。

迭代器與生成器

可迭代物件 可以直接作用於for迴圈的物件 統稱為可迭代物件 返回迭代器的物件 即iterable。一是集合資料型別,如list tuple dict set str等 二是generator,包括生成器和帶yield的generator function。容器 簡單來說 容器是一系列元素的集合 容...

生成器與迭代器

迭代是python最強大的功能之一,是訪問集合元素的一種方式。迭代器是乙個可以記住遍歷的位置的物件。迭代器物件從集合的第乙個元素開始訪問,直到所有的元素被訪問完結束。迭代器只能往前不會後退。迭代器有兩個基本的方法 iter 和 next 字串,列表或元組物件都可用於建立迭代器 list 1,2,3,...

迭代器與生成器

首先講述一下如何判斷物件是否可迭代,使用的命令為 from collections import iterable print isinstance 123,iterable 如果123是可迭代資料,則輸出ture,如果不是,則輸出false。建立乙個自己的列表 class mylist objec...