# 注意:yield的作用是第一次执行生成器时程序停在yield所在行,并返回yield后的值。
# 第二次执行生成器时,程序会在第一次停止的位置执行 ,以此类推。。。
# send(None) 相当于 第一次 next()的效果
# 斐波那契数列
def create_num():
print("----start----")
i, j = 0, 1
for k in range(5):
yield j
i, j = j, i + j
print("----end----")
def test():
i = 0
while i < 5:
temp = yield i
print(temp)
i += 1
if __name__ == "__main__":
a = [x for x in range(10)]
print(a)
# 如果数据比较多时,就比较占用内存了,所以可以采用生成器
# 生成器的创建方式一
b = (x for x in range(10))
print(b) # <generator object <genexpr> at 0x007AAEB0>
# 获取数据,第二个参数是指定获取对应位置的值
print(next(b, 1)) # 0
print(next(b, 2)) # 1
print(next(b, 3)) # 2
# 注意:如果第二个参数不填,则每执行一次,就获取下一个, 如下:
print(next(b)) # 3
print(next(b)) # 4
print(next(b)) # 5
# 生成器创建方式二:在函数内部使用了yield关键字
create = create_num()
print(create) # <generator object creat_num at 0x0077AE70>
print(next(create)) # 1
print(next(create)) # 1
print(next(create)) # 2
print(create.__next__())
# 遍历生成器
'''
----start----
1
1
2
3
5
----end----
'''
for num in create:
print(num)
# 生成器之send的用法
'''
0
haha
None
2
'''
test = test()
print(test.__next__())
test.send("haha") # 将haha赋给temp
print(test.__next__())