【python】yeild

yield

生成器:生成器是一种特殊类型的函数,其可以使用yield语句来实现迭代器,从而逐个地返回一个序列中的值。相比于常规的函数,生成器函数在需要时才会生成下一个结果,避免了一次性产生所有结果的不便,并且可以节约内存空间。生成器可以通过循环或者列表解析式调用,也可以使用内置函数next()来得到下一个值。此外,生成器还支持可以在生成器函数内部通过函数的参数向其传入数据,以及在外部通过函数的send()方法向其发送数据。总之,生成器是Python中非常强大的工具,可以方便地处理大量数据和复杂的问题,同时也有利于提高代码的效率和可读性。

 

yield 关键字用于从生成器函数中返回一个值。执行 yield 语句会将生成器暂停,直到下一次从生成器中请求数据时才会继续执行。可以通过多次调用 next()方法来逐步执行生成器函数,并在每次调用时获取一个 yield 语句返回的值。

send方法:除了可以像next()方法一样调用生成器来获取下一个值外,还可以使用send()方法向生成器中传递一个值,该值会成为yield表达式的结果,然后继续执行生成器。需要注意的是,第一次调用生成器必须使用next()方法或者先发送一个None值,否则无法启动生成器。同时,在生成器代码中,第一个yield语句之前的代码只有在第一次启动生成器时才会被执行。

1.例子

def fibonacci():
    a, b = 0, 1
    while True:
        print("=== start ===")
        yield a
        print("=== end ===")
        a, b = b, a + b
        
f = fibonacci()

输出结果:没有任何输出

 

2. 例子

def fibonacci():
    a, b = 0, 1
    while True:
        print("=== start ===")
        yield a
        print("=== end ===")
        a, b = b, a + b
        
f = fibonacci()
print(next(f))

输出:

=== start ===
0

 

3. 实例

def fibonacci():
    a, b = 0, 1
    while True:
        print("=== start ===")
        yield a
        print("=== end ===")
        a, b = b, a + b
        
f = fibonacci()
print(next(f))
print(next(f))

输出:

=== start ===
0
=== end ===
=== start ===
1

 

 

def fibonacci():
    a, b = 0, 1
    while True:
        yield a
        a, b = b, a + b
        
f = fibonacci()
print(next(f)) # 输出:0
print(next(f)) # 输出:1
print(next(f)) # 输出:1
print(next(f)) # 输出:2

 

2. 例子

def my_generator():
    yield 1
    yield 2
    yield 3

gen = my_generator()
print(next(gen)) # 输出1
print(next(gen)) # 输出2
print(next(gen)) # 输出3

 

3. 例子

import time

def fib(n):
    index = 0
    a = 0
    b = 1

    while index < n:
        sleep = yield b
        print('等待%s秒' %sleep)
        time.sleep(sleep)
        a,b = b, a+b
        index += 1

fib = fib(20)
print(fib.send(None))   # 效果等同于print(next(fib))

输出:

1

 

4.例子:

def my_generator():
    print("start")
    while True:
        value = yield
        print("value:", value)

gen = my_generator()
next(gen) # 启动生成器
gen.send(1)
gen.send(2)

输出:

start
value: 1
value: 2

 

5. 例子

import time

def fib(n):
    index = 0
    a = 0
    b = 1

    while index < n:
        sleep = yield b
        print('等待%s秒' %sleep)
        time.sleep(sleep)
        a,b = b, a+b
        index += 1

fib = fib(20)
print(fib.send(None))   # 效果等同于print(next(fib))
print(fib.send(2))
print(fib.send(2))
print(fib.send(2))
print(fib.send(2))

输出:

1
等待2秒
1
等待2秒
2
等待2秒
3
等待2秒
5

 

参考资料

1. 理解python中的yield关键字

2. Python中yield和yield from的用法

posted @ 2023-06-06 11:11  苏格拉底的落泪  阅读(44)  评论(0编辑  收藏  举报