Python中的算术级数,不存储所有值

时间:2010-10-07 10:33:10

标签: python arrays numpy

我正在尝试表示一系列均匀间隔的浮点数,一个算术级数,从a0开始,元素为a0,a0 + a1,a0 + 2a1,a0 + 3a1,...... 这是numpy的arange()方法所做的,但它似乎为整个数组对象分配内存,我想使用迭代器类来实现它,它只存储a0,a1和n(元素的总数,可能很大)。 执行此操作的任何内容是否已存在于标准Python包中? 我找不到它,继续前进:

class mylist():
    def __init__(self, n, a0, a1):
        self._n = n
        self._a0 = a0
        self._a1 = a1

    def __getitem__(self, i):
        if i < 0 or i >= self._n:
            raise IndexError
        return self._a0 + i * self._a1

    def __iter__(self):
        self._i = 0
        return self

    def next(self):
        if self._i >= self._n:
            raise StopIteration
        value = self.__getitem__(self._i)
        self._i += 1
        return value

这是一种明智的做法还是我在推动轮子?

5 个答案:

答案 0 :(得分:3)

嗯,你做错的一件事是它应该是for i, x in enumerate(a): print i, x

另外,我可能会使用生成器方法而不是使用__iter__next()方法的麻烦,特别是因为您的解决方案不允许您迭代相同的{{1}两个不同的迭代器同时两次(因为mylist是该类的本地)。

这可能是一个更好的解决方案,它为您提供随机访问以及高效的迭代器。对self._iin运算符的支持作为奖励投放:)

len

答案 1 :(得分:3)

其他答案回答了当前的问题。请注意,如果你想要的只是一个迭代器并且你不需要随机访问,那么就不需要编写一个完整的迭代器类。

def mylist(n, a0, a1):
    for i in xrange(n):
        yield a0 + i*a1

答案 2 :(得分:1)

  

只是出于对那些人可能显而易见的原因,迭代mylist:for i,x in enumerate(a):print i,a不返回我期望的值但是只有很多引用mylist实例。我做错了什么?

罪魁祸首是print i,a。您正在打印a,这是一个数组。你应该打印x。 Chane这一行:

print i,x

还有几件事:

  1. 将您的班级名称更改为TitleCase。对于例如class MyListclass Mylist
  2. 如果您使用的是Python 2.x,最好从object继承。所以class MyList(object): ...

答案 3 :(得分:0)

您正在枚举a,因此打印它会打印出很多引用。请改为打印x

答案 4 :(得分:0)

是的,这里有一个built-in generator(Python 2.7及以上版本):

import itertools
mygen = itertools.count(a0,a1)

如果你还没有Python 2.7(Python 2.4及更高版本):

import itertools
mygen = (a0 + a1*i for i in itertools.count())