python中的yield关键字类似于return,区别在于yield不返回值,而是返回一个generator给调用方。
yield expression
描述
Python yield返回一个generator 对象。 Generators 是特殊的函数,必须对其进行迭代才能获取值。
示例:Yield 方法
这是一个简单的yield示例。 函数testyield()的yield语句,参数为“ Welcome to Guru99 Python Tutorials”。 执行到yield函数时,会把输出送给generator对象,而不是返回实际值给调用者。
def testyield():
yield "Welcome to Guru99 Python Tutorials"
output = testyield()
print(output)
Output:
<generator object testyield at 0x00000028265EB9A8>
输出送给了generator对象,但是我们没有得到想要的输出!
要打印给出yield的消息,将必须迭代generator对象,如下例所示:
def testyield():
yield "Welcome to Guru99 Python Tutorials"
output = testyield()
for i in output:
print(i)
Output
Welcome to Guru99 Python Tutorials
Generators是返回可迭代generator对象的函数。 一次获取一个generator对象,因此要获取实际值必须循环获取。
def testyield():
yield "H"
yield "E"
yield "L"
yield "L"
yield "O"
test = testyield()
for i in test:
print(i)
Output:
H
E
L
L
O
您可以使用list(),for循环和next()方法从generator对象读取值。
使用list()
列表是一个可迭代的对象,其元素放在方括号中。在generator对象上使用list()将提供generator持有的所有值。
def even_numbers(n):
for x in range(n):
if (x%2==0):
yield x
num = even_numbers(10)
print(list(num))
Output:
[0, 2, 4, 6, 8]
使用for循环
在示例中,有一个函数定义了even_numbers(),它将为您提供所定义n的所有偶数。 调用函数even_numbers()将返回一个generator对象,该对象在for循环内使用。
Example:
def even_numbers(n):
for x in range(n):
if (x%2==0):
yield x
num = even_numbers(10)
for i in num:
print(i)
Output:
0
2
4
6
8
使用:next()
next()方法将为您提供列表,数组或对象中的下一项。 一旦列表为空next()将返回一个带有stopIteration信号的错误。
def even_numbers(n):
for x in range(n):
if (x%2==0):
yield x
num = even_numbers(10)
print(next(num))
print(next(num))
print(next(num))
print(next(num))
print(next(num))
print(next(num))
Output:
0
2
4
6
8
Traceback (most recent call last):
File "main.py", line 11, in <module>
print(next(num))
StopIteration
如果是generator,则只能使用一次。 如果尝试再次使用它们,它将为空。
示例
def even_numbers(n):
for x in range(n):
if (x%2==0):
yield x
num = even_numbers(10)
for i in num:
print(i)
print("\n")
print("Calling the generator again: ", list(num))
Output:
0
2
4
6
8
Calling the generator again: []
如果您希望再次使用输出,则必须再次调用该函数。
Python3 Yield执行时,并没有立刻返回,而是将一个返回值送给generator函数,结束执行后,可以在调用者使用循环获取全部的返回值。
函数的return是函数执行的结束,并且将单个值返回给调用方。
在这种情况下,您应该使用Yield而不是Return