迭代器迭代是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
)# 建立迭代器物件
for x in it:
print
(x, end=
" ")
輸出結果:
123
4
使用 next() 函式:
#!/usr/bin/python3
import sys # 引入 sys 模組
list=[
1,2,
3,4]
it =
iter
(list
)# 建立迭代器物件
while
true
:try
:print
(next
(it)
)except stopiteration:
sys.exit(
)
輸出結果:
123
4
建立乙個迭代器
把乙個類作為乙個迭代器使用需要在類中實現兩個方法iter() 與next() 。
類都有乙個建構函式,python 的建構函式為init(), 它會在物件初始化的時候執行。
iter() 方法返回乙個特殊的迭代器物件, 這個迭代器物件實現了next() 方法並通過 stopiteration 異常標識迭代的完成。
next() 方法(python 2 裡是 next())會返回下乙個迭代器物件。
建立乙個返回數字的迭代器,初始值為 1,逐步遞增 1:
class
mynumbers
:def
__iter__
(self)
: self.a =
1return self
def__next__
(self)
: x = self.a
self.a +=
1return x
myclass = mynumbers(
)myiter =
iter
(myclass)
print
(next
(myiter)
)print
(next
(myiter)
)print
(next
(myiter)
)print
(next
(myiter)
)print
(next
(myiter)
)
輸出結果:
123
45
stopiteration
stopiteration 異常用於標識迭代的完成,防止出現無限迴圈的情況,在next() 方法中我們可以設定在完成指定迴圈次數後觸發 stopiteration 異常來結束迭代。
在 20 次迭代後停止執行:
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)
執行輸出結果為:
123
4567
891011
1213
1415
1617
1819
20
生成器在 python 中,使用了 yield 的函式被稱為生成器(generator)。
跟普通函式不同的是,生成器是乙個返回迭代器的函式,只能用於迭代操作,更簡單點理解生成器就是乙個迭代器。
在呼叫生成器執行的過程中,每次遇到 yield 時函式會暫停並儲存當前所有的執行資訊,返回 yield 的值, 並在下一次執行 next() 方法時從當前位置繼續執行。
呼叫乙個生成器函式,返回的是乙個迭代器物件。
以下例項使用 yield 實現斐波那契數列:
#!/usr/bin/python3
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(
)
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關鍵字判斷元素是否...