python如何定義一個(gè)迭代器去生成偶數(shù)數(shù)列
定義一個(gè)迭代器去生成偶數(shù)數(shù)列
#創(chuàng)建迭代器類
class EvenIterator:
def __init__(self,min_value,max_value):
# 初始化參數(shù)
self.min_value = min_value
self.max_value = max_value
def __iter__(self):
return self
def __next__(self):
# 在這里定義好累加條件
if self.min_value % 2 != 0:#判斷最小值是不是偶數(shù),不是則加1
self.min_value += 1
if self.min_value <= self.max_value:
x = self.min_value
self.min_value += 2
return x
else:#拋出 StopIteration異常,結(jié)束代碼
raise StopIteration
min_value = int(input("輸入需要生成偶數(shù)序列范圍的最小值"))
max_value = int(input("輸入需要生成偶數(shù)序列范圍的最大值"))
num2 = EvenIterator(min_value,max_value) #創(chuàng)建迭代器對(duì)象
print([i for i in num2],end="")#輸出偶數(shù)數(shù)組
python用戶定義的迭代器
迭代器基于下面兩個(gè)方法
(1)__next__ 返回容器的下一個(gè)項(xiàng)目
(2)__iter__ 返回迭代器本身
當(dāng)序列遍歷完時(shí)
將拋出StopIteration異常,所以通過(guò)捕獲這個(gè)異常來(lái)停止循環(huán)
下面是自定義迭代器的示例代碼:
class MyIterator(object):
def __init__(self, step):
self.step = step
def __next__(self):
if self.step == 0:
raise StopIteration
self.step -= 1
return self.step
def __iter__(self):
return self
for i in MyIterator(6):
print(i)
運(yùn)行結(jié)果:
5
4
3
2
1
0
用戶定義的迭代器
如今,Python中所有的迭代壞境都會(huì)先嘗試_iter_二方法,再嘗試_getite_也就是說(shuō),它們寧愿使角第13章所學(xué)到的迭代協(xié)議,然后才是重復(fù)對(duì)對(duì)象進(jìn)行索弓l運(yùn)算。
如果對(duì)象不支持迭代協(xié)議,就會(huì)嘗試索引運(yùn)算。
從技術(shù)角度來(lái)講,迭代環(huán)境是通過(guò)調(diào)用內(nèi)置函數(shù)iter去嘗試尋找iter方法來(lái)實(shí)現(xiàn)的,而這種方法應(yīng)該返回一個(gè)迭代器對(duì)象。
如果已經(jīng)提供了,Python就會(huì)重復(fù)調(diào)用這個(gè)迭代器對(duì)象的next方法,直到發(fā)生stop工teration異常。
如果沒找到這類__iter__方法,Python會(huì)改用__getitem__機(jī)制,就像之前那樣通過(guò)偏移量重復(fù)索引,直到引發(fā) IndexError異常。
下面的文件iters.py定義了用戶定義的迭代器類來(lái)生成平方值。
class Squares:
def __init__(self, start, stop):
self.value = start - 1
self.stop = stop
def __iter__(self):
return self
def __next__(self):
if self.value == self.stop:
raise StopIteration
self.value += 1
return self.value **2
#Python小白學(xué)習(xí)交流群:711312441
for i in Squares(1, 5):
print(i)
運(yùn)行結(jié)果:
1
4
9
16
25
用生成器函數(shù)編寫
def gsquares(start, stop):
for i in range(start, stop+1):
yield i ** 2
for i in gsquares(1, 5):
print(i, end=" ")
運(yùn)行結(jié)果:
1 4 9 16 25
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python爬蟲實(shí)現(xiàn)selenium處理iframe作用域問(wèn)題
這篇文章主要介紹了Python爬蟲實(shí)現(xiàn)selenium處理iframe作用域問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01
Python產(chǎn)生Gnuplot繪圖數(shù)據(jù)的方法
今天小編就為大家分享一篇Python產(chǎn)生Gnuplot繪圖數(shù)據(jù)的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-11-11
Python如何批量處理經(jīng)緯度數(shù)據(jù)并生成位置信息
這篇文章主要介紹了Python如何批量處理經(jīng)緯度數(shù)據(jù)并生成位置信息問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-08-08

