zoukankan      html  css  js  c++  java
  • 057 生成器和生成器表达式

    一、生成器

    生成器: 是自定义的迭代器,生成器就是迭代器(自己造出来的)

    生成器必须使用yield关键字

    yield关键字

    yield的三个特性:

    1. yield可以把 函数 变成生成器(自定制的迭代器对象,具有__iter____next__方法)
    2. yield可以停止函数,再下一次next再次运行yield下面的代码
    3. 有n个yield生成器就有n个元素,就可以next n次, 第n+1次next会报错

    例子:(请仔细观看打印结果)

    # 例子
    def func():
        yield [1,1,23]  # yield会使函数func()变成生成器对象,因此他就具有__iter__方法
        print(789)      # yield会停止函数,当运行下一次next才会继续运行下面的代码
        yield 101112    # 一个yield对应一个next
        print(131415)
    
    f = func()  # 调用func()函数 会得到生成器对象
    try:
        print("执行一次__next__会运行一次yield之前的代码",f.__next__())     # [1, 1, 23]
        print("停止迭代")
        print("执行一次__next__会运行一次yield之前的代码",f.__next__())     # 101112
        print("停止迭代")
        print("继续__next__,会执行上一次yield后的代码",f.__next__())     # 直到它遇到 StopIteration 异常为止。
    except:
        print("遇到异常了")
    

    执行一次__next__会运行一次yield之前的代码 [1, 1, 23]
    停止迭代
    789
    执行一次__next__会运行一次yield之前的代码 101112
    停止迭代
    131415
    遇到异常了

    使用for循环的例子:

    牢记:生成器 就是 (自定制的迭代器对象)

    # 例子
    def func():
        yield [1,1,23]  # yield会使函数func()变成生成器对象,因此他就具有__iter__方法
        print(789)      # yield会停止函数,当运行下一次next才会继续运行下面的代码
        yield 101112    # 一个yield对应一个next
        print(131415)
    
    # 还记得for循环原理。使用for循环原理进行循环迭代器对象。异常就退出
    for i in func():    # 使用for循环迭代生成器(自定制的迭代器对象)
        print(i)
    

    使用生成器自定制一个range方法

    # 用生成器自定制一个range方法
    def func(*args):
        step = 1   # 步长
        start = 0   # 起始
        end = 0   # 范围
        if len(args) == 1:
            start = 0
            end = args[0]
    
        elif len(args) == 2:
            start = args[0]
            end = args[1]
    
        elif len(args) == 3:
            start = args[0]
            end = args[1]
            step = args[2]
    
        while start < end:
            yield start
            start += step
    
    for i in func(10):  # 自己实现的range方法,可以实现3个可变长位置参数。
        print(i)
    

    二、生成器表达式

    生成器表达式就是:把列表推导式的[]换成()

    用法:

    lt = (i for i in range(100))	# 生成器表达式
    print(lt)   # 生成器对象
    print(lt.__next__())    # 迭代一次迭代器()
    
    # 使用for循环迭代生成器对象
    for i in lt:    # 因为next方法迭代了一次.就会从1开始
        print(i)
    
  • 相关阅读:
    Redis 如何保证缓存与数据库双写时的数据一致性
    Redis 缓存雪崩和缓存穿透问题
    Redis 的并发竞争 Key 问题
    【转】intelliJ IDEA集成checkStyle
    【转】hadoop深入研究:(十一)——序列化与Writable实现
    【转】Hadoop在MapReduce中使用压缩详解
    【转】JDK工具jinfo用法详解
    【转】JVM统计监控工具-jstat
    【转】jps命令使用
    基于MLlib的机器学习--协同过滤与推荐
  • 原文地址:https://www.cnblogs.com/XuChengNotes/p/11348984.html
Copyright © 2011-2022 走看看