Python 中的 Yield 关键字
简介
在 Python 中,"yield"是一种在使用生成器时使用的关键字。与 Python 中的普通或经典函数不同,生成器使用关键字"return"返回输出或值。
在本文中,我们将讨论 Python 中的 Yield 关键字,它是什么,它如何工作,它的意义是什么,以及它在 Python 中的实现。本文将帮助人们理解 Python 中的 Yield 关键字,并帮助人们在必要时使用和实现它。
因此,让我们开始讨论 Yield 关键字背后的核心思想。
什么是 Yield 关键字?
在 Python 中,生成器是一种函数类型,主要用于迭代过程。顾名思义,这些函数在调用时会动态生成值或输出,这意味着它像迭代器一样工作,并连续生成值,而不会停止。
与 Python 中的常规函数相同,其中 return 关键字用于从函数获取输出,对于生成器,yield 关键字用于生成临时输出,其中生成器函数的执行暂时停止,可以稍后继续。
在 Python 中,当生成器函数被定义为执行与迭代过程相关的某些任务时,会使用 next 关键字,其中输出或值是连续生成的,并且函数继续生成下一个值。一旦遇到yield 关键字,函数就会从那里停止,在这里函数会保存生成器的当前状态,然后停止。
请注意,当生成器函数再次恢复或再次执行时,值将从停止的地方开始生成,而不是从开始处开始,因为函数在遇到yield 关键字时会保存其状态。
简而言之,yield 关键字可以被认为是 generator 关键字的中断,生成器在此关键字之后停止并保存其进度,这在正常或常规函数中是不会做的。
Yield 函数的优点
yield 函数与生成器函数一起使用时具有几个优点。让我们一一讨论。
更快的处理
众所周知,生成器是一种不断生成值的函数。借助 Yield 关键字,我们可以更快地对生成器执行操作。它允许生成器立即为大型数据集生成值。
无限输出
将 Yield 关键字与生成器一起使用,我们可以生成无限的值或输出,因为这是一个迭代过程。
效率
如上所述,yield 关键字有助于更快地为生成器函数生成值。yield 关键字无需加载整个数据,然后在请求时生成相同的数据,而是有助于生成和处理相同的数据,而无需任何加载过程。
可扩展代码
在为迭代过程编写代码时,代码很有可能出现混乱且不可扩展的情况,生成器的 Yield 关键字有助于编写高效且可扩展的代码,这些代码也易于理解和解释。
使用 Yield 关键字:代码示例
现在让我们讨论一些实现 Yield 函数的代码示例,以明确其背后的想法。
示例 1:生成数字的平方
让我们尝试实现生成器函数,其中将编写代码来获取数字的平方。由于我们将在这里使用生成器,因此值将继续生成。
# 定义生成器函数来对数字进行平方 def square_of_numbers(n): for i in range(1, n + 1): yield i ** 2 # 调用上面定义的生成器函数 squares_gen = square_of_numbers(7) # 七个数字的平方将打印在输出中 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() # 定义要连接的两个字符串 # 此外,在生成器函数的帮助下应用过滤器后,使用 join 函数连接字符串 string1 = "TutorialsPoint, is good?" string2 = "123 for tutorials! 456" result = "".join(adding_strings_with_filter(string1, string2)) print(result)
如我们在上面的代码示例中所见,我们定义了名为 add a string with filter 的函数,该函数以两个字符串作为输入。然后使用带有yield关键字的两个循环来获取相应的字符串,并且在每个循环结束时,yield关键字返回一个包含非字母大写字符的字符串。
最后,使用常规连接函数添加来自生成器的字符串输出。
输出
以下代码的输出将是:
TUTORIALSPOINTISGOODFORTUTORIALS
示例 3:具有自定义逻辑的生成器函数
现在让我们举一些使用生成器和yield关键字的独特示例,在这里我们将定义一个函数,它将返回循环中某些值的特定字符串值。
# 定义生成器函数 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 # 调用上面定义的生成器函数 seq_gen = custom_logic_generator() # 使用上面应用的生成器逻辑逐个列表生成数字 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 关键字背后的核心思想,并帮助人们在必要时将相同的概念应用于编写高效的代码。