【问题标题】:Python iterator next methodPython迭代器下一个方法
【发布时间】:2021-12-09 15:52:50
【问题描述】:

Zen of Python 声明:

应该有一种——最好只有一种——明显的方法。

现在,给定以下内容:

nums = [2, 3, 4]
it = iter(nums)
it.__next__() 
next(it)

最后两个语句有什么区别?它们都返回迭代器中的下一项而不更改迭代器对象。我看到.__next__() 可以用来创建迭代器对象。这是唯一的区别吗?

【问题讨论】:

  • next(it) 是明确的方法,而不是使用 dunder 方法(next(it) 在内部调用 it 对象的 __next__ 方法),与 @ 的方法相同987654328@不是a.__add__(b)
  • “不改变迭代器对象”——不正确。
  • __next__next 函数实现的一部分。 next 显然是您应该使用的。
  • 在错误处理方面存在差异。假设您有一些变量 X,由于某些编码错误,它不是迭代器。在尝试直接访问 dunder 函数的情况下,您将获得 AttributeError,而如果您在其上调用 next(),您将获得 TypeError。此外,虽然不太可能,但使用 next() 允许更改底层实现。使用 next()
  • @don'ttalkjustcode 我的意思是对象的身份在操作之后被保留了。

标签: python iterator


【解决方案1】:

next() 用于获取序列中的下一项,如果在末尾则使用StopIteration 异常。

next() 通过调用类中定义的__next__() 方法来实现。

一个例子

class my_list():
    def __init__(self):
        self.data = [1, 2, 3, 4, 5, 6]
        self.pointer = 0

    def __next__(self):
        if self.pointer >= len(self.data):
            self.pointer = 0
            raise StopIteration # to stop the iteration
        item = self.data[self.pointer]
        self.pointer += 1
        return item
    
my_list_obj = my_list()
print(next(my_list_obj)) # use next() function to call __next__()
print(next(my_list_obj))
print(next(my_list_obj))
print(next(my_list_obj))
print(next(my_list_obj))
print(next(my_list_obj))
print(next(my_list_obj, "empty")) # to print default value at the end

给出输出

1
2
3
4
5
6
empty

.__next__由用户定义返回下一个对象

next().__next__ 的方法包装器

+ 运算符调用__add__ 相同

【讨论】:

  • 无论如何,所有这些都没有正确实现。重要的是__next__ 不会使对象可迭代
  • 你的意思是def __iter__() 不见了?
猜你喜欢
  • 2021-10-05
  • 2011-08-21
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 2014-12-12
  • 2013-06-17
  • 2012-12-24
相关资源
最近更新 更多