zoukankan      html  css  js  c++  java
  • 迭代器、生成器

    迭代器只有在调用next的时候才会取数据(所以省内存),或者循环的时候,一个对象里面实现了__iter__方法,iter方法里面返回了一个迭代器,那就是一个可迭代对象了。

    下面的代码,首先实现了iter方法,这个对象就是一个可迭代对象了,然后又返回了self就是自己,就是一个迭代器了。

    使用for 循环的时候会自动调用__next__方法取到返回值,直到抛出StopIteration异常就停止了。

    迭代器实现起来比较复杂,必须得写一个类,逻辑不清楚。

    生成器的出现,就是为了简化创建迭代器的繁杂,同时又要保证逻辑的清晰,说到底生成器就是为了更方便我们使用迭代器而生的,生成器的特性如下:

    1 生成器的样子就是一个普通的函数,只不过return关键词被yield取代了
    2 当调用这个“函数”的时候,它会立即返回一个迭代器,而不立即执行函数内容,直到调用其返回迭代器的next方法是才开始执行,直到遇到yield语句暂停。
    3 继续调用生成器返回的迭代器的next方法,恢复函数执行,直到再次遇到yield语句
    4 如此反复,一直到遇到StopIteration

    看下面的生成器,逻辑就很清晰了,只是把原来的return变成了yield

    用生成器和迭代器的好处就是节省内存,比如说一个list里面有10000个元素,那他就会占这么多的内存,如果用了迭代器,它是需要用到这个值的时候才去计算出来,存到内存里面,占用内存特别少。

    当然生成器还有更高级的用法,python的协程就是通过生成器来实现的,因为函数里面遇到yield就会暂停这个函数的运行,下次在调用next方法的时候,或者下次循环的时候才会继续从yield下面继续往下走,过程如下图

    那我们是不是可以想,在这个函数暂停的时候可以让他做点其他的事情呢,比如说在下载东西的时候,就得等待了,就yield一下,切换到别的东西去执行,什么时候执行完了再回来。这个就是异步io的原理了,python里面的协程就是基于yield实现的。

    协程和异步io的原理请下面三篇文章

    https://juejin.im/post/5b3c4b9e6fb9a04f8d6b94de

    https://juejin.im/post/5b3f540af265da0f742ec5e1

    https://juejin.im/post/5b42e404e51d4519873f1a1b

  • 相关阅读:
    CS229 6.4 Neurons Networks Autoencoders and Sparsity
    CS229 6.3 Neurons Networks Gradient Checking
    【Leetcode】【Easy】Min Stack
    【Leetcode】【Easy】Merge Sorted Array
    【Leetcode】【Easy】ZigZag Conversion
    【Leetcode】【Easy】Valid Palindrome
    【Leetcode】【Easy】Reverse Integer
    【Leetcode】【Easy】Palindrome Number
    【Leetcode】【Easy】Length of Last Word
    【Leetcode】【Easy】Remove Nth Node From End of List
  • 原文地址:https://www.cnblogs.com/xiaowenshu/p/9916765.html
Copyright © 2011-2022 走看看