Python 中的 Yield 关键字

pythonserver side programmingprogramming更新于 2024/1/11 20:09:00

简介

在 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 关键字背后的核心思想,并帮助人们在必要时将相同的概念应用于编写高效的代码。


相关文章