返回顶部
首页 > 资讯 > 后端开发 > Python >理解python的generator
  • 250
分享到

理解python的generator

pythongenerator 2023-01-31 03:01:09 250人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

一句话总结generator:generator允许循环得到一串数据,且如何得到数据的过程可以自定义   以下对于generator的描述都是正确的: 1)generator以对计算资源的消耗取代了对内存的消耗 2)generator有用

一句话总结generator:generator允许循环得到一串数据,且如何得到数据的过程可以自定义

 

以下对于generator的描述都是正确的:

1)generator以对计算资源的消耗取代了对内存的消耗

2)generator有用的地方在于允许自定义得到感兴趣数据的过程

3)因为返回的可迭代对象,所以可以方便的使用循环

4)generator坚持从程序运行的大局出发,在自己执行的过程中主动交出程序控制流,方便了用户得到所需的数据,堪称雷锋

 

如何理解这几点呢?

从最近自己的一个编码经历说起。

最近接到一个任务,要把两个输入队列拼装为一个输出队列。一个输入队列是IP段,每个元素要么是单个IP,要么是一个IP段(例如10.10.10.1-10.10.10.254),另一个输入队列是端口号,每个元素要么是单个端口,要么是一段端口号(例如1-8000),要求输出队列的元素是IP和端口号的结合,格式是IP:PORT,例如10.10.10.5:23,并且要包括每一个输入的IP和端口号的结合,例如如果输入了10个IP,65535个端口,那么输出队列就要包含这十个IP的所有65535个端口,共65万个元素!

这还仅仅是10个IP,输入的IP完全可能是一个B类地址,共65535个IP,乘以65535个端口,输出队列共约43亿个元素!如果我把输出队列放到一个list里面,很可能还没初始化完这个list,内存已经被占用完了。

咋办呢?

当我为这个问题发愁的时候,我已经把generator那篇翻译的文章完成有一段时间了,显然翻译完还是没有理解generator精髓的,要在经历过一个失眠的夜晚后才真正理解generator存在的价值。

当天晚上躺在床上一直在考虑这个问题,在回忆译文中的例子的时候意识到generator正是解决我面临问题的最佳办法。

generator看起来像是个函数,函数就是处理逻辑,generator的处理逻辑就是你想怎么处理输入数据,以便得到你想要的数据,对想要的数据yield即可。我的输入数据显然就是两个输入队列,取它们的每一个元素,对它们进行拼接,就得到了一个我想要的元素,在这个元素钱添加yield,这个generator就完成了我想要的功能。

下面是我定义的generator,其实genip()和genport()也是generator

 


def genipport(iplist, portlist):
    IPs = genip(iplist)
    for ip in IPs:
        Ports = genport(portlist)
        for port in Ports:
            yield (ip,port)

 

下面是我使用generator的代码:

 


ipWITHport = genipport(IPList, PortList)
item = next(ipWITHport)

 

经过验证,程序运行的效果非常好,相比于使用list存放输出队列这种最原始的方法来说,generator简直几乎就是不占用内存,它是在运行过程中每获取到一个所需元素后(执行到yield语句)就将程序控制流转移到调用方执行,调用方请求下一个的时候(例如调用next函数)再把程序控制流转移到generator内部,因为程序控制流转出的时候generator会保留当前的环境和变量值,所以程序控制流转移回来的时候会继续从上次已经获取的元素处继续运行,取下一个元素,就好像python是个导演,在generator执行的时候导演随时会喊cut,直到所有的元素被取出为止。

***************************************************************************

欢迎扫码关注我的微信公众号zhixin991

--结束END--

本文标题: 理解python的generator

