【发布时间】:2020-05-19 12:54:32
【问题描述】:
我是 Python 新手,我了解可迭代对象和迭代器对象的概念。我知道所有迭代器都是迭代器本身,但并非所有迭代器都是迭代器,就像列表一样。我的问题是,当我们在一个没有定义 next() 方法的可迭代对象上调用 iter() 时,幕后会发生什么。显然 iter() 返回另一个定义了 next() 方法的对象。 iter() 如何将参数作为列表并返回一个属于 python 的内置 iter 类的对象,该类定义了 next() 方法。 谢谢
def python_iterator(list_without_next_method):
class iter2:
def __init__(self, lst):
self.lst=lst
self.n=0
def __nekst__(self):
b=self.lst[self.n]
self.n += 1
return b
iterator_object=iter2(list_without_next_method)
return iterator_object
a=[1,2,3,4,5,6]
iterator=python_iterator(a)
print(iterator.__nekst__())
print(iterator.__nekst__())
print(iterator.__nekst__())
print(iterator.__nekst__())
print(iterator.__nekst__())
print(iterator.__nekst__())
print(iterator.__nekst__())
上面的代码是为了让我自己了解内置的 iter() 如何在幕后工作以创建一个包含 next() 方法的对象。我将自己的 iter 函数命名为“python_iterator "(类似于 iter())。当这个函数被调用时,它与内置的 iter() 完全一样,只是在我自己的 next() 函数 (nekst()) 中没有用于 Stopiteration 的代码。
【问题讨论】:
-
一般来说,可迭代对象没有定义了方法
__next__。根据有关可迭代对象的 Python 手册:一个能够一次返回其成员的对象。可迭代对象的示例包括所有序列类型(例如 list、str 和 tuple)和一些非序列类型,例如 dict、文件对象以及您使用 __iter__() 方法或使用 __getitem__() 方法定义的任何类的对象实现序列语义。 在特殊情况下,当类确实定义了__next__方法时,可迭代对象的__iter__方法将返回self。 -
(续)。那是当对象的迭代器是对象本身时。否则,
__iter__将返回一个单独的迭代器对象,该对象确实定义了__next__。另外:next(obj)导致调用:obj.__next__()。对象上没有定义next方法。 -
感谢您的回答。但正如你所说,iter() 如何返回“一个定义__next__() 的单独迭代器对象”?
-
通过...使用
return语句...返回...一些不同的对象...这样该对象的类...包含__next__的定义方法。它的意思正是它所说的;我不明白你有什么困惑。 -
亲爱的@KarlKnechtel,我再次感谢您为解释事情所做的努力。我已经编辑了我的实际问题并添加了一些代码。请查看代码并进行反思。