【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