• Python3 魔法方法:迭代器


    0、什么是迭代器

    迭代器不是容器,而是实现了__next__方法的对象(用于遍历容器中的数据)

    在python原生支持的数据结构中set(集合)是仅支持迭代器访问的,不支持下标(index)访问

    1、相关的BIF

    iter()

    将一个可迭代对象转换成一个迭代器

    next()

    访问迭代器中的下一个变量,如果迭代器没有变量了,则返回StopIteration异常

    2、魔法方法

    __iter__(self)

    返回迭代器本身

    __next__(self)

    决定迭代的方法

    3、例题:

    用while语句实现与下年for语句相同的功能

    for each in range(5):
        print(each)
    
    
    alist = range(5)
    it = iter(alist)
    #-----------------------------------
    while True:
        try:
            print(next(it))
        except StopIteration:
            break

    写一个迭代器输出至今位置所有闰年

    class LeapYear:
        def __init__(self):
            self.year_now=2018
        def __iter__(self):
            return self
        def __next__(self):
            self.year_now-=1
            if self.year_now % 4==0 and self.year_now%100!=0 or self.year_now%400==0:
                return self.year_now
            else:
                return self.__next__()
                
            
    
    
    
    
    leapYears = LeapYear()
    for i in leapYears:
        if i >=2000:
                print(i)
        else:
            break
    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

    写一个MyRev类功能与reserved()相同

    class MyRev:
        def __init__(self,seq):
            self.seq=seq
            self.index=0
        def __iter__(self):
            return self
        def __next__(self):
            self.index-=1
            try:
                return self.seq[self.index]
            except IndexError:
                raise StopIteration
    myRev = MyRev("ABCDE")
    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]
  • 相关阅读:
    POJ 1062 昂贵的聘礼(最短路)题解
    BZOj 墨墨的等式(转化为最短路)题解
    BZOJ 2763 飞行路线(分层图最短路)题解
    HDU 6342 Expression in Memories(模拟)多校题解
    codeforces 543B Destroying Roads
    codeforces 639B Bear and Forgotten Tree 3
    codeforces 645D Robot Rapping Results Report
    codeforces 702E Analysis of Pathes in Functional Graph
    codeforces 721C journey
    codeforces 711D Directed Roads
  • 原文地址:https://www.cnblogs.com/PythonFCG/p/8439395.html
Copyright © 2020-2023  润新知