首页 > 其他分享 >迭代器和生成器

迭代器和生成器

时间:2024-07-05 14:57:24浏览次数:12  
标签:函数 迭代 self 生成器 next print

1、迭代器

定义:访问集合元素的一种方式。迭代器是一个可以记住遍历位置的对象。迭代器对象从第一个元素开始访问,直到所有元素被访问。

运用的场景:

迭代器是一个对象,它能够在遍历数据集合时按需生成值,而不是一次性将所有值存储在内存中。这使得迭代器特别适合处理大数据集合或者是需要延迟计算的情况。

实际中的应用包括:

  1. 处理大数据集合: 当数据集合很大时,通过迭代器可以逐个处理数据,而不必一次性加载整个数据集到内存中,节省内存空间。

  2. 流式处理数据: 在需要连续处理数据流的情况下,迭代器允许逐个获取数据项,例如从文件或网络流中读取数据。

  3. 惰性计算: 当需要进行惰性计算(lazy evaluation)时,迭代器可以根据需要逐步生成结果,而不需要一次性生成所有可能的结果。

  4. 无限序列: 可以使用迭代器来表示和处理无限序列,例如斐波那契数列等。

迭代器有两个基本的方法:iter()和next()

(1)使用iter()或者next() 函数可以将可迭代对象(如列表、字典、字符串等)转换为迭代器

>>> list=[1,2,3,4]
>>> it = iter(list)    # 创建迭代器对象
>>> print (next(it))   # 输出迭代器的下一个元素
1
>>> print (next(it))
2
>>>

#!/usr/bin/python3
 
import sys         # 引入 sys 模块
 
list=[1,2,3,4]
it = iter(list)    # 创建迭代器对象
 
while True:
    try:
        print (next(it))
    except StopIteration:
        sys.exit()

也可以使用常规for语句进行遍历:

#!/usr/bin/python3
 
list=[1,2,3,4]
it = iter(list)    # 创建迭代器对象
for x in it:
    print (x, end=" ")

(2)面向对象时

把一个类作为一个迭代器使用需要在类中实现两个方法 iter() 与 next() 。

class MyNumbers:
  def __iter__(self):
    self.a = 1
    return self
 
  def __next__(self):
    x = self.a
    self.a += 1
    return x
 
myclass = MyNumbers()
myiter = iter(myclass)
 
print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))
print(next(myiter))

定义:StopIteration 异常用于标识迭代的完成,防止出现无限循环的情况,在 next() 方法中我们可以设置在完成指定循环次数后触发 StopIteration 异常来结束迭代。

class MyNumbers:
  def __iter__(self):
    self.a = 1
    return self
 
  def __next__(self):
    if self.a <= 20:
      x = self.a
      self.a += 1
      return x
    else:
      raise StopIteration
 
myclass = MyNumbers()
myiter = iter(myclass)
 
for x in myiter:
  print(x)

2、生成器

定义:

在 Python 中,使用了 yield 的函数被称为生成器(generator)。

yield 是一个关键字,用于定义生成器函数,生成器函数是一种特殊的函数,可以在迭代过程中逐步产生值,而不是一次性返回所有结果。

跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。

当在生成器函数中使用 yield 语句时,函数的执行将会暂停,并将 yield 后面的表达式作为当前迭代的值返回。

然后,每次调用生成器的 next() 方法或使用 for 循环进行迭代时,函数会从上次暂停的地方继续执行,直到再次遇到 yield 语句。这样,生成器函数可以逐步产生值,而不需要一次性计算并返回所有结果。

调用一个生成器函数,返回的是一个迭代器对象。

def countdown(n):
    while n > 0:
        yield n
        n -= 1
 
# 创建生成器对象
generator = countdown(5)
 
# 通过迭代生成器获取值
print(next(generator))  # 输出: 5
print(next(generator))  # 输出: 4
print(next(generator))  # 输出: 3
 
# 使用 for 循环迭代生成器
for value in generator:
    print(value)  # 输出: 2 1

