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 关键字:代码示例
现在让我们讨论一些实现 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 的函数,它接受两个字符串作为输入。然后使用带有 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 整除,则该函数将返回字符串“可以被三整除”,而不是打印 3 作为数值。对于可以被 10 整除的数字也是如此。
输出
以下代码的输出将是
1 2 divisible by 3 4 5 Divisible by 3 7 8 divisible by 3 divisible by 10
结论
在本文中,我们讨论了生成器中的 yield 关键字,它是什么,它是如何工作的,以及 yield 关键字和生成器的优点,还讨论了两个不同的代码示例来实现它。本文将帮助读者了解 yield 关键字背后的核心思想,并帮助读者在需要时将相同的概念应用于编写高效代码。