zoukankan      html  css  js  c++  java
  • 【生成器】【迭代器】range对象并不是【不能耗尽】【不能next】

    1. 实验
    
    # 可迭代对象就是你可以迭代的任何东西,而迭代器就是实际迭代的东西
    my_iter = iter([1,2]) # 返回可迭代对象list的迭代器,就可以用next了
    next(my_iter )        # 没有元素就会返回错误
    
    # range不是迭代器的理由
    # 1 不能调用next
    # 2 可以遍历一个 range 对象而不「消耗」它
    
    my_iter = iter([1,2])
    print(tuple(my_iter)) # (1, 2)
    print(tuple(my_iter)) # ()
    
    my_range = range(2)
    print(tuple(my_range)) # (1, 2)
    print(tuple(my_range)) # (1, 2)
    
    
    
    1. 总结
    Python 3 的 range 对象不是迭代器。 是惰性可迭代对象
    
    1. 如果你知道你可以循环遍历某个对象,这是一个可迭代对象(iterable)。
    2. 如果你知道你正在循环遍历的对象是在循环的时候计算出来,那么这是一个惰性可迭代对象(lazy iterable)。
    3. 如果你知道你可以传递一些东西给 next 函数,它就是一个迭代器(这是最常见的惰性可迭代对象)。
    4. 如果你可以循环多次而不用「耗尽」它,它不是一个迭代器。
    5. 如果你不能将某些东西传递给 next 函数,那么它不是一个迭代器。 
    
    
    
    其他:
    https://blog.csdn.net/IaC743nj0b/article/details/79547122
    
    1. 不像生成器,range 对象有长度 : len(range(1000))
    2. 不像生成器,range 可以被索引:num=range(100) , num[-2]
    3. 不像生成器,询问他们是否包含某元素而不改变他们的状态
      0 in num //true
      0 in num //true
      0 in g  // true 【(i*2 for i in numb)】
      0 in g  // false
    4. range 是序列(如列表,元组和字符串),但并不包含任何内存中的内容,而是通过计算来回答问题。
      from collection.abc import Sequence
      isinstance([1,2],Sequence) //true
      isinstance([1,2],range(3)) //true
    
    

    3.关系【可迭代对象】【迭代器】【生成器】

    # 官方定义
    Iter-ables are able to be iterated over. 
    Iter-ators are the agents that perform the iteration.
    生成器(无论来自生成器函数还是生成器表达式)是一种创建迭代器的简单方法
    
    
    # 关系图
              |--迭代器--生成器
    可迭代对象  --序列(字符串,列表,元祖)
              |--字典
    
    1. python自带的迭代器
    enumerate、zip、reversed和其他一些内置函数会返回迭代器
    
    
  • 相关阅读:
    重构之重新组织函数(ExTract Method)
    设计模式之桥接模式
    设计模式原则之里氏替换原则
    设计模式原则之依赖倒置原则
    设计模式原则之接口隔离原则
    设计模式原则之单一职责原则
    编译php5.6
    wireshark总结
    Blu-Ray BRRip 和 BDRip 的区别
    openwrt虚拟机的network unreachable
  • 原文地址:https://www.cnblogs.com/amize/p/14020050.html
Copyright © 2011-2022 走看看