生成器

什么是生成器?

  在函数内但凡使用yield关键字,再调用函数就不会执行函数体代码,会返回一个值,该值成为生成器,这个生成器本质上就是迭代器。

def fn():
    print("我是生成器")
    yield 'god'
generator_obj = fn()
generator_obj.__iter__()    # 可迭代对象
print(generator_obj.__next__())    # 迭代器对象  
输出:我是生成器   god
def g_fn():
    print(1111111)
    yield '结果1'
    print(222222222)
    yield '结果2'
    print(33333333)
    yield '结果3'
    print(4444444)
    yield '结果4'
g_obj = g_fn()

# 在函数内部执行一次,在遇到下一个yield时停止,且可以拿到yield的返回值
r1 = g_obj.__next__()
print(r1)
输出:1111111
输出   结果1
# # 从上一次停止的位置紧接着往下,在遇到下一个yield时停止,且可以拿到yield的返回值
r2 = g_obj.__next__()
print(r2)
输出:222222222
输出:结果2
r3 = g_obj.__next__()
print(r3) 
输出:33333333
输出:结果3   
====================
如果继续输出超过定义函数的个数就会报错,可以通过try捕获异常解决,或者通过for循环解决
for v in g_obj:
print(v)

输出:

  1111111
  结果1
  222222222
  结果2
  33333333
  结果3
  4444444
  结果4

# 生成器的应用案例
# 当访问的数据资源过来,可以将数据用生成器处理,有一次只能获取所有内存的一条资源
def my_rang(min, max=0,step=1):
    if max == 0:
        min, max = max, min
    tag = min
    while True:
        if tag >= max:
            break
        yield tag
        tag += step
range_obj = my_rang(5,10,3)
for i in range_obj:
    print(i)
输出值:
5
8

 

posted @ 2020-07-14 22:49  阳光与叶子  阅读(140)  评论(0编辑  收藏  举报