Python 中的yield关键字
当我们编写一个应该执行一些操作并返回一些结果的函数时,我们通常使用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)
简单的函数调用:
关于yield关键词需要记住的几点
把yield关键词想象成一个聪明的return语句,它会记住上一次做了什么,并在下一次继续。
就像上面的counter()函数,我们第一次调用的时候,它会返回 0 ,但是我们下一次调用的时候,它会递增x的值,然后返回 1 ,然后我们再调用一次,它会再次递增x的值,并重新运行结果 2 等等,直到循环完成。
- 当我们使用
yield关键字从一个函数返回数据时,它开始存储局部变量的状态,结果节省了连续调用中变量的内存分配开销。 - 此外,在连续调用中,流程从执行的最后一个
yield语句开始,这节省了时间。 - 我们可以使用
yield关键字轻松创建可迭代函数。
该举些例子了!
如上所述,通过使用yield关键字,我们使我们的函数可迭代。我们知道,对于可迭代的,我们可以使用next()方法迭代到下一个元素。让我们在第一个例子中实现它。
例 1:
在上面的例子中,我们使用了多个yield语句来保存函数(或生成器)new_gen()的执行状态,以便下次调用该函数时,执行从上次离开的地方开始。
尝试在上面的代码中再添加一条print(next(x))语句,您将看到StopIteration异常,当没有更多数据需要迭代时,迭代器会返回该异常。
例 2:
在这个代码示例中,我们将在函数中使用yield关键字来计算一个单词在句子中的出现次数。
在上述问题中使用yield关键字将帮助我们简化在单词列表中搜索单词的代码,同时增加计数,因为yield关键字将记住最后的状态,因此它不会迭代已经检查过的单词。
同样的yield关键字也有很多用例。在下一个教程中,我们将学习生成器,这是我们使用yield关键字的函数。在上面的代码示例中,count_words是一个生成器。