第048讲: 魔法方法:迭代器 | 学习记录(小甲鱼零基础入门学习Python)
(标答出处: 鱼C论坛)
《零基础入门学习Python》
本节知识点:
iterator 是迭代器。
迭代器有两种方法:
(1)iter(可迭代的对象):返回一个迭代器
(2)next(迭代器): 返回迭代器的下一个元素,若果迭代器为空,将引发StopIteration
例子:
>>> string = "zss041962"
>>> iter(string)
<str_iterator object at 0x0000000002F53B38>
>>> iter(range(10))
<range_iterator object at 0x0000000002F2EFD0>
>>> it = iter(range(10))
>>> next(it)
0
>>> next(it)
1
斐波那契数列:
class Fibs :
def __init__(self,n=10) :
self.a = 0
self.b = 1
self.n = 10
def __iter__(self) :
return self
def __next__ (self) :
self.a , self.b = self.b , self.a + self.b
if self.a <= self.n :
return self.a
else :
raise StopIteration
fibs = Fibs()
for i in fibs :
print (i)
运行结果:
测试题(不上机):
答:迭代是重复反馈过程的活动,其目的是为了接近并到达所需的目标或结果。每一次对过程的重复被称为一次迭代,而每一次迭代得到的结果会被用来当做下一次迭代的初始值。
答:不是。因为我们熟知的容器,如:列表,字典等。他们都是可以存数据的,而迭代器只是实现了 __ next __方法的对象,用于容器中内容的遍历。
答:不可以,迭代器不可以回退
答:观察这个容器是否有 __ iter __ 和 __ next __方法。
答:看是否抛出StopIteration异常
答:set,对于原生支持随机访问的数据结构(如:tuple,list),可以使用迭代器或者下表索引的形式访问,但对于无法随机访问的数据结构set而言,迭代器是唯一的访问元素的方式。
动动手:
l1 = range (5)
t = iter(l1)
while True :
try :
print (next(t))
except StopIteration :
break
运行结果:
import datetime as d
class LeapYear :
def __init__ (self) :
self.now = d.date.today().year
def isleapyear (self,year):
if (year % 4 == 0 and year %100 != 0) or (year % 400 == 0) :
return True
else :
return False
def __iter__ (self) :
return self
def __next__(self) :
while not LeapYear.isleapyear(self,self.now) :
self.now -= 1
#使用临时变量来接收闰年的年份
temp = self.now
self.now -= 1
return temp
leapyear = LeapYear()
for i in leapyear :
if i >= 2000 :
print (i)
else :
break
运行结果:
class MyRev :
def __init__ (self , seq) :
self.seq = seq
self.index = len(self.seq)
def __iter__(self) :
return self
def __next__(self) :
if self.index == 0 :
raise StopIteration
else :
self.index = self.index - 1
return self.seq[self.index]
myrev = MyRev('I love XMY')
for i in myrev :
print (i,end='')
运行结果: