首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

python中的yield关键字详解

python中的yield功能比较强大,什么意思呢?如果一个函数f内使用了yield关键词,那么该函数就可以这样使用:

也就是包含yield关键词的函数可以在for循环中迭代,说到迭代第一印象是包含很多个元素才可以迭代,确实如此。举个更加详细的案例:

需求::

你需要产生一个按照特定规则增减的序列,比如最简单的递增序列:1,2,3.....1000000,第一印象是可以把产生号的序列放到list中,使用的时候直接取值就好,但是这种做法有个致命的缺点,即需要预先存储这些序列,这会耗费大量的内存,那么有没有更好的方法呢?

这是yield出来拯救世界了:

调用方法:

上述代码运行时,for中调用了getSeq,执行该函数时,遇到yield index时会将index的值返回,并且函数暂停在yield语句的位置,下次再调用getSequence时,将继续从上次暂停的位置开始运行,直到遇到yield关键词时又将index的值返回,一直这样循环

yield的作用也就是:当执行到yield关键词的代码时,函数会暂时返回,下次调用该函数时,会从上次暂停的地方继续运行,yield起到一个暂时返回的作用,有点像return。

另外,yield其实可以有返回值,也可以从外界改变yield的返回值:

输出:

i=1

res = None

i = 2

res = None

上面打印出的res取值都是None,yield将index的值返回给调用方后,res赋的值为None,但是我们也可以从外界手动给res赋值

输出:

res=1

res=2

res=3

上述代码先调用next(seq)主要是使getSeq函数暂停到yield语句的地方,暂停在yield语句后才能使用send方法给yield返回值赋值,否则会报错。

上述大概是yield关键词的使用,总结:

在执行seq = getSeq(5)的时候,函数并没有执行,此时seq的类型是对象,更具体一点seq是生成器类型(generator)

每个generator类型对象主要有两个方法:send和next,next用来迭代,send用来给yield返回值赋值,默认情况下yield的返回值是None

每一个send方法中隐式调用了next方法

send方法是给yield表达式返回值赋值,所以函数必须暂停在yield代码处的时候才能调用send方法(其实就是调用send方法前至少调用一次next方法)

for i in getSeq 其实就是对generator进行迭代,和next方法类似

热 文推 荐

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20190411A02HV700?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券