• Python-11-生成器


    一、定义

    可以理解为一种数据类型,这种数据类型自动实现了迭代器协议(其他数据类型需要调用__iter__方法),所以生成器就是一种迭代器。

    二、生成器的两种形式

    1. 生成器函数

    使用yield代替return返回结果,yield语句一次返回一个结果,返回一个结果后,挂起函数的状态,下次从yield的位置继续执行。

    def fib(max):
        n, a, b = 0, 0, 1
        while n < max:
            yield b
            a, b = b, a + b
            n = n + 1
        return 'done'
    
    
    f = fib(10)
    print(next(f))
    print(next(f))
    print(next(f))
    print(next(f))
    
    # 函数是顺序执行,遇到return语句或者最后一行函数语句就返回。而变成generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行。
    def odd():
        print('step 1')
        yield 1
        print('step 2')
        yield(3)
        print('step 3')
        yield(5)
    
    >>> o = odd()
    >>> next(o)
    step 1
    1
    >>> next(o)
    step 2
    3
    >>> next(o)
    step 3
    5
    >>> next(o)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    StopIteration
    
    def test():
        print('开始啦')
        first = yield 1
        print('第一次', first)
        yield 2
        print('第二次')
        yield 3
        print('第三次')
    # yield 1相当于return,控制的是函数的返回值
    # yield可以接收send传过来的值
    
    t = test()
    res = t.__next__()
    print(res)
    
    t.send('hello')
    

    2. 生成器表达式

    # 三元表达式
    name = 'alex'
    res = 'SB' if name == 'alex' else '123'
    print(res)
    
    SB
    
    # 列表解析
    l1 = ['鸡蛋%s' % i for i in range(1, 10)]
    l2 = ['鸡蛋%s' % i for i in range(1, 10) if i > 5]
    # l3 = ['鸡蛋%s' % i for i in range(1, 10) if i > 5 else i] # 没有四元表达式
    print(l1)
    print(l2)
    
    ['鸡蛋1', '鸡蛋2', '鸡蛋3', '鸡蛋4', '鸡蛋5', '鸡蛋6', '鸡蛋7', '鸡蛋8', '鸡蛋9']
    ['鸡蛋6', '鸡蛋7', '鸡蛋8', '鸡蛋9']
    
    # 生成器表达式
    g = ('鸡蛋%s' % i for i in range(1, 10) if i > 5)
    print(next(g))
    print(next(g))
    print(next(g))
    print(next(g))
    
    鸡蛋6
    鸡蛋7
    鸡蛋8
    鸡蛋9
    

    三、特性

    • 延迟计算,一次产生一个数据,也就是说不会一次产生全部结果,对于大量数据的处理非常有用。

    sum([x for x in range(1000000000)])  # 一次计算全部结果,占用大量内存
    sum(x for x in range(1000000000))  # 一次计算一个结果,几乎不占内存
    
    • 有效提高代码可读性

    • 生成器只能遍历一次
  • 相关阅读:
    008-解决sublime text3安装Package Control问题
    156-a++与++a区别?
    155-类型转换的六条规则是什么?
    040-springboot工程无法逆向工程生成?
    153-如何搭建springboot框架?
    【根据生日获取年龄】
    富文本 保存转义StringEscapeUtils.unescapeHtml4(
    git ,报403错误,完美解决方案
    idea创建Maven项目后启动报404
    IntelliJ IDEA2016.1 + maven 创建java web 项目[转]
  • 原文地址:https://www.cnblogs.com/lsf123456/p/11178544.html
Copyright © 2020-2023  润新知