迭代是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/python3importsysdeffibonacci(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關鍵字判斷元素是否...