zoukankan      html  css  js  c++  java
  • 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]
  • 相关阅读:
    jQuery选择器
    安装ASP.NET4.0
    自动换行的布局
    一个封装不错的 TcpClient 类
    goland 中国 caisy qq Czx123456
    由于google被墙, 一些go语言包不能下载, 可以通过Chome浏览器到这个网址下载
    在Windows 操作系统中, MySql 如何设置, 允许表名支持大小写
    websocket 的客户端 websocket-sharp
    将一个C++的AES加密算法(有向量的)翻译成C#
    AES 加密问题
  • 原文地址:https://www.cnblogs.com/PythonFCG/p/8439395.html
Copyright © 2011-2022 走看看