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关键字,此时生成器被认为是空的

  • 相关阅读:
    CentOS查看CPU信息、位数、多核信息
    Linux常用命令大全
    chmod命令详细用法
    tar命令的详细解释
    yum和rpm命令详解
    LeetCode 241. Different Ways to Add Parentheses
    LeetCode 139. Word Break
    LeetCode 201. Bitwise AND of Numbers Range
    LeetCode 486. Predict the Winner
    LeetCode 17. Letter Combinations of a Phone Number
  • 原文地址:https://www.cnblogs.com/gczr/p/7089983.html
Copyright © 2011-2022 走看看