以上实例中,countdown 函数是一个生成器函数。它使用 yield 语句逐步产生从 n 到 1 的倒数数字。在每次调用 yield 语句时,函数会返回当前的倒数值,并在下一次调用时从上次暂停的地方继续执行。

通过创建生成器对象并使用 next() 函数或 for 循环迭代生成器,我们可以逐步获取生成器函数产生的值。在这个例子中,我们首先使用 next() 函数获取前三个倒数值,然后通过 for 循环获取剩下的两个倒数值。

生成器函数的优势是它们可以按需生成值,避免一次性生成大量数据并占用大量内存。此外,生成器还可以与其他迭代工具(如for循环)无缝配合使用,提供简洁和高效的迭代方式。

运用的场景:

生成器是一种特殊的迭代器,它可以通过函数来创建。生成器函数使用yield 关键字来返回值,而不是 return,这使得它可以暂停并在需要时继续执行,从而节省内存并提高效率。

实际中的应用包括:

  1. 迭代大数据集合: 生成器函数可以用于生成大数据集合的元素,而不需要一次性将所有数据存储在内存中。

  2. 异步编程: 在异步编程中,生成器可以与协程一起使用,提供一种轻量级的并发编程模型。

  3. 无限序列生成: 可以轻松地创建表示无限序列的生成器,如素数生成器、递增序列等。

  4. 延迟计算: 生成器允许按需生成结果,支持惰性计算,适合处理大数据流或者需要逐步处理的情况。

示例场景
  • 文件处理: 使用生成器可以逐行读取大文件,而不会将整个文件加载到内存中。

  • 数据处理管道: 可以通过生成器函数将数据处理步骤串联起来,每个生成器负责一个步骤,实现高效的数据处理流水线。

  • 并发编程: 使用生成器和协程可以实现高效的并发模型,例如异步任务处理或者事件驱动的编程。

迭代器和生成器提供了处理大数据和惰性计算的有效工具,可以显著提高程序的性能和效率,特别是在需要处理大数据集或者需要高效处理数据流的情况下。

标签:函数,迭代,self,生成器,next,print
From: https://blog.csdn.net/weixin_60256922/article/details/140197832

相关文章

  • C++设计模式---迭代器模式
    1、介绍        迭代器模式是⼀种行为型设计模式,是⼀种使⽤频率⾮常⾼的设计模式,在各个语⾔中都有应用,其主要⽬的是提供⼀种统⼀的⽅式来访问⼀个聚合对象中的各个元素,而不需要暴露该对象的内部表示。通过迭代器,客户端可以顺序访问聚合对象的元素,而无需了解底层数据结......
  • TPAMI 2024 | MixFormer: 基于迭代混合注意力的端到端跟踪
    题目:MixFormer:End-to-EndTrackingWithIterativeMixedAttentionMixFormer:基于迭代混合注意力的端到端跟踪作者:Y.Cui;C.Jiang;G.Wu;L.Wang摘要视觉目标跟踪通常采用多阶段流水线,包括特征提取、目标信息集成和边界框估计。为了简化这一流程并统一特征提......
  • java高仿真数据生成器-需要的拿去
    java高仿真数据生成器源码-需要的拿去nit-random-tools介绍:高仿真数据生成器逆天开源java证号码,姓名,职业,日期,手机号生成器功能列表编号功能描述class1号生成器NitIdcardGenerator2姓名生成器NitChineseNameGenerator3职业生成器NitJobGenerator4日期生成器N......
  • 迭代器&&生成器&&可迭代对象
    迭代器定义:1.当类中定义了__iter__和__next__两个方法。2.__iter__方法需要返回对象本身,即:self3.__next__方法,返回下一个数据,如果没有数据了(不返回数据了),则需要抛出一个StopIteration的异常。接下来,通过代码来认识它classIT(object):def__init__(self):......
  • 设计模式-迭代子模式
    一、迭代子模式的核心思想迭代子模式又称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......