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)
原文地址:https://www.cnblogs.com/XuChengNotes/p/11348984.html