本文链接: https://lsjlt.com/news/187744.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 理解python的generator
    一句话总结generator:generator允许循环得到一串数据,且如何得到数据的过程可以自定义   以下对于generator的描述都是正确的: 1)generator以对计算资源的消耗取代了对内存的消耗 2)generator有用...
    99+
    2023-01-31
    python generator
  • python generator
    >>> lst_num = [1,2,3] >>> iter = (i for i in lst_num) >>> print iter.next <method-wrapper ...
    99+
    2023-01-31
    python generator
  • 如何理解JS中的Generator及协程
    这篇文章主要讲解了“如何理解JS中的Generator及协程”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何理解JS中的Generator及协程”吧!生成...
    99+
    2024-04-02
  • python中的生成器(generator)
    一、生成器 生成器是 Python 中非常有用的一种数据类型,它可以让你在 Python 中更加高效地处理大量数据。生成器可以让你一次生成一个值,而不是一次生成一个序列,这样可以节省内存并提高性能 二、实现generator的两种方式 py...
    99+
    2023-09-18
    python 前端 linux
  • Python 生成器 generator
    前提条件: 如果函数含有yield就是生成器,执行过程中遇到yield就跳出。 举例:def gen():for i in range(10):x = yield iprint(x)g=ge()print(g.send(None)))pri...
    99+
    2023-01-31
    生成器 Python generator
  • 由浅入深讲解python中的yield与generator
    前言 本文将由浅入深详细介绍yield以及generator,包括以下内容:什么generator,生成generator的方法,generator的特点,generator基础及高级应用场景,genera...
    99+
    2022-06-04
    由浅入深 python generator
  • Promise+async+Generator的实现原理
    目录前言1. 观察者模式2. Promise A+规范3. then的链式调用4.值穿透 & 状态已变更的情况5.兼容同步任务Promise.prototype.catch(...
    99+
    2024-04-02
  • 深入学习python的yield和generator
    前言 没有用过的东西,没有深刻理解的东西很难说自己会,而且被别人一问必然破绽百出。虽然之前有接触过python协程的概念,但是只是走马观花,这两天的一次交谈中,别人问到了协程,顿时语塞,死活想不起来曾经看过...
    99+
    2022-06-04
    python yield generator
  • Python浅析生成器generator的使用
    目录一、创建生成器1.创建生成器的方式12.创建生成器的方式2二、遍历生成器的方式三、总结一、创建生成器 通过列表⽣成式,我们可以直接创建⼀个列表。 但是,受到内存限制,列表容量肯定...
    99+
    2024-04-02
  • 生成器Generator的原理及用法
    本篇内容主要讲解“生成器Generator的原理及用法”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“生成器Generator的原理及用法”吧!基本用法我们知道,...
    99+
    2024-04-02
  • JavaScript Generator异步过度的实现详解
    目录异步过渡方案Generator1. Generator 的使用2. Generator 函数的执行2.1 yield 关键字2.2 next 方法与 Iterator 接口3. ...
    99+
    2022-11-13
    JavaScript Generator异步过度 JavaScript Generator
  • python如何使用generator节省内存
    这篇文章主要介绍了python如何使用generator节省内存,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。generator节省内存之前,我向你展示了list  ...
    99+
    2023-06-27
  • 浅谈Python生成器generator之next和send的运行流程(详解)
    对于普通的生成器,第一个next调用,相当于启动生成器,会从生成器函数的第一行代码开始执行,直到第一次执行完yield语句(第4行)后,跳出生成器函数。 然后第二个next调用,进入生成器函数后,从yiel...
    99+
    2022-06-04
    生成器 浅谈 详解
  • python的列表生成式,生成器和generator对象你了解吗
    目录列表生成式列表表达式初始化 dict 或 setgenerator对象生成generator对象总结列表生成式 可以使用列表生成式生成 列表元素。 例如: 列表还支持 if &...
    99+
    2024-04-02
  • Python的Generator和Go的Concurrency Pattern有什么联系吗
    这篇文章主要讲解了“Python的Generator和Go的Concurrency Pattern有什么联系吗”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python的Generator和...
    99+
    2023-06-15
  • 详解mybatis generator代码生成器的使用
    MyBatis Generator简介 MyBatis Generator(MBG)是MyBatis MyBatis 和iBATIS的代码生成器。它将为所有版本的MyBatis以及...
    99+
    2024-04-02
  • es6中的generator怎么用
    本篇内容介绍了“es6中的generator怎么用”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成! ...
    99+
    2024-04-02
  • mybatis-generator生成文件覆盖问题的解决
    目录mybatis-generator生成文件覆盖解决方案mybatis-generator避免覆盖自定义的sql方法mybatis-generator生成文件覆盖 在Idea中使用...
    99+
    2024-04-02
  • Mybatis Generator 获取不到字段注释的解决
    目录Mybatis Generator 获取不到字段注释解决方法Oracle 数据库MySql 数据库详解mybatis-generator生成数据表中注释1.克隆项目2.修改pom...
    99+
    2024-04-02
  • Python使用迭代器捕获Generator返回值的方法
    本文实例讲述了Python使用迭代器捕获Generator返回值的方法。分享给大家供大家参考,具体如下: 用for循环调用generator时,发现拿不到generator的return语句的返回值。如果想...
    99+
    2022-06-04
    返回值 迭代 方法
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作