首页 > 其他分享 >8.生成器

8.生成器

时间:2022-11-02 21:12:48浏览次数:40  
标签:生成器 yield next ge print gen

1.什么是生成器?

生成器是由一个函数和yield关键字创建出来的生成器最大的作用就是帮助我们节省内存空间

比如,当我们需要使用一个1-100000的列表,遍历每一个数进行操作,我们首先会想到的就是创建一个列表,然后遍历该列表,如下

var = [i for i in range(100001)]
print(var)

for i in var:
print(i)

我们通过推导式创建了一个列表,存储着我们需要的所有数据,虽然在功能上没有问题,但是巨大的列表消耗了我们大量的内存,那么我们该如何解决呢?

生成器就可以很好的解决该问题,他的原理就是每次调用生成器,都只会生成一个对象供我们操作。这样也可以实现功能,同时节省内存

2.如何创建一个生成器?

当执行生成器函数的时候,知识生成了一个生成器,并没有执行函数代码

当next调用的时候,会执行到yiled,将yield的右侧值返回,并保存此时函数的执行位置,当再次调用next的时候,再执行到yield,返回yiled右侧的数值,再次记录执行的位置,直到函数结束,就会抛出一个StopIteration的异常

# 创建一个生成器函数
def gen(total):
    for i in range(total):
        yield i

# 创建 一个生成器
ge = gen(100000)

# 执行一次yield
print(next(ge))  # 1
print(next(ge))  # 2
print(next(ge))  # 3
print(next(ge))  # 4

对于生成器,我们可以使用for进行迭代

def gen(total):
    for i in range(total):
        yield i


ge = gen(10)

for i in ge:
    print(i, end=' ')  # 0 1 2 3 4 5 6 7 8 9 

 

3.生成器进阶

有时候我们希望给生成器传递一些参数来控制程序的运行,就可以使用send函数

send函数和next函数都可以使得生成器执行下一步返回一个对象,所不同的是send可以传递参数

def gen(total):
    for i in range(total):
        v = yield i
        print(v)


# 生成一个生成器对象
ge = gen(10)

# 执行到yield,返回数字0,阻塞住,此时v还没有完成赋值
res = next(ge)
print(res)  # 1
# 函数继续执行,完成v的赋值 v = 10,执行print,再次执行到yield,返回1,然后阻塞住
print(ge.send(10))

注意:当生成器第一次调用的时候,最好使用next方法,如果一定要用send,则传递的参数为None,即send(None)

 

标签:生成器,yield,next,ge,print,gen
From: https://www.cnblogs.com/victor1234/p/16852455.html

相关文章

  • javascript异步编程之generator(生成器函数)与asnyc/await语法糖
    Generator异步方案相比于传统回调函数的方式处理异步调用,​​Promise​​最大的优势就是可以链式调用解决回调嵌套的问题。但是这样写依然会有大量的回调函数,虽然他们之间......
  • javascript异步编程之generator(生成器函数)与asnyc/await语法糖
    Generator异步方案相比于传统回调函数的方式处理异步调用,Promise最大的优势就是可以链式调用解决回调嵌套的问题。但是这样写依然会有大量的回调函数,虽然他们之间没有嵌......
  • MyBatis-Plus 的代码生成器AutoGenerator
    ==========================================================//导入依赖<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-generator</......
  • Python 生成器
    什么是生成器:生成器是Python中的一个对象(按照某种规律,来生成元素的对象),生成器不是列表,保存了产生元素的算法,同时会记录游标的位置(现在拿到第几个元素了),为了下次继续拿......
  • 生成器与迭代器
    迭代器有两个基本的方法:iter()和next()。迭代对象iter()生成器本身就含有iter和next的内置方法,它本身就是迭代器,那么怎么定义一个生成器呢?那就需要用到yield关键字了,yi......
  • 07-代码自动生成器
    旧版代码生成器packagecom.yefeng;importcom.baomidou.mybatisplus.annotation.DbType;importcom.baomidou.mybatisplus.annotation.FieldFill;importcom.baomido......
  • K3CloudDevTools【强类型DynamicObject代码生成器】
    强类型DynamicObject代码生成器DynamicObject是一个类似Dictionary的结构。实际使用过程中,需牢记Key,同时还需频繁进行类型转换,十分麻烦。通过本工具,可以为表单创建一个强......
  • python 生成器
    """Python当中的生成器""""""生成器表达式生成器当中三个方法:close,send,throw()Python3有一个内置函数next(),它通过调用其next()方法从迭代器中检索下一个......
  • 萌娃人脸生成器 实践踩坑笔记
    项目地址:https://github.com/a312863063/seeprettyface-generator-babies1.介绍本文是运行一个StyleGAN训练出的萌娃人脸生成器。2.实践过程1.1下载代码库1.2下......
  • day5可迭代对象与迭代器和生成器
    day5.可迭代对象与迭代器和生成器1.迭代器的基本概念1.1.什么是迭代器迭代就是更新换代1.1.迭代器指的是迭代取值的工具1.2.迭代是一个重复的过程,每一次重......