顾乔芝士网

持续更新的前后端开发技术栈

DAY4-step9 Python的yield:yield和return的区别

Python的yield是什么?

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 是什么?

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

如何从generator读取值?

您可以使用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是一次性使用

如果是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:  []

如果您希望再次使用输出,则必须再次调用该函数。

何时在Python中使用Yield而不是Return

Python3 Yield执行时,并没有立刻返回,而是将一个返回值送给generator函数,结束执行后,可以在调用者使用循环获取全部的返回值。

函数的return是函数执行的结束,并且将单个值返回给调用方。

在这种情况下,您应该使用Yield而不是Return

  • 当需要返回的数据量很大时,使用yield而不是return
  • 当您需要更快地返回大型数据集时,Yield是最佳选择
控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言