对Python中Yield的理解

欢迎大家光临我的个人博客:chenjingjiu.cn,大家一起交流学习

看到下面这段程序的时候,有点不明白这个yield到底是个啥东西,看了网上很多的博客,大致理解了yield的含义,所以记录下来。

a6f64fad55e3019b2d7253698ba0f6fe.jpeg
a4416cf02187d80c741a3e93ad6a803e.jpeg


要说yield首先要说python中的生成器,那么什么是生成器?

假设有一个包含一百万个元素的列表,我们每次只需要这个列表中的一个元素。如果程序一开始就创建该列表的话,无疑要浪费大量存储空间。所以如果列表中的元素能够以某种方法推导出来,我们就可以根据程序的需要对列表元素进行生成,进而节省大量存储空间。这种一边循环一遍计算的机制,就是生成器。

那么yield和生成器有什么关系?

如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是变成了一个生成器。

066840445a0edd7f285def50a5a14248.png
54c5b69fd18938cf4cfa67678d400bdf.png


此时a是一个函数,而a()则是一个生成器对象。我们用下面的程序来看看yield函数到底怎么用。

ef03f3869332c466824614ba4a78d158.jpeg
format,png


程序开始时,初始化一个生成器a=a(0),然后通过next方法循环打印生成器中的元素。生成器中的yield其实就相当于一个断点,每次程序执行到一个yield,就将其后的值当做生成器的一个元素。然后再次调用next方法,就从yield之后继续运行,直到运行到程序结束。

从上面的程序来看,首先定义生成器对象a,然后进入主程序循环:

第一次调用next:进入a(i)内部,首先打印‘func a is running’,然后进入生成器循环。打印‘in circle’,表示当前生成器进入循环中,然后碰到yield i。此时将i的值作为第一个元素返回给生成器a,然后结束next方法,打印20个‘=’。

第二次调用next:从上次的yield处继续执行,首先会打印一个‘step 1’,然后i++,然后又是一个yield,此时再次将i的值作为生成器的下一个元素进行返回,然后结束next方法,打印20个‘=’。

第三次调用next:再次从上次的yield处继续执行,首先打印一个‘step 2’,然后注意此时由于i的值为1,满足生成器循环的条件,因此会打印‘in circle’,然后继续向下执行。

第四、五、六次调用next:与上面保持一致。

第七次调用next:从yield处向后执行,会首先打印‘step 2’,然后此时i=3,不满足生成器循环条件,于是打印‘out circle’,然后打印i的值。

第八次调用next:由于此时生成器无下一个元素,程序会抛出StopIteration异常,然后结束整个程序的运行。

最后要说一下python2中的range和xrange。

Python2中,range是一个内建的函数,用于生成一个列表。而xrange则为一个生成器,循环时不断生成元素。Python3时就将内建的range改成了xrange,只不过名字没变。

4c75284b34109e264f799090482eb86d.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
yield函数是一个生成器(generator),它可以用于迭代。在函数yield类似于return,不同的是,yield返回一个值并且记住这个返回值的位置,下次迭代就从记住的位置开始执行,并且从上一次迭代遇到的yield后面的代码开始执行。 yield函数的优点在于它可以减少内存的消耗,因为它不直接生成返回值。相比使用return返回值或者迭代大量数据,yield函数能够更好地减少内存消耗。然而,由于yield函数只能读取一次,所以它的特点是只能迭代一次。 yield函数不仅可以用于for循环,还可以作为函数参数。例如,可以将yield函数作为其他函数的参数传递,实现更加灵活的功能。 除了next()函数之外,还有一个特别的函数叫做send()函数。send()函数的特点是可以携带参数,并且可以修改上一个yield表达式的值。使用方式与next()函数有很多相似之处。<span class="em">1</span><span class="em">2</span><span class="em">3</span><span class="em">4</span> #### 引用[.reference_title] - *1* *2* *3* *4* [Python|yield的解析及用法](https://blog.csdn.net/gschen_cn/article/details/107293784)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值