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