Python 谁能告诉我为什么存在对象I';你创造了什么?

Python 谁能告诉我为什么存在对象I';你创造了什么?,python,iterator,Python,Iterator,我是Python新手,现在我正在学习迭代器和iterables。有人能告诉我为什么当我运行这段代码时,程序会输出数字直到无穷大吗?我的主要问题是为什么我创建的对象会在for循环中迭代?当我在[1,2,3]中说for item时,obj1中哪个是迭代的“item”我知道在每次迭代中,项目都是列表中的编号,但在这里?非常感谢你的帮助,因为我非常困惑 class Inter: def __init__(self,value): self.value = value def __ite

我是Python新手,现在我正在学习迭代器和iterables。有人能告诉我为什么当我运行这段代码时,程序会输出数字直到无穷大吗?我的主要问题是为什么我创建的对象会在for循环中迭代?当我在[1,2,3]中说for item时,obj1中哪个是迭代的“item”我知道在每次迭代中,项目都是列表中的编号,但在这里?非常感谢你的帮助,因为我非常困惑

class Inter:
  def __init__(self,value):
    self.value = value

  def __iter__(self):
    return self

  def __next__(self):
    count = self.value
    self.value +=1
    return count


obj1 = Inter(1)
for item in obj1:
   print(item)

for
循环总是调用
iter
来获取
obj1
的迭代器。粗略地说,循环与

obj_iter = iter(obj1)  # obj_iter = obj1.__iter__()
while True:
    try:
        item = next(obj_iter)  # item = obj_iter.__next__()
    except StopIteration:
        break
    print(item)
obj_iter
obj1的返回值。
obj1
(因此
obj1
本身)

next(obj\u iter)
obj\u iter.\uuuu next\uuuu()
的返回值。您的
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu;它总是返回一些新值

演示使用<代码>停止迭代< /代码>,考虑只产生小于10的有限流:

  def __next__(self):
    count = self.value
    if count >= 10:
        raise StopIteration
    self.value +=1
    return count
def\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
计数=自我价值
如果计数>=10:
提出停止迭代
self.value+=1
返回计数

请注意:

  • Inter
    的实例是可编辑的,因为已定义了
    \uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
    。iterable是知道如何生成或获取迭代器的东西
  • Inter
    的一个实例是迭代器,因为定义了
    \uuuuuuuuuuuuuuuuuuuuuuuuuu
    。迭代器是知道如何从iterable生成下一个值的东西
  • 所有迭代器类型也可以(并且按照惯例)使其可移植 通过定义
    \uuu iter\uu=lambda self:self
    :迭代器本身是可迭代的
  • 不过,并非所有iterable类型都是迭代器<代码>列表。\uuuu iter\uuuu
  • 没有 返回列表;它返回
    列表迭代器的一个实例。该实例保留对原始列表的引用,并保持其自身的状态
    有关
    列表迭代器的定义,请参见
    
    for
    循环总是调用
    iter
    来获取
    obj1
    的迭代器。粗略地说,循环与

    obj_iter = iter(obj1)  # obj_iter = obj1.__iter__()
    while True:
        try:
            item = next(obj_iter)  # item = obj_iter.__next__()
        except StopIteration:
            break
        print(item)
    
    obj_iter
    obj1的返回值。
    obj1
    (因此
    obj1
    本身)

    next(obj\u iter)
    obj\u iter.\uuuu next\uuuu()
    的返回值。您的
    \uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu;它总是返回一些新值

    演示使用<代码>停止迭代< /代码>,考虑只产生小于10的有限流:

      def __next__(self):
        count = self.value
        if count >= 10:
            raise StopIteration
        self.value +=1
        return count
    def\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
    计数=自我价值
    如果计数>=10:
    提出停止迭代
    self.value+=1
    返回计数

    请注意:

  • Inter
    的实例是可编辑的,因为已定义了
    \uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
    。iterable是知道如何生成或获取迭代器的东西
  • Inter
    的一个实例是迭代器,因为定义了
    \uuuuuuuuuuuuuuuuuuuuuuuuuu
    。迭代器是知道如何从iterable生成下一个值的东西
  • 所有迭代器类型也可以(并且按照惯例)使其可移植 通过定义
    \uuu iter\uu=lambda self:self
    :迭代器本身是可迭代的
  • 不过,并非所有iterable类型都是迭代器<代码>列表。\uuuu iter\uuuu
  • 没有 返回列表;它返回
    列表迭代器的一个实例。该实例保留对原始列表的引用,并保持其自身的状态
    有关
    列表迭代器的定义,请参见
    
    要使迭代停止,当您到达末尾时,需要在
    \uuu next\uuu()
    方法中
    提出StopIteration
    (但是,在您的案例中可能会定义“end”-您发布的代码在您希望它结束时并不明显)@jasonharper我很感激你的回答,但这不是我要解决的问题。我的问题是obj1中哪个项在for循环中迭代?在“for item In obj1:print(item)正在发生什么并打印出所有的数字?不断重复的项目是什么?您的对象不断被要求提供
    \uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
    方法返回-在您的情况下,
    self.value
    的递增值。要使迭代停止,您需要在
    方法中
    提升StopIteration
    。\uuuuu next\uuuu()
    方法,当您到达终点时(但是“终点”可能在您的情况下被定义-从您发布的代码中看不明显,您可能希望它结束)@jasonharper我很感谢你的回答,但这不是我要解决的问题。我的问题是obj1中哪个项目在for循环中迭代?在“for item in obj1:print(item)”行中发生了什么并打印出了所有的数字?不断重复的项目是什么?您的对象不断地被要求输入
    \uuuu next\uuuu
    项目,直到它引发
    停止迭代。迭代器就是这样做的。迭代产生的值是
    \uuuu next\uuuu()
    方法返回的值-在您的情况下,
    self.value
    的递增值。非常感谢!现在对我来说更清楚了,因为它在开始时非常混乱。只有最后一个问题..这意味着在每次迭代中,迭代器都是同一个对象本身(obj1)?正确。
    for
    循环在迭代真正开始之前获得一次迭代器。非常感谢!现在对我来说更清楚了,因为它在开始时非常混乱。只有最后一个问题..这意味着在每次迭代中,迭代器都是同一个对象本身(obj1)?正确。
    for
    循环在之前获取一次迭代器