0%

python中return和yield

return语句

在函数中,return语句就意味着整个函数的终止并返回一个值,返回之后函数就不继续往下执行了

yield语句

而在函数中,如果是通过yield语句返回,那么yield会返回一个值,返回之后函数还可以继续往下执行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
def test(n):
print("I am test yield start *****")
while True:
res = yield n
print("res:", res)


# 在此处,通过调用test(10)时,实际上python解释器没认为它是可以执行的
# 因为test函数当中有yield关键字,因此python认为该函数是一个迭代器,只有通过next函数或者__next__方法才能正常调用执行该函数
# test函数返回的是generator的迭代器对象
g = test(10)

# 通过next函数调用迭代器对象,正常执行test函数
# 首先执行print函数打印I am test yield start *****
# 然后进入while True函数
# 通过yield返回了一个10
# print(next(g))打印了这个返回值10
print(next(g))
# I am test yield start *****
# 10
print("")

# 继续通过next函数调用迭代器对象,执行test函数
# 此时函数会执行res print("res:" res)
# 因此时res没有值,故执行结果为res: None
# 然后函数进入while True循环
# yield返回了10
# print(next(g))打印返回值10
print(next(g))
# res: None
# 10

yield和return的区别

带yield关键字的函数是一个生成器,而不是一个函数。这个生成器有个next函数,相当于“下一步”的函数,这一次的next是默认从上一次next停止的地方继续执行,所以调用next函数的时候,生成器并不会从foo函数开始执行,只是接着上一步停止的地方开始执行,遇到yield后,return了一个此步生成的数据,此步就结束了

send函数

send函数的主要功能是给生成器传递一个初始参数值,使得生成器可以拿到这个值,并将它赋值给yield开始的位置,然后继续单步执行一次

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
def test(n):
print("I am test yield start *****")
while True:
res = yield n
print("res:", res)


g = test(10)

print(next(g))
# I am test yield start *****
# 10
print("")

print(g.send(20))
# res: 20
# 10