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

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

时间:2024-07-03 15:58:25浏览次数:1  
标签:__ 迭代 对象 self 生成器 iter next &&

迭代器

定义:
1.当类中定义了 __iter____next__ 两个方法。
2. __iter__ 方法需要返回对象本身,即:self
3. __next__方法,返回下一个数据,如果没有数据了(不返回数据了),则需要抛出一个StopIteration的异常。

接下来,通过代码来认识它

class IT(object):
  def __init__(self):
      self.counter = 0

  def __iter__(self):
      return self

  def __next__(self):
      self.counter += 1
      if self.counter == 3:
          raise StopIteration()
      return self.counter

# 根据类实例化创建一个迭代器对象:
obj1 = IT()
v1 = next(obj1)         # 相当于 v1 = obj1.__next__()     
print(v1)

v2 = next(obj1)
print(v2)

v3 = next(obj1)
print(v3)

obj2 = IT()   # 又创建了一个迭代器对象
for item in obj2:  # 首先会执行迭代器对象的__iter__方法并获取返回值,一直去反复的执行 next(对象) 
     print(item)

注意:
1.迭代器对象支持通过next取值,如果取值结束则自动抛出StopIteration。
2.for循环内部在循环时,先执行__iter__方法,获取(返回)一个迭代器对象,然后不断执行的next取值(有异常StopIteration则终止循环)。

生成器

生成器是特殊类型的迭代器,因为它符合迭代器的定义

上代码示例

# 创建生成器函数
def func():
    yield 1
    yield 2

# 创建生成器对象(内部是根据生成器类generator创建的对象),生成器类的内部也声明了:__iter__、__next__ 方法。
obj1 = func()
for item in obj2:
    print(item)

想说的是:如果按照迭代器的规定来看,其实生成器类也是一种特殊的迭代器类(生成器也是一个中特殊的迭代器)。

可迭代对象

定义:如果一个类中有__iter__方法且返回一个迭代器对象 ;则我们称以这个类创建的对象为可迭代对象。

# IT类符合迭代器的规则,所以IT类是迭代器类,创建的对象就是迭代器对象
class IT(object):
    def __init__(self):
        self.counter = 0

    def __iter__(self):
        return self

    def __next__(self):
        self.counter += 1
        if self.counter == 3:
            raise StopIteration()
        return self.counter

# Foo类里面有__iter__方法,返回迭代器对象,所以这个类创建的对象是 可迭代器对象    
class Foo(object):
    def __iter__(self):
        return IT()
obj = Foo()    # 可迭代对象
for item in obj: # 循环可迭代对象时,内部先执行obj.__iter__并获取迭代器对象;不断地执行迭代器对象的next方法。
    print(item)

常见的数据类型:列表,字典,元组,集合都是可迭代对象

from collections.abc import Iterator, Iterable

# Iterator -> 迭代器
# Iterable -> 可迭代对象

v1 = [11, 22, 33]    # 列表 —> 可迭代对象
print( isinstance(v1, Iterator) )  # false,判断是否是迭代器;判断依据是__iter__ 和 __next__。
print( isinstance(v1, Iterable) )  # True, 判断是否是可迭代对象,判断依据是是否有 __iter__且返回迭代器对象。

v2 = v1.__iter__()   # 返回迭代器对象
print( isinstance(v1, Iterator) )  # True
print( isinstance(v2, Iterable) )  # false

如何查看是可迭代对象还是迭代器

  • __iter____next__就是迭代器或者生成器
  • 只有__iter__就是可迭代对象
  • 通过dir(生成的变量) 可以查看到类中所有的成员
    eg:
       v1 = [11, 22, 33]
       print(dir(v1))  # ['__iter__',..........]
    

以上就是对迭代器,生成器和可迭代对象的认识!

标签:__,迭代,对象,self,生成器,iter,next,&&
From: https://www.cnblogs.com/pythonav/p/18281892

