python第48课练习—魔法方法:迭代器
2019-07-06 本文已影响0人
YoYoYoo
0、请用自己的话解释一下“迭代”的概念?
答:“迭代”是重复反馈过程的活动,其目的通常是为了接近并达到所需的目标或结果。每一次对过程的重复被称为一次“迭代”,而每一次迭代得到的结果会被用来作为下一次迭代的初始值。
1、迭代器是一个容器吗?
答:不是。因为我们耳熟能详的容器像列表、字典、元组都是可以存放数据的,而迭代器就是实现了__next__()方法的对象(用于遍历容器中的数据)。
2、迭代器可以回退(获取上一个值)吗?
答:迭代器的性质决定没有办法回退,只能往前进行迭代。但这并不是什么很大的缺点,因为我们几乎不需要在迭代中进行回退操作。
3、如何快速判断一个容器是否具有迭代功能?
答:判断该容器是否拥有 __next__() 和 __iter__() 魔法方法。
4、for 语句如何判断迭代器里边已经取空了?
答:迭代器通过 __next__() 方法每次返回一个元素,并指向下一个元素。如果当前位置已无元素,通过抛出 StopIteration 异常表示。
5、在 Python 原生支持的数据结构中,你知道哪一个是只能用迭代器访问的吗?
答:set。对于原生支持随机访问的数据结构(如tuple、list),可以使用迭代器或者下标索引的形式访问,但对于无法随机访问的数据结构 set 而言,迭代器是唯一的访问元素的方式。
练习
0、用 while 语句实现与一下 for 语句相同的功能:
for each in range(5):
print(each)
代码清单:
alist = range(5)
it = iter(alist)
while True:
try:
print(next(it))
except StopIteration:
break
1、写一个迭代器,要求输出至今为止的所有闰年。如:
>>> leapYears = LeapYear()
>>> for i in leapYears:
if i >= 2000:
print(i)
else:
break
2016
2012
2008
2004
2000
提示:闰年判断法((year % 4 == 0 and year % 100 != 0)or (year % 400 == 0))
代码清单:
import datetime as dt
class LeapYear:
def __init__(self):
self.now = dt.date.today().year
def isLeapYear(self,year):
if (year % 4 == 0 and year % 100 != 0) or (year % 100 == 0 ):
return True
else:
return False
def __iter__(self):
return self
def __next__(self):
while not self.isLeapYear(self.now):
self.now -= 1
temp = self.now
self.now -= 1
return temp
2、要求自己写一个 MyRev 类,功能与 reversed() 相同(内置函数 reversed(seq) )是返回一个迭代器,是序列 seq 的逆序显示)。例如:
>>> myRev = MyRev("FishC")
>>> for i in myRev:
print(i,end='')
ChsiF
代码清单:
class MyRev:
def __init__(self,data):
self.data = data
self.index = len(data)
def __iter__(self):
return self
def __next__(self):
if self.index == 0:
raise StopIteration
self.index -= 1
return self.data[self.index]