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

迭代器与生成器

时间:2023-12-22 12:22:24浏览次数:28  
标签:__ 函数 迭代 生成器 next 序列

目录

一、迭代器与生成器的概念

​ 迭代器(Iterator)和生成器(Generator)在 Python 中都用于处理序列数据,但它们有一些重要的区别。以下是迭代器和生成器的主要区别:

迭代器(Iterator)

(1)定义方式:迭代器是一个实现了 `__iter__()` 和 `__next__()` 方法的对象。`__iter__()` 方法返回迭代器对象自身,而 `__next__()` 方法用于返回序列中的下一个元素。
(2)状态:迭代器维护了一个内部状态,用于记录序列中当前位置的元素。每次调用 `__next__()` 方法时,迭代器会返回下一个元素,并更新其内部状态。
(3)使用方式:可以通过内置函数 `iter()` 创建迭代器对象,然后使用 `next()` 函数逐个获取序列中的元素。

生成器(Generator)

(1)定义方式:生成器是通过函数中包含 `yield` 关键字定义的。当调用生成器函数时,它返回一个迭代器对象,每次执行 `yield` 语句时都会暂停函数的执行并返回一个值。
(2)状态:生成器函数执行时会保留局部变量的状态,使得在每次调用 `next()` 方法时都能够从上次的执行点继续执行。
(3)单向:生成器是单向的,只能按照定义的顺序前进,不支持回退。一旦生成器函数执行完毕,再次调用 `next()` 将引发 `StopIteration` 异常。
(4)使用方式:生成器可以使用函数的方式定义,通过 `yield` 返回值,而不是一次性生成整个序列。可以使用 `for` 循环或 `next()` 函数逐个获取生成器的值。

共同点

(1)按需生成值:迭代器和生成器都是按需生成值的,可以在需要时逐个获取元素,而不是一次性生成整个序列。
(2)用于循环结构:迭代器和生成器都可以被用于 `for` 循环结构,使得处理序列数据更加方便。
(3)节省内存:由于按需生成,迭代器和生成器在处理大型数据集时可以节省内存。

综合而言,迭代器和生成器都是处理序列数据的强大工具,选择使用哪个取决于具体的需求和代码结构。

二、使用案例

2.1 迭代器

迭代是 Python 最强大的功能之一,是访问集合元素的一种方式。。

迭代器是一个可以记住遍历的位置的对象。

迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。

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

字符串,列表或元组对象都可用于创建迭代器:

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

迭代器对象可以使用常规 for 语句进行遍历:

#!/usr/bin/python3

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

执行以上程序,输出结果如下:

1 2 3 4

也可以使用 next() 函数:

#!/usr/bin/python3

import sys         # 引入 sys 模块

list=[1,2,3,4]
it = iter(list)    # 创建迭代器对象

while True:
    try:
        print (next(it))
    except StopIteration:
        sys.exit()

执行以上程序,输出结果如下:

1
2
3
4

2.2 生成器

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

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

在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值。并在下一次执行 next() 方法时从当前位置继续运行。

以下实例使用 yield 实现斐波那契数列:

#!/usr/bin/python3

import sys

def fibonacci(n): # 生成器函数 - 斐波那契
    a, b, counter = 0, 1, 0
    while True:
        if (counter > n): 
            return
        yield a
        a, b = b, a + b
        counter += 1
f = fibonacci(10) # f 是一个迭代器,由生成器返回生成

while True:
    try:
        print (next(f), end=" ")
    except StopIteration:
        sys.exit()

执行以上程序,输出结果如下:

0 1 1 2 3 5 8 13 21 34 55

三、使用场景

3.1 使用生成器的场景

  1. 大数据集处理: 当处理大量数据时,生成器允许按需生成数据,而不需要一次性将所有数据加载到内存中。这对于内存敏感的应用程序非常有用。
  2. 惰性计算: 如果你有一个计算密集型的操作,但只有在需要结果时才进行计算,生成器可以提供惰性计算的特性,避免不必要的计算开销。
  3. 无限序列: 生成器可以轻松地表示无限序列,因为它们按需生成数据。这对于模拟、数学计算和其他需要无限序列的场景非常有用。
  4. 协程和异步编程: 生成器可以用作协程的基础,用于异步编程中。asyncio 模块中就使用了异步生成器。
  5. 状态机: 生成器可以方便地实现状态机,使得在状态之间切换更加直观和简单。

