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

    迭代

    你可以创建一个列表,然后逐一遍历,这就是迭代

    mylist是可迭代的对象,当你使用列表解析时,你创建一个列表,即一个可迭代对象

    任何你可用 “for… in…” 处理的都是可迭代对象:列表,字符串,文件….
    这些迭代对象非常便捷,因为你可以尽可能多地获取你想要的东西

    但,当你有大量数据并把所有值放到内存时,这种处理方式可能不总是你想要的
    (but you store all the values in memory and it’s not always what you want when you have a lot of values.)

    生成器

    生成器是迭代器,但你只能遍历它一次(iterate over them once)
    因为生成器并没有将所有值放入内存中,而是实时地生成这些值

    这和使用列表解析地唯一区别在于使用()替代了原来的[]

    注意,你不能执行for i in mygenerator第二次,因为每个生成器只能被使用一次: 计算0,并不保留结果和状态,接着计算1,然后计算4,逐一生成

    yield

    yield是一个关键词,类似return, 不同之处在于,yield返回的是一个生成器

    这个例子并没有什么实际作用,仅说明当你知道你的函数将产生大量仅被读取一次的数据时,使用生成器将是十分有效的做法

    要掌握yield,你必须明白 – 当你调用这个函数,函数中你书写的代码并没有执行。这个函数仅仅返回一个生成器对象

    这有些狡猾 :-)

    然后,在每次for循环使用生成器时,都会执行你的代码

    然后,是比较困难的部分:

    第一次函数将会从头运行,直到遇到yield,然后将返回循环的首个值. 然后,每次调用,都会执行函数中的循环一次,返回下一个值,直到没有值可以返回

    当循环结束,或者不满足”if/else”条件,导致函数运行但不命中yield关键字,此时生成器被认为是空的

  • 相关阅读:
    Linkerd 2.10(Step by Step)—将 GitOps 与 Linkerd 和 Argo CD 结合使用
    Linkerd 2.10(Step by Step)—多集群通信
    Linkerd 2.10(Step by Step)—使用 Kustomize 自定义 Linkerd 的配置
    Linkerd 2.10(Step by Step)—控制平面调试端点
    Linkerd 2.10(Step by Step)—配置超时
    Linkerd 2.10(Step by Step)—配置重试
    Linkerd 2.10(Step by Step)—配置代理并发
    本地正常运行,线上环境诡异异常原因集合
    Need to invoke method 'xxx' declared on target class 'yyy', but not found in any interface(s) of the exposed proxy type
    alpine 安装常用命令
  • 原文地址:https://www.cnblogs.com/gczr/p/7089983.html
Copyright © 2011-2022 走看看