【问题标题】:How to raise IndexError in two iterable objects when iterating over them with zip()使用 zip() 迭代两个可迭代对象时如何在两个可迭代对象中引发 IndexError
【发布时间】:2019-12-03 11:14:38
【问题描述】:

出于学习目的,我尝试实现一个类,该类执行标准 Python 中 numpy 数组的一些基本功能。但是,如果我对数组类型的两个对象使用操作(加、减、乘、真除法),它的行为就会不正确。在这种情况下,它会在返回正确结果和返回 arr 类型的空对象之间交替。

class arr:

    def __init__(self, vals):
        self.vals = vals
        self.idx = 0

    def __repr__(self):
        return f'arr({self.vals})'

    def __add__(self, new_value):
        if type(new_value) in [int, float]:
            return arr([val + new_value for val in self.vals])
        if type(new_value)==arr:
            return arr([val + new_val for val, new_val in zip(self.vals, new_value)])

    def __sub__(self, new_value):
        if type(new_value) in [int, float]:
            return arr([val - new_value for val in self.vals])
        if type(new_value)==arr:
            return arr([val - new_val for val, new_val in zip(self.vals, new_value)])

    def __mul__(self, new_value):
        if type(new_value) in [int, float]:
            return arr([val * new_value for val in self.vals])
        if type(new_value)==arr:
            return arr([val * new_val for val, new_val in zip(self.vals, new_value)])

    def __truediv__(self, new_value):
        if type(new_value) in [int, float]:
            return arr([val / new_value for val in self.vals])
        if type(new_value)==arr:
            return arr([val / new_val for val, new_val in zip(self.vals, new_value)])

    def __iter__(self):
        return self

    def __next__(self):
        self.idx += 1
        try:
            return self.vals[self.idx - 1]
        except IndexError:
            self.idx = 0
            raise StopIteration

    def __len__(self):
        return len(self.vals)

我可以追溯到这样一个事实,即当我例如添加两个这样的数组,第二个数组的 idx 变量不会在我使用这样的操作时每秒钟设置回 0。我怀疑使用 zip() 函数的列表理解只会引发两个数组中的第一个的 StopIteration 错误并在它可以为第二个数组引发它之前停止?如何正确实施?

【问题讨论】:

  • __iter__ 更改为return iter(self.vals)?您还可以将self.idx 重置为0 inside __iter__
  • 所以如果我理解正确,__iter__ 会在每次新迭代开始时被调用?无论如何,你的第二个解决方案对我有用,但第一个没有。

标签: python arrays oop iterator


【解决方案1】:

看看如何在python中正确实现一个迭代器:https://www.programiz.com/python-programming/iterator,看来你还需要在__iter__()方法中初始化索引。

【讨论】:

    猜你喜欢
    • 2019-06-03
    • 2023-03-07
    • 1970-01-01
    • 2016-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-23
    相关资源
    最近更新 更多