• python之生成器的初识


    1. 生成器的定义

    生成器的本质就是迭代器.python社区生成器和迭代器是一种

    2. 生成器和迭代器区别

    迭代器:

    ​ 都是Python给你提供的已经写好的工具或者通过数据转化得来的

    生成器:

    ​ 需要我们自己构建的工具

    3. 生成器的产生方式

    • 生成器函数
    • 生成器表达式
    • python给你提供的一些内置函数,返回一个生成器

    4. 生成器函数 (***)

    迭代器的return换成yield就是生成器,但是这个时候正常执行的结果是一个生成器的地址 (***)

    # 生成器格式:***
    def func():
        print(111)
        yield 22
        yield 33
    ret = func() 
    print(next(ret)) # 执行一次next返回一个值
    print(next(ret)) 
    # 输出结果
    111
    22
    33
    
    # 如果执行的时候再加一个print(next(ret))是会报错的,原因是生成器一个一个地往下执行,而且会记录位置,不走回头路,再加一个找不到值,就会报错.也就是一个yield对应一个next,next超过yield数量,就会报错.(***)
    

    以下为帮助理解

    # 讲解方法
    def func():
        print(111)
        yield 22
    gent = func()
    ret = gent.__next__() # 这里要加一个方法.__next__()
    print(ret)
    
    
    def func():
    	print(111)
    	yield 22
    ret = func()
    print(ret) # 正常迭代器如果是这样的形式的话,到这一步是要进行执行的,打印结果先打印111,return 返回22 ,而在生成器中打印的是生成器的地址
    
    如果要执行生成器需加一个方法:
    print(next(ret))
    # 执行结果
    111
    22
    # 有几个yield就需要有几个print(next(ret)),yield少print多的话就会报错,就是print找不到了
    

    5. 生成器的例题

    # 吃包子
    def bun():
    	for i in range(1,2001):
    		yield f'{i}号包子'
    ret = bun()
    
    for i in range(200): # 这个相当于执行next(ret)的次数
    
    	print(next(ret))
    	
    # 输出结果
    1号包子
    2号包子
    3号包子
    4号包子4
    5号包子
    ...
    200号包子
    
    # 迭代器制作包子是一次性完成,会占用大量的空间,而生成器制作包子,是你需要一个包子我制作一个,非常节省内存
    
    # 优点: 补全内容
    

    6. yield(***)

    用途

    yield : 对应next给next返回值

    只要函数中出现了yield那么他就不是函数,它是生成器函数

    7. yield与return的区别(***)

    return一般在函数中只设置一个,他的作用是终止函数,并且给函数的执行者返回值。

    yield在生成器函数中可设置多个,他并不会终止函数,next会获取对应yield生成的元素。

    8. yield from(***)

    用途

    以直接把可迭代对象中的每一个数据作为生成器的结果进行返回,代替for循环的作用

    例题: 这个例题一看就会

    def func():
        lst = ['卫龙','老冰棍','北冰洋','牛羊配']
        yield lst
    g = func()
    print(g)
    print(next(g))
    
    # 输出结果
    <generator object func at 0x1095c95e8>
    ['卫龙', '老冰棍', '北冰洋', '牛羊配']
    
    

    yield写两个列表同时运行也不会产生交替的效果

    def func():
        lst1 = ['卫龙','老冰棍','北冰洋','牛羊配']
        lst2 = ['馒头','花卷','豆包','大饼']
        yield from lst1
        yield from lst2
        
    g = func()
    for i in g:
        print(i)
        
    # 输出结果
    
    

    8. yield和yield from对比(***)

    Yield: 对应next给next返回一个值

    Yield from: 省代码 提升效率 代替for循环

  • 相关阅读:
    oracle日期格式转换 to_date()
    YAML中使用Jinja模板以{{ foo }}开头需要整行加双引号
    linux查看修改线程默认栈空间大小(ulimit -s)
    理解一条语句:SELECT difference(sum("value")) FROM "mq_enqueue" WHERE "channel" =~ /ActiveMQ_TEST/ AND $timeFilter GROUP BY time($interval)
    zookeeper客户端连接报错
    docker swarm join 报错
    redis make报错
    302重定向问题
    svn安装配置
    mysql5.7.22tar包安装
  • 原文地址:https://www.cnblogs.com/zanao/p/11061614.html
Copyright © 2020-2023  润新知