内容来源于网络,本人只是在此稍作整理,如有涉及版权问题,归小甲鱼官方所有。
练习题(来自小甲鱼官方论坛)
0.请用你的话解释一下“迭代”的概念。
答:迭代是重复反馈过程的活动,其目的通常是为了接近并到达所需的目标或结果。每一次对过程的重复被称为一次迭代,而每一次迭代得到的结果会被用来作为下一次迭代的初始值。
1.迭代器是一个容器吗?
答:不是。因为我们耳熟能详的容器像列表、字典、元组都是可以存放数据的,而迭代器就是实现了__ next__()方法的对象(用于遍历容器中的数据)。
2.迭代器可以回退(获取上一个值)吗?
答:迭代器性质决定没有办法回退,只能往前进行迭代。但这并不是什么很大的缺点,因为我们几乎不需要再迭代途中进行回退操作。
3.如何快速判断一个容器是否具有迭代功能?
答:判断该容器是否拥有__ iter__()和__ next__()魔法方法。
5.在Python原生支持的数据结构中,你知道哪一个是只能用迭代器访问的吗?
答:对于原生支持随机访问的数据结构(如tuple、list),迭代器和经典for循环的索引访问相比并无优势,反而丢失了索引值(可以使用内建函数enumerate()找回这个索引值,这是后话)。但对于无法随机访问的数据结构(比如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.写一个迭代器,要求输出至今为止的所有闰年。如:
答:
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%400 == 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
ly = LeapYear()
for i in ly:
if i > 2000:
print(i)
else:
break
输出:
2016
2012
2008
2004
2.要求自己写一个MyRev类,功能与reversed()相同(内置函数reversed(seq),是返回一个迭代器,是序列seq的逆序显示)。例如:
>>> myRev = MyRev("FishC")
>>>for i in myRev:
print(i, end=' ')
答:代码如下
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 = self.index - 1
return self.data[self.index]
myRev = MyRev("FishC")
for i in myRev:
print(i, end=' ')
3.请写下这一节课你学习到的内容:格式不限,回忆并复述是加强记忆的好方式!
- 迭代器的魔法方法
__ iter__():返回迭代器本身;
__ next__():这里写迭代的规律。
举个例子:
class Fibs:
def __init__(self, n=20):
self.a = 0
self.b = 1
self.n = n
def __iter__(self):
return self
def __next__(self):
self.a, self.b = self.b, self.a + self.b
if self.a > self.n:
raise StopIteration
return self.a
fibs = Fibs(20)
for each in fibs:
print(each)
输出:
1
1
2
3
5
8
13