新聞中心
Python3 迭代器與生成器
迭代器
迭代是 Python 最強(qiáng)大的功能之一,是訪問(wèn)集合元素的一種方式。

創(chuàng)新互聯(lián)公司專注于企業(yè)營(yíng)銷型網(wǎng)站、網(wǎng)站重做改版、安平網(wǎng)站定制設(shè)計(jì)、自適應(yīng)品牌網(wǎng)站建設(shè)、H5頁(yè)面制作、商城網(wǎng)站建設(shè)、集團(tuán)公司官網(wǎng)建設(shè)、外貿(mào)網(wǎng)站建設(shè)、高端網(wǎng)站制作、響應(yīng)式網(wǎng)頁(yè)設(shè)計(jì)等建站業(yè)務(wù),價(jià)格優(yōu)惠性價(jià)比高,為安平等各大城市提供網(wǎng)站開發(fā)制作服務(wù)。
迭代器是一個(gè)可以記住遍歷的位置的對(duì)象。
迭代器對(duì)象從集合的第一個(gè)元素開始訪問(wèn),直到所有的元素被訪問(wèn)完結(jié)束。迭代器只能往前不會(huì)后退。
迭代器有兩個(gè)基本的方法:iter() 和 next()。
字符串,列表或元組對(duì)象都可用于創(chuàng)建迭代器:
實(shí)例(Python 3.0+)
>>>
list
=
[
1
,
2
,
3
,
4
]
>>> it
=
iter
(
list
)
# 創(chuàng)建迭代器對(duì)象
>>>
print
(next
(it
)
)
# 輸出迭代器的下一個(gè)元素
1
>>>
print
(next
(it
)
)
2
>>>
迭代器對(duì)象可以使用常規(guī)for語(yǔ)句進(jìn)行遍歷:
實(shí)例(Python 3.0+)
#!/usr/bin/python3
list
=
[
1
,
2
,
3
,
4
]
it
=
iter
(
list
)
# 創(chuàng)建迭代器對(duì)象
for
x
in
it
:
print
(
x
,
end
=
"
"
)
執(zhí)行以上程序,輸出結(jié)果如下:
1 2 3 4
也可以使用 next() 函數(shù):
實(shí)例(Python 3.0+)
#!/usr/bin/python3
import
sys
# 引入 sys 模塊
list
=
[
1
,
2
,
3
,
4
]
it
=
iter
(
list
)
# 創(chuàng)建迭代器對(duì)象
while
True
:
try
:
print
(
next
(
it
)
)
except
StopIteration
:
sys
.
exit
(
)
執(zhí)行以上程序,輸出結(jié)果如下:
1 2 3 4
創(chuàng)建一個(gè)迭代器
把一個(gè)類作為一個(gè)迭代器使用需要在類中實(shí)現(xiàn)兩個(gè)方法 __iter__() 與 __next__() 。
如果你已經(jīng)了解的面向?qū)ο缶幊?,就知道類都有一個(gè)構(gòu)造函數(shù),Python 的構(gòu)造函數(shù)為 __init__(), 它會(huì)在對(duì)象初始化的時(shí)候執(zhí)行。
更多內(nèi)容查閱:
__iter__() 方法返回一個(gè)特殊的迭代器對(duì)象, 這個(gè)迭代器對(duì)象實(shí)現(xiàn)了 __next__() 方法并通過(guò) StopIteration 異常標(biāo)識(shí)迭代的完成。
__next__() 方法(Python 2 里是 next())會(huì)返回下一個(gè)迭代器對(duì)象。
創(chuàng)建一個(gè)返回?cái)?shù)字的迭代器,初始值為 1,逐步遞增 1:
實(shí)例(Python 3.0+)
class
MyNumbers
:
def
__iter__
(
self
)
:
self
.
a
=
1
return
self
def
__next__
(
self
)
:
x
=
self
.
a
self
.
a
+=
1
return
x
myclass
=
MyNumbers
(
)
myiter
=
iter
(
myclass
)
print
(
next
(
myiter
)
)
print
(
next
(
myiter
)
)
print
(
next
(
myiter
)
)
print
(
next
(
myiter
)
)
print
(
next
(
myiter
)
)
執(zhí)行輸出結(jié)果為:
1 2 3 4 5
StopIteration
StopIteration 異常用于標(biāo)識(shí)迭代的完成,防止出現(xiàn)無(wú)限循環(huán)的情況,在 __next__() 方法中我們可以設(shè)置在完成指定循環(huán)次數(shù)后觸發(fā) StopIteration 異常來(lái)結(jié)束迭代。
在 20 次迭代后停止執(zhí)行:
實(shí)例(Python 3.0+)
class
MyNumbers
:
def
__iter__
(
self
)
:
self
.
a
=
1
return
self
def
__next__
(
self
)
:
if
self
.
a
<=
20
:
x
=
self
.
a
self
.
a
+=
1
return
x
else
:
raise
StopIteration
myclass
=
MyNumbers
(
)
myiter
=
iter
(
myclass
)
for
x
in
myiter
:
print
(
x
)
執(zhí)行輸出結(jié)果為:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
生成器
在 Python 中,使用了 yield 的函數(shù)被稱為生成器(generator)。
yield 是一個(gè)關(guān)鍵字,用于定義生成器函數(shù),生成器函數(shù)是一種特殊的函數(shù),可以在迭代過(guò)程中逐步產(chǎn)生值,而不是一次性返回所有結(jié)果。
跟普通函數(shù)不同的是,生成器是一個(gè)返回迭代器的函數(shù),只能用于迭代操作,更簡(jiǎn)單點(diǎn)理解生成器就是一個(gè)迭代器。
當(dāng)在生成器函數(shù)中使用 yield 語(yǔ)句時(shí),函數(shù)的執(zhí)行將會(huì)暫停,并將 yield 后面的表達(dá)式作為當(dāng)前迭代的值返回。
然后,每次調(diào)用生成器的 next() 方法或使用 for 循環(huán)進(jìn)行迭代時(shí),函數(shù)會(huì)從上次暫停的地方繼續(xù)執(zhí)行,直到再次遇到 yield 語(yǔ)句。這樣,生成器函數(shù)可以逐步產(chǎn)生值,而不需要一次性計(jì)算并返回所有結(jié)果。
調(diào)用一個(gè)生成器函數(shù),返回的是一個(gè)迭代器對(duì)象。
下面是一個(gè)簡(jiǎn)單的示例,展示了生成器函數(shù)的使用:
實(shí)例
def
countdown
(
n
)
:
while
n
>
0
:
yield
n
n
-=
1
# 創(chuàng)建生成器對(duì)象
generator
=
countdown
(
5
)
# 通過(guò)迭代生成器獲取值
print
(
next
(
generator
)
)
# 輸出: 5
print
(
next
(
generator
)
)
# 輸出: 4
print
(
next
(
generator
)
)
# 輸出: 3
# 使用 for 循環(huán)迭代生成器
for
value
in
generator
:
print
(
value
)
# 輸出: 2 1
以上實(shí)例中,countdown 函數(shù)是一個(gè)生成器函數(shù)。它使用 yield 語(yǔ)句逐步產(chǎn)生從 n 到 1 的倒數(shù)數(shù)字。在每次調(diào)用 yield 語(yǔ)句時(shí),函數(shù)會(huì)返回當(dāng)前的倒數(shù)值,并在下一次調(diào)用時(shí)從上次暫停的地方繼續(xù)執(zhí)行。
通過(guò)創(chuàng)建生成器對(duì)象并使用 next() 函數(shù)或 for 循環(huán)迭代生成器,我們可以逐步獲取生成器函數(shù)產(chǎn)生的值。在這個(gè)例子中,我們首先使用 next() 函數(shù)獲取前三個(gè)倒數(shù)值,然后通過(guò) for 循環(huán)獲取剩下的兩個(gè)倒數(shù)值。
生成器函數(shù)的優(yōu)勢(shì)是它們可以按需生成值,避免一次性生成大量數(shù)據(jù)并占用大量?jī)?nèi)存。此外,生成器還可以與其他迭代工具(如for循環(huán))無(wú)縫配合使用,提供簡(jiǎn)潔和高效的迭代方式。
執(zhí)行以上程序,輸出結(jié)果如下:
5 4 3 2 1
以下實(shí)例使用 yield 實(shí)現(xiàn)斐波那契數(shù)列:
實(shí)例(Python 3.0+)
#!/usr/bin/python3
import
sys
def
fibonacci
(
n
)
:
# 生成器函數(shù) - 斐波那契
a
,
b
,
counter
=
0
,
1
,
0
while
True
:
if
(
counter
>
n
)
:
return
yield
a
a
,
b
=
b
,
a
+
b
counter
+=
1
f
=
fibonacci
(
10
)
# f 是一個(gè)迭代器,由生成器返回生成
while
True
:
try
:
print
(
next
(
f
)
,
end
=
"
"
)
except
StopIteration
:
sys
.
exit
(
)
執(zhí)行以上程序,輸出結(jié)果如下:
0 1 1 2 3 5 8 13 21 34 55
分享題目:Python3迭代器與生成器
文章出自:http://fisionsoft.com.cn/article/dhsiigg.html


咨詢
建站咨詢
