【生成器】【迭代器】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和其他一些内置函数会返回迭代器

原文地址:https://www.cnblogs.com/amize/p/14020050.html