相关文章

  • 设计模式-迭代子模式
    一、迭代子模式的核心思想迭代子模式又称Cursor模式,是对象的行为模式。迭代子模式可以顺序地访问聚集中的对象而不必显露聚集的内部表象。迭代子模式的作用是访问一个聚集,因此它需要包含两类对象。聚集对象:聚集对象中提供了一系列的数据集合,它还需要提供访问该集合中元......
  • 迭代器协议、可迭代对象(迭代器)、三元表达式、生成器
    今天说的这老几位可是老牛逼了,认真看,咱们挨个介绍哈。1、迭代器协议(1)有一个next()方法(2)只能往后走不能往前退2、可迭代对象可迭代对象又叫做迭代器,什么是可迭代对象呢?很简单,满足迭代器协议的对象就是可迭代对象。说白了,就是满足前面那两条:有一个next()方法,只能往后走不能往......
  • JavaScript 编程语言【 数据类型】过滤|排序|映射|迭代
    文章目录将border-left-width转换成borderLeftWidth过滤范围原位(inplace)过滤范围降序排列复制和排序数组创建一个可扩展的calculator映射到names映射到对象按年龄对用户排序随机排列数组获取平均年龄数组去重从数组创建键(值)对象Iterableobject(可迭代对象)Symbol.......
  • 中台框架模块开发实践-用 Admin.Core 代码生成器生成通用代码生成器的模块代码
    前言之前分享中台Admin.Core的模块代码生成器,陆续也结合群友们的反馈,完善了一些功能和模板上的优化,而本篇将基于此代码生成器生成一个通用代码生成器模块的基本代码后续再在此代码的基础上进行完善,制作一个通用的代码生成器要做一个项目,首先我们要弄清楚需求,这里简单规划了......
  • 基于java web模拟数据生成器的设计与实现
    选题的背景: 随着网络和计算机技术的飞速发展,软件开发,软件测试等IT行业在蓬勃发展,而往往开发这些软件等需要涉及到特别庞大的工作量,为了方便开发与测试人员进行系统的功能等测试,因此,我们的数据生成器系统由此诞生。软件开发与测试从之前的由程序员一个代码一个代码的敲,一个一......
  • 中台框架模块开发实践-代码生成器的添加及使用
    前言之前已经分享过几篇关于中台项目框架的文章,相关介绍就不再赘述所谓工欲善其事必先利其器,一个项目拥有一个代码生成器是很有必要的,能够大大的节省时间,减少手误,提供开发效率(ps:特别小团队搞微服务但是没有代码生成器,简直要了老命)本文将分享如何在中台框架项目Admin.Core......
  • 代码随想录63——二叉树4——迭代遍历
    ......
  • PCL 拟合二维椭圆(迭代法)
    文章目录一、简介二、实现代码三、实现效果参考资料一、简介一般情况,我们会用椭圆拟合二维点,用椭球拟合三维点。在n维中,这些对象被称为超椭球体,由二次方程隐式定义超椭球的中心是n×1向量C,n×n矩阵S是正定的,n×1向量X是超椭球上的任意点。矩阵S可以用特......
  • 微信对话生成器2.0版本
    微信对话生成器2.0版,这是一款革命性的通讯辅助工具,在数字通信领域带来了新的创新浪潮。这一升级版的生成器不仅囊括了从基本的文字编辑、格式调整到语音转换的多种功能,更重要的是,它提供了模拟真实对话的能力,使得用户可以更有效地规划和预演即将展开的聊天。此工具的核心在......
  • vector中下标[]操作、迭代器与size()在使用中遇到的问题
    综述:1.今天学习vector的过程中遇到的一些问题记录下来,方便日后复习以及有相同疑惑的同学参考。2.主要关于下标与迭代器写入与读取元素。遇到的问题:代码如下:#include<iostream>#include<vector>usingnamespacestd;intmain(){ unsignedinti; vector<int>v1;......