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