资讯专栏INFORMATION COLUMN

当我们调用yield,它究竟做了什么

Jochen / 349人阅读

摘要:显然,要理解,首先要了解迭代器,接着了解什么是生成器。生成器上述代码中,就是一个迭代器,循环部分就是迭代过程。迭代器和生成器的执行效率因为生成器边迭代边生成,所以占用内存极少,执行效率也更高。

显然,要理解yield,首先要了解迭代器(iterator),接着了解什么是生成器(generator)。

迭代器

通俗的讲,迭代器就是可以逐个访问的容器,而逐个逐步访问的过程成为迭代。

iterator = [item for item in range(5)]
for i in iterator:
    print(i)
0
1
2
3
4
生成器

上述代码中,iterator就是一个迭代器,for循环部分就是迭代过程。生成器同样也是可供迭代访问的容器,与迭代器不同的是,生成器中的元素不会一次性存入内润中,而是一边迭代一边生成。

generator = (item for item in range(5))
for i in generator:
    print(i)
0
1
2
3
4
迭代器和生成器的执行效率

因为生成器边迭代边生成,所以占用内存极少,执行效率也更高。

def go_thru_iterator(item_len):
    iterator = [item for item in range(item_len)]
    for i in iterator:
        pass
def go_thru_generator(item_len):
    generator = (item for item in range(item_len))
    for i in generator:
        pass
%time go_thru_iterator(100000000)
CPU times: user 12 s, sys: 11.8 s, total: 23.8 s
Wall time: 23.8 s


%time go_thru_generator(100000000)
CPU times: user 12.7 s, sys: 0 ns, total: 12.7 s
Wall time: 12.6 s

yield

yield的使用和return的使用没有什么区别,只是yield会返回一个生成器。当代码执行到yield时,该函数会返回yield之后的值,并在原地等待下一次迭代;当执行到下一次迭代时,代码接着上一次等待的地方执行:

若使用生成器的send方法,则yield语句的返回值send中的参数

若使用next函数迭代,则在yield的返回值为None

注: next相当于mgen.send(None),但mgen.send在生成器第一次迭代时不可调用

def create_generator():
    mylist = range(3)
    for i in mylist:
        ret = yield i * i
        print("ret:", ret)
mgen = create_generator()
next(mgen)
0
next(mgen)
ret: None
1
mgen.send("The yield return value.")
ret: The yield return value.
4
try:
    next(mgen)
except StopIteration:
    print("Already arrive the end of the generator element.")
ret: None
Already arrive the end of the generator element.

原文地址:github:jasonTu/python-material-collection 当我们调用yield,它究竟做了什么

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/41615.html

相关文章

  • 上手并过渡到PHP7(5)——轻量级“集合”迭代器-Generator

    摘要:轻量级集合迭代器泊学视频链接泊阅文档链接是加入的新语言特性。接下来,我们可以像访问一个普通集合一样使用现在重新执行我们的文件,就不会再报错了。简单来说,就是一个轻量级的,可以记住自身状态的集合迭代器。 轻量级集合迭代器-Generator泊学视频链接泊阅文档链接Generator是PHP 5.5加入的新语言特性。但是,它似乎并没有被很多PHP开发者广泛采用。因此,在我们了解PHP 7对...

    wupengyu 评论0 收藏0
  • ES6 Generator实现协同程序

    摘要:关键字表示代码在该处将会被阻塞式暂停阻塞的仅仅是函数代码本身,而不是整个程序,但是这并没有引起函数内部自顶向下代码的丝毫改变。通过实现模式在通过实现理论的过程中已经有一些有趣的探索了。 至此本系列的四篇文章翻译完结,查看完整系列请移步blogs 由于个人能力知识有限,翻译过程中难免有纰漏和错误,望不吝指正issue ES6 Generators: 完整系列 The Basics...

    MudOnTire 评论0 收藏0
  • Node程序debug小记

    摘要:当前的部分代码状态超时再缩小了范围以后,进一步进行排查。函数是一个很简单的一次性函数,在第一次被触发时调用函数。因为上述使用的是,而非,所以在获取的时候,肯定为空,那么这就意味着会继续调用函数。 有时候,所见并不是所得,有些包,你需要去翻他的源码才知道为什么会这样。 背景 今天调试一个程序,用到了一个很久之前的NPM包,名为formstream,用来将form表单数据转换为流的形式进行...

    Achilles 评论0 收藏0
  • 一道神奇的Python面试题,你会吗?

    关注公众号:「Python专栏」,后台回复「爬虫书籍」,即可获得2本Python爬虫相关的电子书showImg(https://segmentfault.com/img/remote/1460000018448215?w=860&h=860); 无意间,看到这么一道Python面试题:以下代码将输出什么? def testFun(): temp = [lambda x : i*x for ...

    princekin 评论0 收藏0

发表评论

0条评论

Jochen

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<