第四十八课:魔法方法:迭代器

内容来源于网络,本人只是在此稍作整理,如有涉及版权问题,归小甲鱼官方所有。

练习题(来自小甲鱼官方论坛)

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

你可能感兴趣的:(第四十八课:魔法方法:迭代器)