3.2 使用迭代器的场景

  1. 按顺序访问集合元素: 迭代器是按需提供下一个元素的序列对象,适合在循环中按顺序访问集合元素。
  2. 遍历大型数据结构: 当处理大型数据结构时,使用迭代器可以逐个获取元素,而不需要一次性加载整个数据结构。
  3. 自定义容器类: 实现迭代器接口的类可以自定义容器,使得对象能够被 for 循环等结构遍历。
  4. 惰性计算: 迭代器也支持惰性计算,它们在需要时生成下一个元素,而不提前生成整个序列。
  5. 无需记住索引: 使用迭代器时,不需要显式地使用索引来访问元素,这使得代码更加简洁和易读。

标签:__,函数,迭代,生成器,next,序列
From: https://www.cnblogs.com/NGU-PX/p/17921337.html

相关文章

  • MyBatis-Plus 可视化代码生成器
    MyBatis-Plus可视化代码生成器来啦,让你的开发效率大大提速!!来源:blog.csdn.net/yelangkingwuzuhu/article/details/128077533前言一、mybatis-plus-generator-ui是什么?二、mybatis-plus-generator-ui怎么用?1、mavenpom引入2、新建程序入口,以main函数的方式运行3、......
  • Python 中迭代器与生成器:深度解析与实用指南
    Python作为一门强大而灵活的编程语言,提供了许多高效的工具来处理数据集合。在这些工具中,迭代器(Iterators)和生成器(Generators)是两个重要的概念,它们在数据遍历和惰性计算方面发挥着重要作用。本文将深入探讨Python迭代器和生成器的概念、用法以及它们之间的区别。1.什么是迭代器?迭代......
  • 基于Tensorflow技术开发的计算机毕业设计辅助生成器(使用AI大模型技术)
    这是一个辅助生成计算机毕业设计的工具,可以自动完成毕业设计的源码。它基于几百个github上面开源的java和python项目,运用tensorflow技术,训练出了AI大模型。基本实现了计算机毕业设计生成器,能够初步生成Java或python基本源码。目前该项目处理实验阶段,还不成熟,成功率55%左右。体......
  • 独立游戏 - 隐私政策生成器
    作为独立游戏开发者,生存空间,可以说是越来越苛刻了(当然了,越来越规范是好事情)最近参加AR的比赛,提交程序,需要隐私政策,经过一番折腾,找到了解决方案。 https://privacy.1ts.fun/这是一个隐私政策生成器,根据自己的需要,选择选项,然后生成,并导出txt。然后用word简单编辑,调整下格式,导......
  • day15(生成器)
    1.生成器对象1.本质 还是内置有__iter__和__next__的迭代器对象2.区别 迭代器对象是解释器自动提供的 数据类型\文件对象>>>:迭代器对象 生成器对象是程序员编写出来的 代码、关键字>>>:迭代器对象(生成器)3.创建生成器的基本语法 函数体代码中填写yield关键字......
  • 详解rust 自动化测试、迭代器与闭包、智能指针、无畏并发
    编写测试可以让我们的代码在后续迭代过程中不出现功能性缺陷问题;理解迭代器、闭包的函数式编程特性;Box<T>智能指针在堆上存储数据,Rc<T>智能指针开启多所有权模式等;理解并发,如何安全的使用线程,共享数据。自动化测试编写测试以方便我们在后续的迭代过程中,不会改坏代码。保证了程序的......
  • python迭代器理解
    目录什么是迭代器?为什么要有迭代?迭代器的优缺点什么是可迭代对象?什么是迭代器对象呢?什么是迭代器?在学习for循环的时候,听到了一个词叫可迭代对象。那什么是可迭代对象?了解后又知道了迭代,可迭代,迭代器这些名词,那这些到底是什么意思呢?我们先知道为什么for循环不像whlie循环一样,使......
  • Python迭代器和生成器
    【一】迭代器介绍迭代器即用来迭代取值的工具,而迭代是重复反馈过程的活动其目的通常是为了逼近所需的目标或结果,每一次对过程的重复称为一次“迭代”而每一次迭代得到的结果会作为下一次迭代的初始值,单纯的重复并不是迭代whileTrue:msg=input(">>:").strip()......
  • HydroOJ 从入门到入土(7)Hydro自带数据生成器使用说明(>=4.10.1)
    Hydro更新了一个新功能,可以直接用自带的数据生成器,在线生成数据,简单记录一下使用方法目录1.文件准备2.使用步骤3.注意事项4.文件模版1.文件准备gen.py(数据生成器,后附模版)std.cpp(标准程序,后附模版)文件名随意,其他的类型应该也行,不过没试.2.使用步......
  • 如何通过迭代器反映出该迭代器在容器中的位置
    如何通过迭代器反映出该迭代器在容器中的位置在C++中,迭代器本身并不会直接提供它在容器中位置的信息,但你可以利用迭代器之间的相对关系来反映出它在容器中的位置。迭代器是指向容器元素的对象,它们可以通过不同的方式进行比较和操作。在容器中,迭代器的位置可以通过迭代器之间的相对......