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)) 

 

 
posted @ 2022-08-12 11:26  以赛亚  阅读(108)  评论(0编辑  收藏  举报