首页 > 其他分享 >yield from 关键字的 return 语句

yield from 关键字的 return 语句

时间:2024-02-06 11:01:21浏览次数:18  
标签:语句 return 生成器 yield 关键字 test def

我经常需要写一些比较复杂的代码,常常会遇到各种各样的问题。比如我在使用yield from 表达式时,return 语句的问题。我们知道,在使用 yield from 表达式时,return 语句的作用是在子生成器(被调用的生成器)执行完毕后,返回最终的结果到调用者。这可以让生成器在嵌套结构中更清晰地传递值。具体情况我会一一用文字记录下来,方便后期参考:

yield from 关键字的 return 语句_python

1、问题背景

使用 "yield from" 表达式时,return 语句的作用是什么?我在很多示例中都没有找到 return 语句从 yield from 表达式返回的值。我尝试了以下简单的代码,但没有成功:

def return4():
    return 4


def yield_from():
    res = yield from range(4)
    res = yield from return4()


def test_yield_from():
    for x in yield_from():
        print(x)


test_yield_from()

运行该代码会产生以下输出:

» python test.py 0 1 2 3 Traceback (most recent call last): File "test.py", line 52, in <module> test_yield_from() File "test.py", line 48, in test_yield_from for x in yield_from(): File "test.py", line 44, in yield_from res = yield from return4() TypeError: 'int' object is not iterable

但我希望的输出是:

» python test.py 0 1 2 3 4

因为 PEP 中有这样一段说明:

此外,当迭代器是另一个生成器时,子生成器被允许执行带有值的 return 语句,该值变为 yield from 表达式的值。

很显然,我没有得到这种解释。在 "yield from" 语句中,子生成器中的 return 语句是如何工作的?

2、解决方案

答案1: 生成器在耗尽时可以返回一个值:

def my_gen():
    yield 0
    return "done"

g = my_gen()
next(g)
next(g) # raises StopIteration: "done"

在 yield from 语句中返回的值将是此值。例如:

def yield_from():
    res = yield from my_gen()
    assert res == "done"

默认情况下,此值为 None。即 res = yield from range(4) 会将 res 设置为 None。

答案2:

yield from generator 的简写为:

for i in generator:
    yield i

好吧,它比这复杂一点:https://www.python.org/dev/peps/pep-0380/#formal-semantics 。如果 generator = 4,则它将无法正常工作。(你的 return4() 不是一个生成器,而是一个函数。)为了得到你想要的结果,你可以这样做:

def yield_from():
    yield from range(4)
    yield 4

答案3:

我为你提供了测试的一个工作示例。return4 函数现在是一个生成器。为实现这一目标,必须在函数中任何地方出现 yield(Python 3.5 中有一个新的相关特性,但现在并不重要)。

正如你已经引用的:

此外,当迭代器是另一个生成器时,子生成器被允许执行带有值的 return 语句,该值变为 yield from 表达式的值。

总结:你将得到一个值。例如,你可以打印它:

def yield_from():
    # ...
    val = yield from return4()
    print("value:", val)  # prints value: 4

但你希望的是 yield 它,而不是打印它。以下是完整的代码:

def return4():
    if False:
        yield None
    return 4

def yield_from():
    yield from range(4)
    yield (yield from return4())

def test_yield_from():
    for x in yield_from():
        print(x)

test_yield_from()
# prints numbers 0 to 4

你可能会问自己,它有什么好处。当你只从生成器接收值时,几乎没有任何优势。但当你向生成器发送值时,yield from 是一个很棒的特性。尝试找到有关 Python 协程的良好解释。它很棒。

其实上面的问题我们知道,具体来说,当一个生成器函数中使用 yield from 调用另一个生成器时,return 语句的返回值会成为调用者获取的值。这就允许子生成器产生的值直接传递给调用者,而不需要在父生成器中一个一个地使用 yield 语句传递。所以后期有啥不懂的都可以评论区留言。

标签:语句,return,生成器,yield,关键字,test,def
From: https://blog.51cto.com/u_13488918/9617909

相关文章

  • this关键字
    ----......
  • 标识符和关键字
    关键字标识符publicclass标识符和关键字{publicstaticvoidmain(String[]args){//所有的标识符都应该以字母(A-Z或a-z)、美元符号($)、下划线(_)开始StringAhello="hexiaoling";Stringhello="hexiaoling";String$hello="hexia......
  • 1 return2/11
     #include<stdio.h>intmain(){inta,b;while(scanf("%d%d",&a,&b)!=EOF){if(a=='\n'||b=='\n')return0;printf("%d\n",a+b);}return0;}关键:......
  • Yield Keyword, classmethod and static method, and Property Method in Python
    ReferenceWhatisYieldKeywordinPythonPython'syieldkeywordislikeanotheroneweusetoreturnanexpressionorobject,typicallyinfunctions,calledreturn.Thereisasmallamountoffluctuation,though.Theyieldstatementofafunctionre......
  • 无涯教程-Return array from 函数s
    下面的示例更好地解释了此概念。Returnarrayfromfunctions-示例functiondisp(){returnnewArray("Mary","Tom","Jack","Jill")}varnums=disp()for(variinnums){console.log(nums[i])}成功执行上述代码后,将显示以下输出。MaryT......
  • mysql找出不包含某些关键字的结果
    比如公司业务是和房产相关的,但是库里存在和房产不相关的内容时就需要筛选并删除。如何筛选才能不误伤呢?这是我的一个初步的SQL: 意思是如果name、desc字段都不包含房、盘、楼、地产关键字才找出来。如下: 这篇文章就到这里啦!如果你对文章内容有疑问或想要深入讨论,欢迎......
  • 循环控制语句(breaak,continue,return)
    break(终止循环)语法细节说明(注意lable添加后的结束位置)continue(跳过一轮继续下一轮循环)语法细节说明(还是注意lable添加后的结束位置)return(退出)使用ruturn后会直接退出程序break,continue,return比较......
  • 面向对象基础 成员变量、成员方法、构造方法、this关键字、静态字段、静态方法..
    成员变量与局部变量的区别:  1.作用域:成员变量作用于整个类,局部变量只作用于它所属的范围(函数、语句)  2.生命周期&位置:成员变量存储在堆内存中,是属于对象的,随着对象存在消失。局部变量存储在栈内存中,是属于他所属的范围的,使用完自动释放。  3.初始值:成员变量有默认初始......
  • 多线程sleep、yield、wait、join方法的使用和区别
    使用和介绍sleep方法sleep方法的官方注释(翻译后):/***根据系统计时器和调度程序的精度和准确性,使当前执行的线程休眠(暂时停止执行)指定的毫秒数。线程不会失去任何监视器的所有权(不释放锁)。**@parammillis以毫秒为单位的睡眠时间长度*@throws......
  • 01 | C++关键字const/volatile
    const与volatileconst从字面意思上是表示“常量”。最基础的用法就是定义程序用到的数字、字符串常量,代替宏定义。constintMAX_LEN=1024;conststd::stringNAME="metroid";不过从C++程序的生命周期角度来看的话,const定义的常量和宏定义还是有本质的区别:const定义......