我正在尝试表示一系列均匀间隔的浮点数,一个算术级数,从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
这是一种明智的做法还是我在推动轮子?
答案 0 :(得分:3)
嗯,你做错的一件事是它应该是for i, x in enumerate(a): print i, x
。
另外,我可能会使用生成器方法而不是使用__iter__
和next()
方法的麻烦,特别是因为您的解决方案不允许您迭代相同的{{1}两个不同的迭代器同时两次(因为mylist
是该类的本地)。
这可能是一个更好的解决方案,它为您提供随机访问以及高效的迭代器。对self._i
和in
运算符的支持作为奖励投放:)
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
还有几件事:
class MyList
或class Mylist
。 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())