zoukankan      html  css  js  c++  java
  • 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循环

  • 相关阅读:
    arcgis api 3.x for js 入门开发系列八聚合效果(附源码下载)
    arcgis api 3.x for js 入门开发系列七图层控制(附源码下载)
    arcgis api 3.x for js 入门开发系列六地图分屏对比(附源码下载)
    arcgis api 3.x for js 入门开发系列五地图态势标绘(附源码下载)
    arcgis api 3.x for js 入门开发系列四地图查询(附源码下载)
    Java里面获取当前服务器的IP地址
    Flutter at Google I/O 2018
    Modbus RTU 协议使用汇总
    plsql 创建表空间、用户、赋予权限
    Oracle:ODP.NET Managed 小试牛刀
  • 原文地址:https://www.cnblogs.com/zanao/p/11061614.html
Copyright © 2011-2022 走看看