首页 > 编程语言 >Python | 魔法函数`__iter__`的用法

Python | 魔法函数`__iter__`的用法

时间:2023-06-27 20:14:17浏览次数:36  
标签:__ MyList 迭代 Python self iter print

下面是找到的一个比较好的科学解释:

Python中可迭代对象(Iterable)并不是指某种具体的数据类型,它是指存储了元素的一个容器对象,且容器中的元素可以通过__iter__( )方法或__getitem__( )方法访问。

  1. __iter__方法的作用是让对象可以用for … in obj循环遍历,__getitem__( )方法是让对象可以通过实例名[index]的方式访问实例中的元素。这两个方法的目的是Python实现一个通用的外部可以访问可迭代对象内部数据的接口。

  2. 一个可迭代对象是不能独立进行迭代的,Python中,迭代是通过for … in obj来完成的。凡是可迭代对象都可以直接用for… in obj循环访问,这个语句其实做了两件事:第一件事是调用__iter__()获得一个可迭代器,第二件事是循环调用__next__()

  3. 常见的可迭代对象包括:
    a) 集合数据类型,如list、tuple、dict、set、str等;
    b) 生成器(generator),包括生成器和带yield的生成器函数(generator function)

  4. 如何判断一个对象是可迭代对象呢?具体判断方法如下两种:

    • 利用numpyiterable方法

      from numpy import iterable
      print(iterable(实例名))
      
    • 利用collections模块的Iterable

      from collections import Iterable
      isinstance(实例名, Iterable)
      

一个典型的实例

  • 随便定义一个对象,不定义__iter__方法:

    from numpy import iterable
    
    class MyList:
        def __init__(self, len: int):
            self.list = [i for i in range(len)]
            self.length = len
    
        def __repr__(self) -> str:
            return f"MyList({self.length}):{self.list}"
    
    
    x = MyList(10)
    for i in x:
        print(i)
    

    运行结果:

    显示MyList实例是不可迭代的

    • 定义__iter__方法后
      • 下面的例子简单实现一个range(n)
    from numpy import iterable
    
    class MyList:
        def __init__(self, len: int):
            self.cursor = -1
            self.length = len
    
        def __iter__(self):
            return self
    
        def __next__(self):
            if self.cursor+1 < self.length:
                self.cursor += 1
                return self.cursor
            else:
                exit(1)
    
        def __repr__(self) -> str:
            return f"MyList({self.length})"
    
    
    x = MyList(10)
    print(iterable(x))
    for i in x:
        print(i)
    

    输出为:

    True
    0
    1
    2
    3
    4
    5
    6
    7
    8
    9
    

    使用next()一步一步迭代可以看的更清楚:

    from numpy import iterable
    
    
    class MyList:
        def __init__(self, len: int):
            self.cursor = -1
            self.length = len
    
        def __iter__(self):
            return self
    
        def __next__(self):
            if self.cursor+1 < self.length:
                self.cursor += 1
                return self.cursor
            else:
                exit(1)
    
        def __repr__(self) -> str:
            return f"MyList({self.length})"
    
    
    x = MyList(10)
    print(iter(x))
    print(next(x))
    print(next(x))
    print(next(x))
    print(next(x))
    for i in x:
        print(i)
    

    输出结果为:

    MyList(10)
    0
    1
    2
    3
    4
    5
    6
    7
    8
    9
    

标签:__,MyList,迭代,Python,self,iter,print
From: https://www.cnblogs.com/zhangxuegold/p/17509807.html

相关文章

  • 【考后总结】6 月西安多校国赛模拟赛 4
    6.21冲刺国赛模拟22T1跳跃不妨看作两只青蛙从相同起点出发且跳跃次数相同,设\(f_{i,j,k}\)为两只青蛙分别在\(i,j\)位置,且相差步数\(k\)。由于需要记录相邻位置对答案贡献,我们在要求必须严格按照升序对处理状态,也就是必须保证当前跳跃的一只青蛙落点在另一只青蛙更前面,且......
  • Asp.net core使用Razor试图引擎编写TagHelper
    之前使用wtm来进行快速开发wtm框架见:https://wtmdoc.walkingtec.cn/其前端选择Layui的情况下有大量的TagHelper,大幅度提高了开发效率 虽然已有的组件很丰富但也不能完全覆盖所有的需求,这个时候就需要自己写TagHelper。参考了WTM源码,和微软官方文档TagHelper虽然使用起来方......
  • 【考后总结】6 月西安多校国赛模拟赛 5
    6.24冲刺国赛模拟24T2简单图论题原题:Gym-104053CCustomsControls2构造题。这个限制可以进一步加强到对于每个节点\(u\),\(1\tou\)的路径权值都相等,定义为\(d_u\)。于是对\(u\)连边的两个节点的\(d\)一定相等,进而可以把所有相等的缩到一起,且这些点直接不能连边(点......
  • 「路飞项目09」redis
    1Redis介绍和安装#Redis:软件,存储数据的,速度非常快,redis是一个key-value存储系统(没有表的概念),cs架构的软件-服务端客户端(python作为客户端,java,go,图形化界面,命令窗口的命令)#es:存数据的地方#关系型数据库和非关系型数据库-关系型:mysql,PostgreSQL【PG】,oracle,sqlserver,db......
  • 协程
    可以暂停和恢复的函数             await_resume返回的值就是co_wait的值 ......
  • 无感刷新token
    无感刷新token//首先需要在响应拦截里面加一个code反馈码的判断是401就调用刷新token的方法//响应拦截api.interceptors.response.use((response:any)=>{if(response.data.code==200){done();returnresponse;}elseif(response.dat......
  • Python | 魔法函数`__contains__`的用法
    在python的字符串、列表、元组、结合等对象的时候,经常使用in的方法,一个类的对象能够使用in,就是因为这个类实现了__contains__魔法函数如下面的代码,演示了类的对象使用in的情形classStudent():def__init__(self,name):self.name=namedef__contains__(self......
  • 近期的一些了解到的
    发现一个很好用的个人知识库几乎就是之前我想未来自己做的,却发现一个完善的现成的软件Obsidian-Sharpenyourthinking--------------------------------------------------------想搞个程序框架,然后后面功能慢慢添加,问AI,AI说需要动态链接库,然后检索时看到静态库,然后才看到......
  • fluent中材料黏度为动力学格式如何输入
    黏度表达式为:$$\mu=0.1852exp(1850.1/T)$$首要办法是使用函数进行输入,比较准确。不过要提供的是另外一种方式:打开“material”在“Viscosity”选项卡中,选择“Polynomial”选项。在“PolynomialCoefficients”文本框中,输入以下5个系数:1.852e-401850.100这将使用......
  • 【杂题乱写】6 月多校字符串专题训练
    ACodeForces-547EMikeandFriends*2800肯定要建广义SAM。在每个\(cur\)打一个标记,没有区间限制就在对应节点上查一下后缀树子树标记总数,有区间限制线段树合并维护标记。点击查看代码intn,q;chars[maxn];intmark[maxn];structSegmentTree{#definemid((l+r)>......