yield 和 return

本文详细介绍了Python中yield关键字的作用,它用于创建生成器,不同于return,yield可以在函数内部保留状态。通过next()函数可以逐次执行生成器内的代码,send()函数则允许在执行过程中传递值。文章还对比了yield和return的差异,说明return后函数结束,而yield可以继续执行后续代码。最后,通过示例展示了send()如何在生成器中进行赋值操作。
摘要由CSDN通过智能技术生成

作用类似于return,只不过yield返回的是一个迭代器(generator),可以配合特殊的方法:next()、send()函数使用。

1.调用:含有yield特殊字的函数,被调用之后返回的是一个迭代器

def foo():
    i = 1
    print("starting...")
    while True:
        yield i+1
        i+=1
        print(i)

g = foo()
print(g)

》》》
<generator object foo at 0x0000020430EEC8E0>

可以看到,不会执行foo函数的内容,g为一个generator。

 

2.next(g)    当调用next()函数时,会执行到yield。   nex(g)就是yield返回的东西。

def foo():
    i = 1
    print("starting...")
    while True:
        yield i+1
        i+=1
        print(i)

g = foo()
print(g)
print(next(g))
print("*"*20)
print(next(g))

》》》
<generator object foo at 0x0000028838AFC8E0>
starting...
2
********************
2
3

        再执行next()函数时,会接着上一次next执行完yield的地方继续向下执行

3.send()函数,赋值。否则 yield是不会进行赋值操作的。  同时send()方法包含了next()方法,执行send()会自动执行next()

def foo():
    i = 1
    print("starting...")
    while True:
        res = yield i+1
        i+=1
        print(i)
        print('res:',res)

g = foo()
print(g)
print(next(g))
print("*"*20)
print(next(g))

》》》
<generator object foo at 0x000001CB255BC8E0>
starting...
2
********************
2
res: None
3

      由上面可以看到,虽然有 res = yield i+1,这个貌似赋值的操作,但是yield并不会有进行赋值

def foo():
    i = 1
    print("starting...")
    while True:
        res = yield i+1
        i+=1
        print(i)
        print('res:',res)

g = foo()
print(g)
print(next(g))

print("*"*20)
print(g.send(7))

》》》
<generator object foo at 0x00000187FDD3C8E0>
starting...
2
********************
2
res: 7
3

     上段代码可见,在第一次执行next()函数之后,迭代器会停留在yield处。

     在执行g.send(7)时,会接着在yield处继续执行,进行赋值。然后自动再执行next()函数,即运行到下一个yield结束。

 

4.yield 和 return 的区别

从上面可以看出,yield操作之后,后续是可以继续有代码的,下一次next()的时候,后续的代码也是会被执行的。

而return不同,函数只要执行了return,这个函数就结束了,return后面的任何代码是不会被执行的。并且 return没有标记的作用,不能配合send() 进行赋值。

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值