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]

原文地址:https://www.cnblogs.com/PythonFCG/p/8439395.html

时间: 2024-10-07 14:56:48

Python3 魔法方法:迭代器的相关文章

Python3 魔法方法:算数运算

1.算数运算的魔法方法 在调用相应的运算符时会自动调用相应的魔法方法 比如a和b相加时(a+b)会自动调用a的__add__魔法方法进行加法操作 如果在a中找不到__add__方法python就会到b中寻找反运算的魔法方法__radd__ 2.如何在子类中调用父类的方法 使用super函数 class A: def a(self): print('正在调用A的方法') #AA=A class B(A): def b(self): print('正在调用B的方法') #super().a() su

Python3 魔法方法:属性访问

1.与属性访问有关的魔法方法 __getattr__(self,name) 定义当用户试图获取某一不存在的属性时的行为 __getattribute__(self,name) 定义当该类属性被访问时的行为 __setattr__(self,name,value) 定义一个属性被设置时的行为 __delattr__(self,name) 定义一个属性被删除时的行为 注意: def __setattr__(self, name, value): self.name = value + 1 #此代码试

Python3 魔法方法:定制序列

1.基于序列的三大容器 分别是 列表.元组.字符串 2.协议 python中的协议更像是一种指南,例如鸭子类型,一只鸟像鸭子一样走,像鸭子一样叫,像鸭子一样游然后这只鸟就可以叫做鸭子 3.容器类型的协议 如果希望定制的容器是不可变的,那么只需要定义__len__ 和__getitem__ 方法 如果希望定制的容器是可变的,那么还需要定义 __setitem__ 和__delitem__方法 4.魔法方法 _len__(self) 定义当被 len() 调用时的行为(返回容器中元素的个数) __g

Python基础教程(第九章 魔法方法、属性和迭代器)

本文内容全部出自<Python基础教程>第二版,在此分享自己的学习之路. ______欢迎转载:http://www.cnblogs.com/Marlowes/p/5437223.html______ Created on Marlowes 在Python中,有的名称会在前面和后面都加上两个下划线,这种写法很特别.前面几章中已经出现过一些这样的名称(如__future__),这种拼写表示名字有特殊含义,所以绝不要在自己的程序中使用这样的名字.在Python中,由这些名字组成的集合所包含的方法称

python魔法方法、构造函数、序列与映射、迭代器、生成器

在Python中,所有以__双下划线包起来的方法,都统称为"魔术方法".比如我们接触最多的__init__,魔法方法也就是具有特殊功能的方法. 构造函数 构造函数不同于普通方法,将在对象创建后自动调用它们.也就是在对象创建完成后,自动会调用__init__方法来初始化. 创建一个构造方法 构造方法传参 >>> class FooBar: def __init__(self,value=42): #默认参数 self.somevar = value >>&g

&lt;&lt;Python基础教程&gt;&gt;学习笔记 | 第09章 | 魔法方法、属性和迭代器

这一章,有点抽象,看着有点蛋疼! 双下划线__future__或单下划线有特殊含义,在Python中,这些名字的集合称为魔法方法:最重要的是__init__和一些处理访问对象的方法,这些方法允许你创建自己的序列或者是映射. ------ 准备工作: 将__metaclass__=type放在模块的最开始位置,以确保类时最新式的.考虑下面两个类 class NewStyle(object): more_code_here class OldStyle: more_code_here 如果文件以__

《Python基础教程(第二版)》学习笔记 -&gt; 第九章 魔法方法、属性和迭代器

准备工作 >>> class NewStyle(object): more_code_here >>> class OldStyle: more_code_here 在这两个类中,NewStyle是新式的类,OldStyle是旧式的类,如果文件以__metaclass__ = type 开始,那么两个类都是新式类. 构造方法 构造方法,当一个对象被创建后,会立即调用构造方法.Python中创建一个构造方法,只要把init方法的名字从简单的init修改成__init__

python基础教程_学习笔记11:魔法方法、属性和迭代器

魔法方法.属性和迭代器 在python中,有的名称会在前面和后面各加上两个下划线,这种写法很特别.它表示名字有特殊含义,所以绝不要在自己的程序中使用这种名字.在python中,由这些名字组成的集合所包含的方法叫做魔法(或称特殊)方法.如果对象实现了这些方法中的某一个,那么这个方法会在特殊的情况下被python调用,而几乎没有直接调用它们的必要. 准备工作 为了确保类是新型的,应该把赋值语句__metaclass__=type放在你的模块的最开始,或者(直接或间接)子类化内建类(实际上是类型)ob

课时48:魔法方法:迭代器

目录: 一.迭代器 二.课时48课后习题及答案 ************* 一.迭代器 ************* 迭代的意思类似于循环,每一次重复的过程被称为一次迭代的过程,而每一次迭代得到的结果会被用来作为下一次迭代的初始值.提供迭代方法的容器称为迭代器,通常接触的迭代器有序列(列表.元组.字符串)还有字典也是迭代器,都支持迭代的此操作. 举个例子,通常使用for语句来进行迭代: >>> for i in "FishC": print(i) F i s h C 字