首页 > 其他分享 >生成器generator

生成器generator

时间:2023-06-01 11:14:55浏览次数:35  
标签:调用 函数 generator 生成器 next print

1,用于协程,最近(2023/6/1)开始看到生成器用于协程这方面的内容,但还没接触,开始有所了解。

 

如果列表元素可以按照某种算法推算出来,那我们因此可以在循环的过程中不断推算出后续的元素,这样就不必创建完整的list,从而节省大量的空间。

在Python中,这种一边循环一边计算的机制,称为生成器:generator。

generator保存的是算法,每次调用next( g ),就计算出g的下一个元素的值,直到计算到最后一个元素,没有更多的元素时,抛出StopIteration的错误。

 创建生成器的2种方式:

1,把列表生成式中的中括号[ ] 改成小括号( )

2,生成器函数——yield关键字:如果推算的算法比较复杂,用类似列表生成式的for循环无法实现的时候,还可以用函数来实现。

使用生成器:

我们创建了一个generator后,基本上永远不会调用next(),而是通过for循环来迭代它(因为如果生成器对象很多,使用next( )函数来获取每一个元素,会很麻烦),并且不需要关心StopIteration的错误。(是因为for循环内部会处理异常)

对于函数改成的generator来说,遇到return语句或者执行到函数体最后一行语句,就是结束generator的指令,for循环随之结束。

执行流程:

最难理解的就是generator和函数的执行流程不一样。

函数:是顺序执行,遇到return语句或者最后一行函数语句就返回。

generator函数:在每次调用next( )的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。

生成器拿不到return语句的返回值

用for循环调用generator时拿不到return语句的返回值。

如果想要拿到返回值,必须捕获StopIteration错误,返回值包含在StopIteration的value中。

 

 1 #定义一个生成器函数
 2 def odd():
 3     print('step 1')
 4     yield 1
 5     print('step 2')
 6     yield(3)
 7     print('step 3')
 8     yield(5)
 9     
10    
11 print("\n以下调用方式会创建多个独立的生成器:")
12 print(next(odd()))
13 print(next(odd()))
14 print(next(odd()))
15 
16 
17 print('\n正确的调用方式:')
18 g = odd()
19 print(next(g))
20 print(next(g))
21 print(next(g))
22 print(next(g))

 

调用该generator函数时,首先要生成一个generator对象,然后用next()函数不断获得下一个返回值,当迭代完再使用next()函数时会报错StopIteration。

调用generator函数会创建一个generator对象,多次调用generator函数会创建多个相互独立的generator。

 

标签:调用,函数,generator,生成器,next,print
From: https://www.cnblogs.com/bravesunforever/p/17448151.html

相关文章

  • Mybatis-plus关于代码生成器的使用
    1、添加依赖 2、在test包下创建一个CodeGet类,实现生成代码的功能。注意:全局配置、数据源配置一定要和自己的电脑配置一致! 3、执行CodeGet类中的main方法。打印台有如下图提示字样,即自动生成成功。 4、对比两张图。在wechat文件夹下有controller、entity、mapper、s......
  • 灵感生成器DreamGPT开源:见识一下真正的脑洞大开
    ChatGPT最为人诟病的缺陷就是「胡编乱造」了,可以一本正经地讲一段林黛玉倒拔垂杨柳的故事。  对于真正想了解「林黛玉」或「倒拔垂杨柳」的人来说,这段回答可以说是灾难级误导了,但对于专注于「虚构」和「创意」的从业者来说,天马行空幻觉反而可以激发创造力。 最近Diverge......
  • 中间代码生成器 修改
    #include<stdio.h>#include<stdlib.h>#include<iostream>#include<string>#include<map>#include<sstream>usingnamespacestd;pair<string,string>words[100];//词法分析结果,每个pair的first如"identifier",second如&......
  • ir_generator.c
    #include<stdio.h>#include<stdlib.h>#include<iostream>#include<string>#include<map>#include<sstream>usingnamespacestd;pair<string,string>words[100];//词法分析结果,每个pair的first如"identifier",second如&......
  • Mybatis Generator 配置详解
    因原版观感不佳,搬运至此。作者:Jimin链接:https://www.imooc.com/article/21444来源:慕课网<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEgeneratorConfiguration PUBLIC"-//mybatis.org//DTDMyBatisGeneratorConfiguration1.0//EN"&quo......
  • Python generator 构建协程,实现异步编程(使用yield构建消息处理者和消息创造者)
    协程的定义理解Python协程可以在单个处理机或多个处理机上运行,这取决于具体实现方式。在Python中,主要有两种协程实现方式:生成器协程和asyncio协程。生成器协程只能在单个处理机上运行,因为生成器协程是通过生成器函数实现的,而生成器函数在单个线程中执行。生成器协程也称为......
  • Java:mybatis-plus-generator-ui 基于Mybatis-Plus的代码自助生成器
    引用官方文档上的简介:提供交互式的WebUI用于生成兼容mybatis-plus框架的相关功能代码,包括Entity,Mapper,Mapper.xml,Service,Controller等,可以自定义模板以及各类输出参数,也可通过SQL查询语句直接生成代码。文档github:https://github.com/davidfantasy/mybatis-plus-generator-......
  • [论文阅读] GAS-NeXt@Few-Shot Cross-Lingual Font Generator
    Pretitle:GAS-NeXt:Few-ShotCross-LingualFontGeneratoraccepted:arxiv2022paper:https://arxiv.org/abs/2212.02886code:https://github.com/cmu-11785-F22-55/GAS-NeXt关键词:few-shot,cross-lingual,fontgeneration阅读理由:新作,有代码,简单易读(快速应对组会),......
  • 代码生成器
    代码生成器原理是读取表结构,根据表结构的字段名称、数据类型、注释生成实体类,然后根据实体类生成controller和servicefreemarker标签参数${pramName}:根据controller中定义的值,对pramName进行替换<#if>:当结果为true时才会进行展示<p>你好,<#ifuserName=="lyra">......
  • MybatisPlusGenerator 实体类 xml dao 生成工具
    packagecom.thtf.zwdsj.gongjia.config;importcom.baomidou.mybatisplus.core.mapper.BaseMapper;importcom.baomidou.mybatisplus.generator.FastAutoGenerator;importcom.baomidou.mybatisplus.generator.config.OutputFile;importcom.baomidou.mybatisplus.gener......