Python中的yield关键字
Python中的许多工具能够为程序员提供便利。yield关键字就是其中之一。在典型的Python进程中,yield关键字可以用来替代return语句。本文将介绍yield关键字、在生成器函数中的使用、return语句和yield语句之间的区别,以及在何种情况下可以使用yield语句替代return语句。
Python中的yield关键字是什么
Python中的yield关键字类似于我们用于返回表达式或对象的另一个关键字,通常在函数中使用,称为return。但是存在一点小差异。函数的yield语句不仅仅返回一个值给调用该语句的函数,而是返回一个生成器对象。
当调用程序中的函数遇到yield语句时,Python解释器会暂停执行函数,并向调用者返回一个生成器对象。
换句话说,传递给yield关键字的任何表达式将被转换为一个生成器对象,并随后返回给调用者。因此,为了获取这些值,我们必须反复访问生成器对象。
请注意,生成器函数是使用yield关键字的函数。yield关键字不会破坏局部变量的状态。每次调用函数时,最近的yield表达式将作为执行的起点。
每次使用return语句调用函数时,都会创建新的变量。如果使用生成器函数代替普通函数,函数的执行将从上次暂停的地方继续。
为了通过一个函数返回多个值,我们可以结合使用生成器函数和yield关键字。yield表达式可以返回多个值。它们返回一个值,暂停执行,保存所述变量的局部状态,然后从暂停的地方继续执行。
Python中yield关键字的语法
def function():
yield < expression > # writing an yield statement
print( function )
Python生成器函数的概述
与Python中只返回单个表达式的常规函数相比,生成器函数返回一个被称为生成器对象的可迭代对象。我们可以使用简单的Python循环、next()或list()等方法,或者逐个访问保存在生成器对象中的变量来访问或读取生成器函数的值。我们使用def关键字来创建生成器函数。下面给出的示例很好地说明了这一点。
使用yield关键字的生成器函数示例
当我们调用这些函数时,将打印特定的字符串。
代码
#Python program to demonstrate the use of the yield keyword with the generator function.
# A generator function's definition
def generator_func():
yield "Yield"
yield "Keyword"
yield "in"
yield "Python"
# constructing a generator object and calling the generator function
generator_object = generator_func()
print( type(generator_object) ) # printing the generator object's type
for i in generator_object:
print( i )
输出:
<class 'generator'>
Yield
Keyword
in
Python
我们在程序中创建了一个简单的生成器函数,并利用多个yield表达式返回多个值,然后将其保存在我们创建的生成器对象中。然后可以通过循环遍历该对象,在控制台上显示该生成器函数中包含的值。
排序奇怪的数字,使用yield关键字
让我们创建一个全新的生成器函数,利用yield命令。从一个整数列表中,我们将尝试删除任何奇数。还可以使用多种方法输出存储在生成器对象内的信息,包括list()、for-in和next()。
# Python program that uses the generator function to demonstrate the use of the yield keyword
# A generator function's definition
def filtering_odd( numbers ):
for num in range( numbers ):
if num % 2 != 0:
yield num
# using the generator function, declaring a generator object, and supplying a value
odd_num = filtering_odd( 34 )
print(list( odd_num ))
输出:
[1, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33]
函数如何通过yield调用
通过yield,我们可以调用函数而不仅仅返回值。例如,想象一下,我们创建了一个名为square()的函数,当调用它时,它会返回给定数字的平方。在这段代码中使用了return这个术语。另一个函数square()使用关键字yield来提供一系列整数的平方。在这种情况下,我们可以将yield表达式与square()函数结合起来创建一个简单的程序。在下面的部分,查看示例代码。
代码
# Using a yield statement, invoke a function in Python
# adding the return keyword to a function definition
def square( number ):
return number**2
# using the yield keyword while defining a function
def range_square( range_of_numbers ):
for num in range(range_of_numbers):
yield square( num )
# using the function and providing arguments
squared = range_square( 8 )
print( list( squared ) )
输出:
[0, 1, 4, 9, 16, 25, 36, 49]
返回关键字 return 与 yield 关键字的区别
在Python中,yield关键字与用于返回值的return关键字类似,但不同的是使用yield关键字的生成器函数返回的是一个生成器对象,而不仅仅是一个值。Python中终止函数执行的返回关键字是它们的主要区别。然而,yield关键字会延迟函数的执行。另一个区别是,在return关键字之后的语句永远不会被执行。而yield语句则会在函数继续运行时执行。
何时使用yield而不是return关键字
yield关键字会停止函数的执行,返回一个值,并保留足够的状态,以便生成函数可以在yield停止的地方恢复执行。当执行继续时,函数会从上一个yield执行继续执行。这使得程序能够随着时间输出一系列的值,而不是同时计算并将其作为列表数据类型返回。
使用yield的优点
- 由于它保留了局部变量的状态,内存分配负载得到控制。
- 由于保留了先前的状态,程序不必重新启动,节省了时间。
使用yield的缺点
- 函数必须正确调用。否则,使用yield可能偶尔不准确。
- 时间和存储优化会导致代码复杂性增加,其合理性往往难以说明。
# A Python program that illustrates the distinction between the yield and return keywords
# using the return keyword while defining a function
def square_root( number ):
return number**(1/2)
# using the return keyword while defining a function
def generator_square_root( number ):
for i in range(number):
yield i**(1/2)
# using the functions and feeding them values
print( "Function with return keyword: ", square_root( 9 ) )
print( "Function with yield keyword: ", list(generator_square_root( 9 )) ) # generator object to list object conversion.
输出:
Function with return keyword: 3.0
Function with yield keyword: [0.0, 1.0, 1.4142135623730951]
虽然关键词yield可能会产生多个结果,但return给其调用者一个特定的值。如果我们想要遍历一个系列,但又不想将整个系列保留在内存中,我们必须使用yield。
Python生成器函数使用yield return输出。当一个使用def关键字的生成器函数需要生成一个值时,yield关键字将用于取代return关键字。当yield被用于定义主体时,函数成为一个生成器函数。
return和yield关键字之间的区别列表
Python的yield和return之间的区别如下:
特点 | 生成器函数 | 普通函数 |
---|---|---|
定义 | 当调用生成器函数时,yield关键字返回的所有值组合在一起形成一个生成器对象。代码只有在调用方迭代完成对象之后才开始运行。 | 一旦达到return语句,函数执行终止,并且只返回一个值给我们。 |
函数 | 当调用生成器函数时,会执行初始的yield语句,然后函数结束。然后我们会得到一个包含由yield返回的值的生成器对象。当我们需要访问或迭代这个变量时,会执行下一个yield语句,然后循环重复。 | 普通函数的执行从调用开始,直到达到return语句为止。之后我们会得到返回的值。 |
每个函数的关键字数量 | 我们可以在生成器函数中使用很多yield语句。 | 在普通函数中只能使用一个return语句。 |
存储 | 使用yield关键字时不需要分配任何存储空间。 | 每个返回的值都被分配内存。 |
应用 | 在处理大数据集时非常节省内存。 | 这个关键字适用于较小的数据集。 |
执行 | 使用yield关键字可以加快大数据集的执行时间。 | 因为需要更多的计算,所以较大的数据大小会导致较长的执行时间。 |