python基礎之生成器迭代器

2021-07-31 07:23:29 字數 3189 閱讀 9891

1 生成器:

為什麼要有生成器?

就拿列表來說吧,假如我們要建立乙個list,這個list要求格式為:[1,4,9,16,25,36……]這麼一直持續下去,直到有了一萬個元素的時候為止。如果我們要建立這個list,那麼應該是這樣的:

[i*i for i in range(1,10001)]     #

列表生成式,不要忘了

#結果就不列出來了

這樣的話,這個list會占用極多的記憶體,如果我們能只將演算法儲存在list中,那麼這個list所佔的記憶體會大大減小,等我們需要用到list的值的時候,這個list會自動執行其中的演算法,將第乙個值輸出,再次執行時,就會自動輸出第二個值,以此類推…… 這個特殊的list就被我們稱之為生成器(generator)。

如何建立生成器?

建立生成器有很多方法:

1 第一種方法:

#

將list生成式中的『[』換為『(』

>>> (i*i for i in range(1,10001))

at 0x7fb0a69dc6e0>

>>> g=(i*i for i in range(1,10001))

#使用next()函式獲取g的下乙個值

>>>g.next()

1>>>g.next()

4>>>next(g)9#

當沒有元素可返回的時候,會報錯

>>> g=(i for i in range(1,3))

>>>g.next()

1>>>g.next()

2>>>g.next()

traceback (most recent call last):

file

"", line 1, in

stopiteration

#實際上,我們不推薦用next()函式,較為常用的是用for迴圈,實際上for迴圈的本質就是呼叫了next()函式。即:首先通過iter()將可迭代的資料轉換為可迭代物件,然後呼叫next()

g=(i for i in range(1,11))

for i in

g:

print

(i)#

結果為:12

3456

78910

#這樣當沒有值可供返回的時候就會退出迴圈並不會報錯。

2第二種方法:

這種方法用在函式中,比如說用函式實現楊輝三角:

1

1 1

1 2 1

1 3 3 1

1 4 6 4 1

1 5 10 10 5 1

1……………………………………………………………1

個人實現該函式的**:

def

yh():

l=[1]

n=[1]

while

true:

yield

n #這裡有乙個yield關鍵字!,yield就是定義generator的關鍵字,yield類似於return,

#當函式執行到這裡就會結束,但不同的是,當下次繼續執行該函式時,就會從yield下方開始,也就是接續上次執行的地方繼續執行。

n=copy.copy(l) #

注意這裡為什麼要用copy功能!!!!

for i in

range(len(l)):

n[i]=l[i]+l[i-1]

l=nimport

copy

n=0for i in

yh():

if n==10:

break

print

(i) n=n+1

這裡有乙個yield關鍵字!,yield就是定義generator的關鍵字,yield類似於return,當函式執行到這裡就會結束,但不同的是,當下次繼續執行該函式時,就會從yield下方開始,也就是接續上次執行的地方繼續執行。

另外摘抄了乙個比較短小精悍的**:

def

yh():

n = [1]

while

true:

yield

n n = [n[i-1] + n[i] for i in

range(len(n))]

…………

…………

2  迭代器

迭代器有什麼用途?

生成器儲存了演算法,而迭代器則負責一次輸出乙個該演算法的結果。迭代器類似於生成器(事實上,並不僅僅只是生成器)與迴圈的結合,只不過這個迴圈「很懶」,一次只輸出乙個值。

迭代和迭代器的區別:

迭代:

幾乎所有的python物件都是可迭代的,像str dict list tuple generator set……等都是可迭代的。

判斷乙個物件是否可迭代:

>>> from collections import

iterable

>>>isinstance(, iterable)

true

迭代器:

可以被next()函式呼叫並不斷返回下乙個值的物件稱為迭代器:iterable

判斷乙個物件是否為迭代器物件:

>>> from collections import

iterator

>>> isinstance((x for x in range(10)), iterator)

true

>>>isinstance(, iterator)

false

>>>isinstance({}, iterator)

false

>>> isinstance('

abc'

, iterator)

false

生成器就是乙個迭代器物件,他可以被next()函式呼叫。而像其他型別的物件,例如list,dict……需要使用iter()函式將其轉換為迭代器物件。

>>>isinstance(iter(), iterator)

true

>>> isinstance(iter('

abc'

), iterator)

true

本文參考了廖雪峰大神的python教程。

Python之生成器 迭代器

利用 建立generator a x x for x in range 10 列表生成式 a 0,1,4,9,16,25,36,49,64,81 b x x for x in range 10 用 建立乙個generator b at 0x7f62455db258 next b 利用 next 呼叫...

python之迭代器 生成器

迭代器 迭代器是訪問集合元素的一種方式。迭代器物件從集合的第乙個元素開始訪問,直到所有的元素被訪問完結束。迭代器提供了統一的訪問集合的介面,只要定義 iter 方法物件,就可以使用迭代器訪問。迭代器有兩個基本的方法 iter 方法 返回迭代器物件本身 按我自己比較土的理解方法就是,每呼叫一次iter...

Python之生成器 迭代器

生成器類似返回值為陣列的乙個函式,這個函式可以接受引數,可被呼叫,但只能產生乙個值,所以大大節省記憶體。生成器表示式的語法非常簡單,只需要將列表推導式的中括號改成小括號就可以了 1 x x for x in range 10 if x 2 0 會列印出整個列表 0,4,8,12,16 1 x x f...