# 生成器 generator
# 生成器指的是生成器对象, 可以由生成器表达式得到,或者由生成器函数得到
# 生成器对象, 是一个可迭代对象, 是一个迭代器
# 生成器对象是延迟计算, 惰性求值
# 1 由生成器表达式得到
# m = (i for i in range(5))
# print(m, type(m)) #<generator object <genexpr> at 0x00000000003762E0>
# print(next(m))
# print(next(m))
# print(next(m))
# print(next(m))
# print(next(m))
# 普通函数调用,函数会立即执行直到执行完毕
# 这里 需要调用 next 驱动生成器对象
# 或者使用 for 循环驱动
# 2 由生成器函数得到
# 一个函数体中 只要包含 yield 语句, 它就是一个生成器函数。
#调用后返回一个生成器对象
def foo():
for i in range(5):
yield i # 碰见 yield 会暂停函数, 把后面的值返回
# print(foo()) # <generator object foo at 0x00000000001862E0>
# g = id(foo())
# print(g)
# g = foo()
f = foo()
# print(id(g), id(f)) # 垃圾回收机制 1,某个变量的引用计数为0的化,就可以进行垃圾回收(回收这个变量的内存),
# 2, 如果程序执行完毕,所有的变量,函数,类。。全部会被垃圾回收。
print(next(f))
print(next(f))
print(next(f))
def foo2():
print('$1')
yield 1
print('$2')
yield 2
print('$3')
yield 3
return 4
yield 5
f2 = foo2()
print(next(f2))