# 注意: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__())