- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章python 如何区分return和yield由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
1、说明 。
return一直中,每中语言中其没没有很大差别,就不多说了。(shell语言return的是退出状态,可能差别是比较大的,感兴趣可参见“Linux Shell函数定义与调用”) 。
最早看到yield应该是哪们语言用来调整什么线程优先级的,记不清了,不过那里的yield和python中的yield应该功能有区别.
python中最早看到yield应该是使用scrapy框架写爬虫的时候,之前也有去看yiled的用法,总记不太住。今天又去看了一下,基本上来就是讲些斐波那契数列的烦的要死,自己写段程序研究了一下,这里记一下.
2、return和yield的异同 。
共同点:return和yield都用来返回值;在一次性地返回所有值场景中return和yield的作用是一样的.
不同点:如果要返回的数据是通过for等循环生成的迭代器类型数据(如列表、元组),return只能在循环外部一次性地返回,yeild则可以在循环内部逐个元素返回。下边我们举例说明这个不同点.
3、实例说明 。
3.1 return版本 。
示例代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
class
TestYield:
def
gen_iterator(
self
):
result_list
=
[]
for
j
in
range
(
3
):
print
(f
"gen_iterator-{j}"
)
result_list.append(j)
# return在循环的外部,待变量完全生成后一次性返回
return
result_list
def
call_gen_iterator(
self
):
# 执行下边这句后result_list直接是完成的结果[0,1,2]
result_list
=
self
.gen_iterator()
for
i
in
result_list:
print
(f
"call_gen_iterator-{i}"
)
if
__name__
=
=
"__main__"
:
obj
=
TestYield()
obj.call_gen_iterator()
|
执行结果如下,可以看到一次性执行完下层函数,生成完整的迭代器类型返回值result_list,一次性返回给上层函数:
3.2 yield版本 。
示例代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
class
TestYield:
def
gen_iterator(
self
):
for
j
in
range
(
3
):
print
(f
"do_something-{j}"
)
# yield在for循环内部
yield
j
def
call_gen_iterator(
self
):
# yield并不是直接返回[0,1,2],执行下边这句后result_list什么值都没有
result_list
=
self
.gen_iterator()
# i每请求一个数据,才会触发gen_iterator生成一个数据
for
i
in
result_list:
print
(f
"call_gen_iterator-{i}"
)
if
__name__
=
=
"__main__"
:
obj
=
TestYield()
obj.call_gen_iterator()
|
执行结果如下,可以看到上下层函数是交替进行的,即上层函数请求迭代一个值下层函数才生成一个值并立即返回这个值:
3.3 yield的意义 。
从上边两个小节可以看到,虽然return和yield两者执行的顺序有区别,但整个要做的事情是一样的,所以使用yield并不会比return快,甚至我们可以猜测由于yield总发生上下文切换在速度上还会慢一些,所以速度不是yield的意义.
他们的主要区别是yiled要迭代到哪个元素那个元素才即时地生成,而return要用一个中间变量result_list保存返回值,当result_list的长度很长且每个组成元素内容很大时将会耗费比较大的内存,此时yield相对return才有优势.
4、yield和return嵌套使用 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
class
TestYield:
def
gen_iterator(
self
):
for
j
in
range
(
3
):
print
(f
"do_something-{j}"
)
# yield在for循环内部
yield
j
def
gen_iterator_middle(
self
):
print
(f
"gen_iterator_middle"
)
# 返回的是迭代器的句柄,所以加一层return不影响是可以理解的
return
self
.gen_iterator()
def
call_gen_iterator(
self
):
# yield并不是直接返回[0,1,2],执行下边这句后result_list什么值都没有
result_list
=
self
.gen_iterator_middle()
# i每请求一个数据,才会触发gen_iterator生成一个数据
for
i
in
result_list:
print
(f
"call_gen_iterator-{i}"
)
if
__name__
=
=
"__main__"
:
obj
=
TestYield()
obj.call_gen_iterator()
|
以上就是python 如何区分return和yield的详细内容,更多关于python return和yield的资料请关注我其它相关文章! 。
原文链接:https://www.cnblogs.com/lsdb/p/12534443.html 。
最后此篇关于python 如何区分return和yield的文章就讲到这里了,如果你想了解更多关于python 如何区分return和yield的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
function* generatorFunction() { yield (yield 1)(yield 2)(yield 3)(); } var iterator = generatorFun
ECMAScript 6 应该带来生成器函数和迭代器。生成器函数(具有 function* 语法)返回一个迭代器。迭代器有一个 next 方法,当重复调用时,该方法会执行生成器函数的主体,并在每个 y
ECMAScript 6 应该引入生成器函数和迭代器。生成器函数(具有 function* 语法)返回迭代器。迭代器有一个 next 方法,当重复调用时,它会执行生成器函数的主体,在每个 yield
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 2 年前。 Improve t
自 python 2.5 以来,可以将 send()、throw()、close() 放入生成器中。在定义的生成器中,可以通过执行以下操作来“捕获”发送的数据: def gen(): whil
return的区别和 yield似乎很清楚,直到我发现还有 yield from以及将两者结合起来的可能性 return和 yield在完全相同的功能! 我对return的理解之后的一切都是 不是 执
假设我有这个部分,我正在尝试渲染 #layouts/_subheader.html.erb 当我在这样的 View 中使用这个部分时 Content For Yield
yield操作符是由编译器在底层实现的,该编译器生成一个实现符合 IEnumerable 的状态机的类。和 IEnumerator . 给定一个罗斯林 MethodDeclarationSyntax
$item) echo "$index $item" . PHP_EOL; } resolve(generator1()); echo PHP_EOL; resolve(gener
这个问题在这里已经有了答案: Why converting list to set is faster than converting generator to set? (1 个回答) List c
是否有一个单行代码来获取生成器并生成该生成器中的所有元素?例如: def Yearly(year): yield YEARLY_HEADER for month in range(1, 13)
刚发现yield from 结构,在我看来这有点像反向的yield,而不是从生成器中获取对象,您插入/将对象发送到生成器。喜欢: def foo(): while True:
考虑以下代码: def mygen(): yield (yield 1) a = mygen() print(next(a)) print(next(a)) 输出产量: 1 None 解释器
Guido van Rossum,在 2014 年关于 Tulip/Asyncio 的演讲中 shows the slide : Tasks vs coroutines Compare: res =
谁能帮我理解“yield self”和“yield”的区别? class YieldFirstLast attr_accessor :first, :last def initiali
这是我目前使用 Laravel 5 实现的 Open Graph 标签: app.blade.php @yield('title') page.blade.php @extends('app'
在 Tornado 中,我们通常会编写如下代码来异步调用函数: class MainHandler(tornado.web.RequestHandler): @tornado.gen.coro
本文整理了Java中aQute.bnd.indexer.analyzers.Yield.yield()方法的一些代码示例,展示了Yield.yield()的具体用法。这些代码示例主要来源于Github
我们有超过 100 个共同基金的每日返回,我们希望将这些返回转换为月度返回。每月返回不应是每个月的平均值,而是每个月末的资金返回。基金在不同的时间点开始和结束,它们需要自己保留(不是每个月的共同基金
如何实现 C# yield return使用 Scala 延续?我希望能够编写 Scala Iterator s 风格相同。在 this Scala news post 的评论中有刺伤,但它不起作用(
我是一名优秀的程序员,十分优秀!