您当前的位置:首页 > 互联网教程

一文搞懂Python中的yield

发布时间:2025-05-13 08:41:13    发布人:远客网络

一文搞懂Python中的yield

一、一文搞懂Python中的yield

1、yield关键字在 Python中有着重要的作用,既可以实现生成器,也可以实现协程。生成器和协程的概念可能对于初学者来说比较抽象,但理解它们的作用和效果是至关重要的。

2、首先,我们来看看 yield的英文单词的意思。yield在英语中的意思是“出产(作物);产生(收益、效益等);提供”。这个词语的含义可以帮助我们更好地理解 yield在 Python中的作用。

3、在初学 Python的时候,我对于 yield关键字的认知仅仅停留在它是一种特殊的 return,能够理解其用法即可。自己很少使用,也就没有深入研究过。然而,当我需要处理大量数据,数据的大小甚至超过了电脑的可用内存时,我开始重新审视 yield的作用。

4、比如,在操作 db2数据库查询数据时,当数据结果很大时,我不想一次性将所有数据读入内存,这时我会使用 yield关键字来返回一行数据,程序处理完后,再取下一行。这种做法可以有效地节省内存空间。

5、关键字 yield的用法是,它返回了一个值,但程序并未退出,下一次从 yield后面的代码继续运行,直到后面没有代码,结束运行。下面我们通过一个简单的例子来看一下其效果:

6、通过上面的例子,我们可以发现,yield关键字自动为我们生成了私有方法 __next__,这样就不会将所有数据取出来存入内存中,用多少取多少,可以节省内存空间。

7、除了节省内存空间外,yield在数据量较大时,执行速度也会提升。在 Ipython终端中执行上述代码,我们可以看到使用 yield的函数执行速度更快。

8、yield是自己实现一个生成器最便捷的方式。Python语言的生成器是最有用的特性之一,但使用不广泛。我曾问过周围使用 Java的朋友是否有类似的特性,他们回答说没有,网上搜了一下,确实主流的编程语言都没有。因此,Python的生成器特性没有引起其他语言转 Python的工程师的关注。

9、生成器非常有用,尤其是在处理大量数据时。当你需要处理的数据大小超过你电脑的可用内存时,生成器的懒加载(用的时候才读入内存)就非常有效。

10、比如,在读取文件时,如果你一次性读取很大的文件,可能会让内存一下子就满了。推荐的做法是使用文件本身的生成器,这样读多大的文件,也不会撑爆内存。

11、想深入学习生成器、迭代器、可迭代对象,可以看我以前的推文:《python基础系列--可迭代对象、迭代器与生成器》、《深入理解迭代器和生成器》。

12、yield关键字还可以实现协程。虽然现在有 asyncio和 await关键字来方便地实现协程,但在之前,实现协程就靠的是 yield。

13、yield有一个 send方法,可以改变 yield的返回值。下面是一个示例代码:

14、第一次执行 x的 next方法时,函数执行到第一个 yield处,打印了 a返回了值 1,此时变量 a并未获取到 yield的返回值,a为 None。当执行 x.send(4)时,a才获取到值 4,程序运行到第二个 yield处,后续过程也是一样。

15、利用这一特性,我们可以和被调用的函数通信,进而可以实现一个生产者消费者模型。下面是示例代码和运行结果:

16、produce和 consume函数在一个线程内执行,通过调用 send方法和 yield互相切换,实现协程的功能。

17、关于协程的学习,可以看我以前的推文:《协程学习笔记》、《并发时用多线程还是协程?》。

二、编程中yield是什么意思

1、在编程中,yield是一个特殊的关键字,用于在代码执行过程中让出处理器的控制权给其他任务。这允许程序在执行耗时较长的操作时,不会阻塞整个程序的运行,而是将控制权暂时转移给其他应用或图形对象。

2、具体而言,当yield被调用时,程序会检查消息队列,如果有待处理的消息,yield会取出并处理这些消息。这使得程序在等待某个耗时操作完成(如网络请求、数据库查询等)时,能够响应用户界面或其他实时操作,保持程序的可用性和交互性。

3、yield的使用场景广泛,特别是在多线程或多进程编程中,为了确保程序的响应性和资源的合理分配,合理地使用yield至关重要。它允许程序在执行关键任务时,不会忽略或影响用户的其他操作或请求。

4、值得注意的是,yield的功能不仅局限于PowerBuilder这样的特定编程环境,它在许多其他编程语言和框架中都有对应的实现,比如Python的yield关键字、JavaScript的async和await机制等。这些机制旨在解决并发执行、异步调用和资源管理等问题,使得编程者能够更高效地开发复杂的应用程序。

5、总之,yield是一个强大的工具,它帮助程序员在编写程序时考虑程序的并发性和响应性,确保程序在执行耗时操作时仍能保持对用户请求的响应,从而提升用户体验和程序的性能。

三、yield 是什么意思

1、yield是英语单词,中文意思是“产出、产量、收获等”。在计算机编程中,yield关键字表示“产出”一个值,并在调用这个函数或方法的程序中做出相应响应。yield可以返回一系列的值给调用者,而这个过程可以通过迭代器(iterator)来进行,即每一次yield会暂停函数并返回一个值,但不会退出函数。当再次调用函数(即调用next()方法)时,yield会从暂停的那个地方继续执行,返回下一个值。

2、yield通常在定义生成器函数的时候使用,在生成器函数内使用yield,可以使函数具有迭代器的特性。当生成器函数被调用时,实际并不会执行函数内部的语句,只是返回一个迭代器对象。每次调用迭代器的next()方法时,才会执行一次函数内的语句,并在执行完yield语句时返回产出的值。利用yield,我们可以避免重复执行一些常规的迭代处理逻辑,从而提高程序的执行效率。此外,yield还可以实现协程、控制流等功能,是Python语言中非常有用的特性。

3、yield与return有一些相似之处,都可以返回一个值。但是它们之间又有明显的区别:yield可以使函数变成一个生成器来迭代产生多个值,而return只能返回一个值并结束函数的执行。另外,当执行到return语句时,函数已经结束,无法再次调用并继续执行;而yield只是暂停函数的执行,可以在下一次调用时继续执行。需要注意的是,当使用yield语句时,不要再使用return语句,因为yield已经返回了结果,再使用return会引发异常。