Python 生成器 【generator,特殊的迭代器】
# 2.生成器[generator] 是一种使用普通的函数语法定义的迭代器 【关键字 yield】
def fn(): print("fn 执行了~~") n1 = 10 yield n1 print("fn yield after ~~") fn() # 生成器函数在调用时,不会立即执行,而是返回一个生成器的对象 fn_g = fn() print(fn_g) print(next(fn_g)) # 函数会在对生成器进行遍历时才会执行, 且只会执行到yield 并把yield后的值 返回 def fn_y(): print("fn_y 执行了 ~~") n2 = 0 while True: print("yield before ~~") yield n2 print("yield after ~~") n2 += 1 if n2 == 10: break fn_y_g = fn_y() # print(next(fn_y_g)) # print(next(fn_y_g)) # print(next(fn_y_g)) # for i in fn_y_g: # print(i)
# 使用生成器 实现 斐波那契数列 --> 第三个数总是等于前两个数之和 【由兔子生小兔子提出】
def fib(count): """ 用来生成斐波那契数列 :return: """ a = 0 b = 1 start = 0 while start < count: yield a a, b = b, a+b # 加 逗号变为元祖了, 即解构赋值 start += 1 fb_g = fib(10) # 注意:生成器函数每次调用都生成一个新的生成器对象,所以调用一次即可获取其中的数据,不需要调用多次 print("fib start .....") for i in fb_g: print(i)
# 可以给生成器 发送消息来控制生成器的执行,即可以使用变量来接收 yield的返回值,默认总会返回None
# 生成器中send() 方法可以用来执行生成器,作用相当于next(), send方法可以在执行生成器的同时,向生成器传递yield的返回值,来控制其执行
def fib_receive_arg(): a = 0 b = 1 while True: info = yield a a, b = b, a+b print("info ==", info) if info == 0: break print("fib test receive argument ...") fib_receive_arg_g = fib_receive_arg() print(fib_receive_arg_g.send(None)) print(fib_receive_arg_g.send(1)) print(fib_receive_arg_g.send(1)) print(fib_receive_arg_g.send(1)) print(fib_receive_arg_g.send(3)) print(fib_receive_arg_g.send('hello')) print(fib_receive_arg_g.send(9)) print(fib_receive_arg_g.send(0))