Python yield关键字
在Python中,”yield”是一种关键字,用于与生成器一起使用。与Python中的普通或经典函数不同,普通函数使用关键字”return”返回输出或值,而生成器使用”yield”关键字进行相同的操作。
在本文中,我们将讨论Python中的yield关键字,它是什么,它是如何工作的,它的重要性以及在Python中的实现。本文将帮助人们理解Python中的yield关键字,并在必要时帮助人们使用和实现相同。
所以让我们从yield关键字背后的核心想法开始讨论。
什么是yield关键字
在Python中,生成器是一种用于迭代过程的函数类型。顾名思义,当调用时,这些函数会即时生成值或输出,这意味着它像迭代器一样连续生成值,而不会停止。
与Python中的常规函数相同,常规函数使用return关键字从函数中获取输出,在生成器的情况下,使用yield关键字生成临时输出。生成器函数的执行在临时基础上停止,并且可以在以后继续执行。
在Python中,当定义生成器函数执行与迭代相关的某些任务时,使用next关键字,连续生成输出或值,并持续生成下一个值。一旦遇到yield关键字,函数就会在那里停止,这里函数保存了生成器的当前状态,然后停止。
请注意,当生成器函数再次恢复或再次执行时,值将从其停止的位置开始生成,而不是从起始点开始,因为在遇到yield关键字时函数保存了其状态。
简而言之,yield关键字可以被视为生成器关键字的断点,生成器在此关键字之后停止并保存其进展,这在普通或经典函数中是不会做的。
使用yield函数的优势
当与生成器函数一起使用时,yield函数提供了几个优势。让我们逐一讨论。
更快的过程
正如我们所知,生成器是一种连续生成值的函数类型。借助yield关键字,我们可以更快地对生成器进行操作。它使生成器能够立即为大型数据集生成值。
无限输出
使用yield关键字和生成器,我们可以生成无限的值或输出,因为它是一个迭代过程。
效率
如前所述,yield关键字有助于为生成器函数更快地生成值。它帮助生成和处理数据,而不需要加载整个数据。
可扩展的代码
在编写迭代过程的代码时,代码很容易混乱并且不可扩展。生成器的yield关键字有助于编写高效且可扩展的代码,这易于理解和解释。
使用yield关键字:代码示例
现在让我们讨论一些用于实现yield函数的代码示例,以清楚地理解其原理。
示例1:生成数字的平方
让我们尝试实现生成器函数,我们将编写一段代码来获取数字的平方。由于我们将在这里使用生成器,值将持续生成。
# define the generator function to square the numbers
def square_of_numbers(n):
for i in range(1, n + 1):
yield i ** 2
# Call the generator function defined above
squares_gen = square_of_numbers(7) #squares of seven numbers will be printed in the output
for square in squares_gen:
print(square)
如图所示,上面的代码示例定义了一个名为 square generator 的函数,它使用 for 循环迭代这些值,并在最后使用 yield 关键字来获取这些值的平方。 由于我们调用了传递 7 作为输出的函数,所以该函数将给出七个不同的输出,对应于所给值的平方。 输出如下所示:
1
4
9
16
25
36
49
示例2:使用过滤器添加字符串
现在让我们来看一个字符串的例子。在这里,我们将把字符串作为输入,并使用带有yield关键字的生成器函数来通过应用一些过滤器来添加相应的字符串。
def adding_strings_with_filter(str1, str2):
for char in str1:
if char.isalpha():
yield char.upper()
for char in str2:
if char.isalpha():
yield char.upper()
# Define the two strings to concatenate
# Also, use the join function to join the strings after applying the filter with the help of generator function
string1 = "TutorialsPoint, is good?"
string2 = "123 for tutorials! 456"
result = "".join(adding_strings_with_filter(string1, string2))
print(result)
在上述代码示例中,我们定义了一个名为add_string_with_filter的函数,该函数通过使用filter将两个字符串作为输入。然后使用yield关键字使用两个循环来获取所需的字符串,在每个循环结束时,yield关键字返回一个具有非字母大写字符的字符串。
最后,使用普通的join函数将生成器的输出字符串添加起来。
输出
以下代码的输出将是:
TUTORIALSPOINTISGOODFORTUTORIALS
示例3:带有自定义逻辑的生成器函数
现在让我们举一些独特的例子来使用生成器和yield关键字,这里我们将定义一个函数,在循环中为某些值返回特定的字符串值。
# defining the generator function
def custom_logic_generator():
num = 1
while True:
if num % 3 == 0:
yield "divisible by 3" #print divisible by 3
elif num % 9 == 0:
yield "divisible by 3" #print divisible by 3
elif num % 10 == 0:
yield "divisible by 10" #print divisible by 10
else:
yield num
num += 1
# call the generator function defined above
seq_gen = custom_logic_generator()
# generate the numbers one by list with the above applied logic of the generators
for _ in range(10):
print(next(seq_gen))
如上面的代码示例所示,定义了一个函数,它打印从1到10的值。在这里,我们使用yield关键字定义自定义逻辑。例如,如果数字可以被3整除,那么函数将返回一个字符串“divisible by three”,而不是将3打印为数值。与可以被10整除的数字也是一样的。
输出
以下代码的输出将是:
1
2
divisible by 3
4
5
Divisible by 3
7
8
divisible by 3
divisible by 10
结论
在本文中,我们讨论了生成器中的yield关键字,它的作用是什么,如何工作以及yield关键字和生成器的优势,并且讨论了两个不同的代码示例来实现相同的功能。本文将帮助读者理解yield关键字背后的核心思想,并帮助读者在必要时将相同的概念应用于编写高效的代码。