生成器yield,next()與send()

GDquicksand發表於2024-09-13
# 把a建立成了一個生成器物件 generator object
a = (x * 2 for x in range(10))
print(a)
print(next(a))  # 生成器物件呼叫用next(a),等價於 a.__next__(),生成器一次呼叫一個
print(next(a))

for i in a:  # 生成器是一個可迭代物件
    print(i)


# 建立生成器的第二種方式
def f():
    print("第一次呼叫")
    yield 1
    print("第二次呼叫")
    yield 2


# 也可以用next()方法呼叫生成器
for f in f():
    print(f)


# 什麼是可迭代物件:就是物件可以被__iter__()這種方式呼叫的都是可迭代物件


# 斐波拉切生成器
def fbo(f_max):
    n, f_a, f_b = 0, 0, 1
    while n < f_max:
        # print(f_a)
        yield f_a
        f_a, f_b = f_b, f_a + f_b
        n += 1


fbo = fbo(10)
for i in fbo:
    print(i)


# 生成器中send()的應用

def f_send():
    print("第一次呼叫")
    ser = yield 1
    print(ser)
    print("第二次呼叫")
    yield 2


# 使用send()第一次必須值為Nome,send可以在生成器yield前傳引數,send是從程式執行上一個yield結束時開始執行
f_send = f_send()
f_send.send(None)
f_send.send("AAAAAA")

相關文章