【问题标题】:How does the class of Object retuned by python in-built function Iter() look like?python内置函数Iter()重调的Object类是什么样子的?
【发布时间】: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,我再次感谢您为解释事情所做的努力。我已经编辑了我的实际问题并添加了一些代码。请查看代码并进行反思。

标签: python iterator


【解决方案1】:

尽管 Python 列表是可迭代的,但我们假设它们不是:

class MyList():

    class Iterator():
        def  __init__(self, lst):
            self.lst = lst
            self.index = -1
            self.max_index = len(lst)

        def __next__(self):
            self.index += 1
            if self.index == self.max_index:
                raise StopIteration()
            return self.lst[self.index]

    def __init__(self, lst):
        self.lst = lst

    def __iter__(self):
        return MyList.Iterator(self.lst)


l = MyList([0, 1, 2])
for i in l:
    for j in l:
        print (i, j)

打印:

0 0
0 1
0 2
1 0
1 1
1 2
2 0
2 1
2 2

重要提示

我应该提到,将 MyList 的迭代器实现为一个单独的类,该类保持其自己的迭代状态,这使您可以像上面的示例一样同时多次迭代 MyList 的实例。

【讨论】:

  • 这正是我的想法。当 for 循环在“l”上调用 iter() 时,返回另一个类 iterator() 对象,其中定义了 next()。我只需要知道它是如何返回具有不同类的对象的,现在它已被清除。我开始学习python只有两天了,我已经上瘾了。我没有编程背景,只是我在工程学位的第四学期学习了 C 编程。感谢大家帮助我。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-06
  • 1970-01-01
  • 2019-06-01
  • 2012-04-20
  • 2020-02-22
  • 2017-03-30
相关资源
最近更新 更多