[Python]小甲鱼Python视频第048课(魔法方法:迭代器) )课后题及参考解答

# -*- coding: utf-8 -*-
"""
Created on Sun Mar 24 20:24:02 2019

@author: fengs
"""

"""

0. 请用你的话解释一下“迭代”的概念?
    重复相同的操作,将上一次操作的输出时的状态当次本次操作的输入状态

1. 迭代器是一个容器吗?
    不是,迭代是一个计算得出后续状态的过程(__next__()),容器是已经存在,去取就行。

2. 迭代器可以回退(获取上一个值)吗?
    不能
    
3. 如何快速判断一个容器是否具有迭代功能?
    isinstance(a,itera)
    
    是否有 __iter__()和 __next__() 魔法方法
    
4. for 语句如何判断迭代器里边已经取空了?
    接管了迭代已经停止的异常,遇到迭代停止异常就认为是取空

5. 在 Python 原生支持的数据结构中,你知道哪一个是只能用迭代器访问的吗.
    无序的集合
"""


"""
0. 用 while 语句实现与以下 for 语句相同的功能:
for each in range(5):
    print(each)
    
    
"""
iter_range = iter(range(5))
while True:
    try:
        each = next(iter_range);
        print(each)
    except StopIteration:
        break


"""
1. 写一个迭代器,要求输出至今为止的所有闰年。如
>>> leapYears = LeapYear()
>>> for i in leapYears:
        if i >=2000:
                print(i)
        else:
                break

2016W
2012
2008
2004
2000
"""
import time
class LeapYear():
    def __init__(self):
        self.year = time.localtime().tm_year
        #print(self.year)
        
    def isLeap(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 True:
            if self.isLeap(self.year) == False:
                self.year -= 1
            else:
                break
        tmp = self.year;
        self.year -= 1
        return tmp;
        
print('---------------------------------')
leapYears = LeapYear()
for i in leapYears:
    if i >=2000:
        print(i)
    else:
        break
print('---------------------------------')


"""
2. 要求自己写一个 MyRev 类,功能与 reversed() 相同(内置函数 reversed(seq) 是返回一个迭代器,是序列 seq 的逆序显示)。例如:
>>> myRev = MyRev("FishC")
>>> for i in myRev:
    print(i, end='')

ChsiF
"""


class MyRev():
    def __init__(self,value):
        self.value = value;
        self.idx = len(self.value)
        
    def __iter__(self):
        return self
    
    def __next__(self):
        self.idx -= 1
        if self.idx >= 0:
            return self.value[self.idx]
        else:
            raise StopIteration
            
        
myRev = MyRev("FishC")
print('------------------')
for i in myRev:
    print(i, end='')  
print('\n------------------')    

  

posted @ 2019-03-24 21:55  Alimy  阅读(442)  评论(0编辑  收藏  举报