python中yield和send的用法

在python中使用了 yield 关键字的函数并不是普通的函数,而是被称为生成器(generator)。生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。

在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值, 并在下一次执行 next() 方法时从当前位置继续运行。通过以下例子来理解:

def test():
    i = 0
    while(i < 5):
        temp = yield i**2
        print(temp)
        i += 1
t = test()
print(next(t))
print(next(t))
#输出为
#0
#none
#1

之所以运行结果是这样,我们可以将两个print()分开来看(需要注意的是t = test()这步并没有执行test函数,而是在next()函数处才开始执行):

第一个print():

当执行next(t)函数时,test()开始执行,当进入到yield关键字处时程序被暂停,并将yield关键字后的数据返回出去,所以第一个print显示的就是0。并且程序将不会继续运行,直到第二个next(t)被调用。

第二个print():

程序开始从暂停处继续执行,因为当程序被暂停时,并没有开始赋值给temp的操作。而且yield后的数据又被返回出去了,所以并没有值可以赋给temp了,则print(temp)输出就为none。接着开始循环执行到第二次遇到yield关键字,继续返回后面的i**2,同时暂停程序,直到下一个next()。。。。。

send() 的用法

当只有一个print(next(t))时:

def test():
    i = 0
    while(i < 5):
        temp = yield i**2
        print(temp)
        i += 1
t = test()
print(next(t))
#输出为
#0

输出该结果的原因是yield处程序被暂停,但是如果在后面加上一句

print(t.send("blank"))
def test():
    i = 0
    while(i < 5):
        temp = yield i**2
        print(temp)
        i += 1
t = test()
print(next(t))
print(t.send("blank"))

则结果为

0
blank
1

所以send()相当于将send()中的参数赋给了函数中正缺少值的temp,并且使函数继续运行,直到遇到下一次的yield。
可以想象为人走在路上遇到一个坑就停下了,而send相当于把坑填上,而人也可以继续行走直到遇到下一个坑或者走到目的地。

def test():
    i = 0
    while(i < 5):
        temp = yield i**2
        print(temp)
        i += 1
t = test()
print(next(t))
print(t.send("blank"))
print(t.send("blank"))
print(t.send("blank"))
print(t.send("blank"))
print(t.send("blank"))#程序结束,将报错
0
blank
1
blank
4
blank
9
blank
16
blank
Traceback (most recent call last):
  File "pytest.py", line 13, in <module>
    print(t.send("blank"))
StopIteration

而print(next(t))等同于send(None)

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Python,`yield`关键字用于定义生成器函数。生成器函数是一种特殊的函数,它可以产生一个迭代器对象,通过迭代器可以逐步产生值而不是一次性返回所有结果。生成器函数使用`yield`语句来指示函数在每次被调用时暂停执行,并返回一个值给调用者。调用者可以通过调用生成器的`next()`方法或使用`for`循环来逐步获取生成器产生的值。 除了在生成器函数使用`yield`语句来控制生成器的执行流程外,`yield`还可以与其他语句和表达式一起使用,例如`send()`方法可以在生成器发送一个值,并将其作为`yield`表达式的结果,`throw()`方法用于在生成器引发一个异常,`close()`方法用于关闭生成器。 PEP342进一步增强了生成器函数的功能,将`yield`从一个关键字(statement)变为表达式(expression),并引入了`send()`,`throw()`,`close()`等方法来操作生成器。这些增强使得生成器函数更加灵活和功能强大。 通过使用生成器函数,我们可以按需生成序列的值,而不需要一次性生成所有的值,这样可以节省内存并提高效率。此外,生成器函数还可以用于实现协程和异步编程等高级应用。 参考文献: PEP 342 -- Coroutines via Enhanced Generators: https://www.python.org/dev/peps/pep-0342/ Real Python - Introduction to Python Generators: Using Advanced Generator Methods: https://realpython.com/introduction-to-python-generators/#using-advanced-generator-methods Real Python - Generators in Python: Creating and Iterating Simple Generators: https://realpython.com/introduction-to-python-generators/<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [python yield关键字全面解析](https://blog.csdn.net/jeffery0207/article/details/124856788)[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、付费专栏及课程。

余额充值