首页 > 其他分享 >可迭代对象、迭代器、生成器

可迭代对象、迭代器、生成器

时间:2022-08-18 23:01:46浏览次数:50  
标签:__ 迭代 对象 list self 生成器 iter print

from collections import Iterator, Iterable


class MyListIterator(object):  # 定义迭代器类,其是MyList可迭代对象的迭代器类

    def __init__(self, data):
        self.data = data  # 上边界
        self.now = 0  # 当前迭代值,初始为0

    def __iter__(self):
        return self  # 返回该对象的迭代器类的实例;因为自己就是迭代器,所以返回self

    def __next__(self):  # 迭代器类必须实现的方法
        while self.now < self.data:
            self.now += 1
            return self.now - 1  # 返回当前迭代值  
        raise StopIteration  # 超出上边界,抛出异常


my_list = MyListIterator(5)  # 得到一个可迭代对象
print(type(my_list))  # 返回该对象的类型 <class '__main__.MyListIterator'>
my_list_iter = iter(my_list)  # 得到该对象的迭代器实例,iter函数在下面会详细解释 <class '__main__.MyListIterator'>
print(type(my_list_iter))  # <class '__main__.MyListIterator'>
for i in my_list:  # 一次调用__next__方法
    print(i) # 0,1,2,34
print(isinstance(my_list, Iterator))  # True
print(isinstance(my_list, Iterable))  # True
print(isinstance([], Iterable))  # True
print(isinstance([], Iterator))  # True
gene = (i for i in range(10))  # 创建一个生成器
print(gene, type(gene))  # <generator object <genexpr> at 0x0000024609D9B5C8> <class 'generator'>
print(isinstance(gene, Iterable))  # True
print(isinstance(gene, Iterator))  # True

总结:

  1. 如果一个对象拥有__iter__方法,其是可迭代对象
  2. 定义可迭代对象,必须实现__iter__方法;定义迭代器,必须实现__iter__和next方法
  3. 生成器是一种特殊的迭代器,生成器自动实现了“迭代器协议”(即__iter__和next方法),不需要再手动实现两方法(表现形式为函数里面使用了yield关键字)

标签:__,迭代,对象,list,self,生成器,iter,print
From: https://www.cnblogs.com/kxtomato/p/16600446.html

相关文章

  • Python-面向对象
    面向对象面向对象是一种编程思想,即按照真实世界的思维方式构建软件系统.定义类class类名[(父类)]:类体创建对象用类创建对象的过程称为实例化,是将类这个抽......
  • python获取对象属性的几种方法
    当我们拿到一个对象的引用时,如何知道这个对象是什么类型、有哪些方法呢?1.使用type()首先,我们来判断对象类型,使用type()函数:基本类型都可以用type()判断:>>>type(123)<......
  • JavaSE:第四章:面向对象上
    史上最全的知识体系脑图,覆盖所有知识点,所有细节,注意事项。面向对象上:包含面向对象与面向过程,类和对象,属性,方法,封装和隐藏,构造器(构造方法),this的使用,值传递,package、impor......
  • pytest系列——pytest_addoption钩子函数添加自定义参数到pytest配置对象中+request.c
    钩子函数之pytest_addoption介绍:①pytest_addoption钩子函数可以让用户注册一个自定义的命令行参数,以便于用户在测试开始前将数据从外部(如:控制台)传递给程序;【程序根据......
  • ASP.NET Core :容器注入(二):生命周期作用域与对象释放
    //瞬时生命周期ServiceCollectionservices=newServiceCollection();services.AddTransient<TestServiceImpl>();using(ServiceProvidersp=services.BuildServic......
  • hbase使用juicefs对象存储测试环境快速部署
    相关技术链接:juicefs官方部署参考文档移动云使用JuiceFS支持ApacheHBase增效降本的探索如何让HBase更快、更稳、更省钱0前言什么是juicefs详情请看官网介......
  • vue3将对象转为响应式/ref/reactive/toRefs
    一、ref的作用就是将一个原始数据类型(primitivedatatype)转换成一个带有响应式特性的数据类型,原始数据类型共有7个,分别是:String/Number/BigInt/Boolean/Symbol/Null/Unde......
  • 23、面向对象编程
    23、面向对象编程 目录:对象的概念类与对象面向对象编程类的定义与实例化属性访问类属性与对象属性属性查找顺序与绑定方法小结视频链接 ......
  • 迭代器Iterator的使用方法(Java)
    迭代器是一种经典的设计模式。用于在不需要暴漏数据是如何保存在数据结构中的细节的情况下,遍历一个数据结构。Collection接口继承自Iterable接口。所以说,实现了Collectio......
  • 14、函数对象和闭包
    14、函数对象和闭包  目录:一函数对象1.1函数可以被引用1.2函数可以作为容器类型的元素1.3函数可以作为参数传入另外一个函数1.4函数的返回值......