[转载] 【零基础学爬虫】python中的yield详解

参考链接: 什么时候在Python中使用yield而不是return

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

for item in f(***):

    ****

 

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

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

这是yield出来拯救世界了: 

def getSeq(num):

    index = 1;

    while index<num:

       yield index

        index = index+1

 

调用方法: 

for i in getSeq(1000000):

    pass

 

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

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

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

def getSeq(num):

    index = 1

    while index<num:

        res = yield index

        print('res = '+str(res)+'\n')

        index = index+1

for i in getSeq(3):

    print('i = '+str(i)+'\n')

 

输出: 

 

 i=1 res = None i = 2 res = None 

 

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

def getSeq(num):

    index = 1

    while index<num:

        res = yield index

        print('res = '+str(res)+'\n')

        index = index+1

seq = getSeq(5)#

next(seq)

seq.send(1)

seq.send(2)

seq.send(3)

 

输出: 

 

 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方法类似 

 

扫描下方二维码,及时获取更多互联网求职面经、java、python、爬虫、大数据等技术,和海量资料分享:公众号后台回复“csdn”即可免费领取【csdn】和【百度文库】下载服务;公众号后台回复“资料”:即可领取5T精品学习资料、java面试考点和java面经总结,以及几十个java、大数据项目,资料很全,你想找的几乎都有

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值