python yield 简单解释

因为yield和return有一定的共同性,于是就把yield拿来和return做对比了

上代码

def ytest():
   print("ytest从0开始的每次加1的循环输出生活")    
   i = 0
   y = 10
   while i<=y:
      print("来自rtest信息",i,"准备返回")   
      yield i
      print("来自rtest信息",i,"已经返回")   
      i+=1
      
def rtest():
   print("rtest从0开始的每次加1的循环输出生活")    
   i = -1
   y = 10
   while i<=y: 
      i+=1
      print("来自rtest信息",i,"已经返回")  
      return i
      
getrtest =  ytest()

print("getrtest是",getrtest)
print("+"*50)
a = next(getrtest)
print("第一次a接收到的数据为:",a)
print("_"*50)
a = next(getrtest)
print("第二次a接收到的数据为:",a)
print("_"*50)
a = next(getrtest)
print("第三次a接收到的数据为:",a)
print("~"*50)
getrtest = rtest()
print("+"*50)
print("getrtest是:",getrtest)

 ytest使用yield,rtest使用return,各自都写一个循环10次的while

当然因为rtest使用了return所以他只能进行一次循环然后就退出了

上述代码输出结果为

getrtest是 <generator object ytest at 0x000001FD07914B30>
++++++++++++++++++++++++++++++++++++++++++++++++++
ytest从0开始的每次加1的循环输出生活
来自rtest信息 0 准备返回
第一次a接收到的数据为: 0
__________________________________________________
来自rtest信息 0 已经返回
来自rtest信息 1 准备返回
第二次a接收到的数据为: 1
__________________________________________________
来自rtest信息 1 已经返回
来自rtest信息 2 准备返回
第三次a接收到的数据为: 2
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
rtest从0开始的每次加1的循环输出生活
来自rtest信息 0 已经返回
++++++++++++++++++++++++++++++++++++++++++++++++++
getrtest是: 0

好,先来看调用后的区别 

getrtest =  ytest()

print("getrtest是",getrtest)
输出的是<generator object ytest at 0x000001825D474B30>明显getrtest是个类

getrtest = rtest()
print("getrtest是:",getrtest)

输出的是 0 ,明显getrtest是个Int类型的

 因为使用了yield所以getrtest =  ytest()不会立马执行,而是需要使用next进行迭代才执行一次,而且当遇到yield时又会停下来,再次等待next的调用

def ytest():
   print("ytest从0开始的每次加1的循环输出生活")    
   i = 0
   y = 10
   while i<=y:
      print("来自rtest信息",i,"准备返回")   
      yield i
      print("来自rtest信息",i,"已经返回")
  
      i+=1
 

getrtest =  ytest()

print("getrtest是",getrtest)
print("+"*50)
a = next(getrtest)
print("第一次a接收到的数据为:",a)
print("_"*50)
a = next(getrtest)
print("第二次a接收到的数据为:",a)

##############################################################

看红色区域,因为使用了yield,所以当第一次使用a = next(getrtest)调用getrtest的时候,gettest内部将输出

ytest从0开始的每次加1的循环输出生活
来自rtest信息 0 准备返回

然后返回一个i的值给a(也就是0),然后继续执行下面的输出语句,输出

第一次a接收到的数据为: 0

然后就是输出

__________________________________________________

来自rtest信息 0 已经返回

将在下一次的a = next(getrtest)调用中被输出

而return不一样了,他直接输出了0完成并跳出了循环(循环和方法都走完了) 

return适合用在一次性执行完成代码并返回的情况比如你直接想要一个长度为3的从8开始的递增数组

def tsetlist(data,len):
      alist = []
      for a in range(len):
         adddata = data+a   
         alist.append(adddata)
         print(adddata,"已经填装")
      return alist
print("获得一个从8开始的长度为3的递增数组:",tsetlist(8,3))

————————————输出结果为————————

8 已经填装
9 已经填装
10 已经填装
获得一个从8开始的长度为3的递增数组: [8, 9, 10]

当你不想一次性全部得到这个数组,而是在获得一个数就进行一次处理的时候,就可以用yield

 

def tsetlist(data,len):

      
      for a in range(len):
         adddata = data+a   

         print(adddata,"已经准备返回")
         yield adddata

a = tsetlist(8,3)
b=[str(next(a))+"月风高秋怒号",str(next(a))+"月九日望乡台",str(next(a))+"月阴气盛,北风无时休"]
print(b)

(虽然上面的这种演示很sb很多此一举就是了,这种也可以用return来完成就是了)
yield曾经用过的一次还是在巨大量的文件读取的时候,如果使用return一次性读取完成后再来进行处理,会很吃内存,需要预先留出给return读取需要的空间,但是如果使用yield就可以读一个处理一个,处理一个读一个,然后不用了的再释放。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值