Python 中的yield关键字

原文:https://www.studytonight.com/python/python-yield-keyword

当我们编写一个应该执行一些操作并返回一些结果的函数时,我们通常使用return语句来返回结果。

python 中的yield关键字也用于从函数中返回值(就像return一样),但是这个关键字也维护函数局部变量的状态,当再次调用函数时,从上次执行的yield语句开始执行。

让我们看一个简单的例子,试着理解yield关键词实际上是做什么的:

def counter():
    x = 0
    while x < 5:
        yield x
        # incrementing the value of x
        x += 1

在上面的代码中,我们定义了一个简单的函数,它有一个while循环,产生x的当前值,然后递增。

首先,当我们在函数中使用yield语句时,该函数被称为 生成器 ,我们将在下一个教程中学习。

生成器生成或产生值,不能像简单函数一样调用,而是像可迭代函数一样调用,即使用循环,例如for循环。

让我们看看这两种情况,

# calling the above function directly
print("Simple function call: ", counter())    # should print 0

# and now lets use a loop to print values
print("Now lets try using a loop:")
for y in counter():
    print(y)

简单的函数调用:现在让我们尝试使用一个循环:0 1 2 3 4


关于yield关键词需要记住的几点

yield关键词想象成一个聪明的return语句,它会记住上一次做了什么,并在下一次继续。

就像上面的counter()函数,我们第一次调用的时候,它会返回 0 ,但是我们下一次调用的时候,它会递增x的值,然后返回 1 ,然后我们再调用一次,它会再次递增x的值,并重新运行结果 2 等等,直到循环完成。

  1. 当我们使用yield关键字从一个函数返回数据时,它开始存储局部变量的状态,结果节省了连续调用中变量的内存分配开销。
  2. 此外,在连续调用中,流程从执行的最后一个yield语句开始,这节省了时间。
  3. 我们可以使用yield关键字轻松创建可迭代函数。

该举些例子了!

如上所述,通过使用yield关键字,我们使我们的函数可迭代。我们知道,对于可迭代的,我们可以使用next()方法迭代到下一个元素。让我们在第一个例子中实现它。

例 1:

在上面的例子中,我们使用了多个yield语句来保存函数(或生成器)new_gen()的执行状态,以便下次调用该函数时,执行从上次离开的地方开始。

尝试在上面的代码中再添加一条print(next(x))语句,您将看到StopIteration异常,当没有更多数据需要迭代时,迭代器会返回该异常。

例 2:

在这个代码示例中,我们将在函数中使用yield关键字来计算一个单词在句子中的出现次数。

在上述问题中使用yield关键字将帮助我们简化在单词列表中搜索单词的代码,同时增加计数,因为yield关键字将记住最后的状态,因此它不会迭代已经检查过的单词。

同样的yield关键字也有很多用例。在下一个教程中,我们将学习生成器,这是我们使用yield关键字的函数。在上面的代码示例中,count_words是一个生成器。