我要花费大约5个小时的Python经验,到目前为止,我对它的功能印象非常深刻。我目前的努力是对Stream类进行简短的尝试,其代码如下:
class Stream:
"""A Basic class implementing the stream abstraction. """
def __init__(self,data,funct):
self.current = data
self._f = funct
def stream_first(self):
"""Returns the first element of the stream"""
return self.current
def stream_pop(self):
"""Removes and returns the first element of the stream. """
temp = self.current
self.current = self._f(self.current)
return temp
在那里享受适度的成功,我试图创建一个BoundedStream类,其行为基本上类似于无界的类,除了在某个点上它用完了元素。我现在的问题是,看到任何这样的有界流有一些有限数量的元素,应该可以迭代它们。如果我使用的是显式列表,我可以使用Python的in
关键字和for
循环来干净利落地执行此操作。我想为自己的班级保持清洁。是否有一些我可以实现的方法,或任何其他语言功能,这将允许我这样做?您可能会向新手提供的任何答案或其他帮助将不胜感激!
-David
P.S。
对于那些想要了解的人来说,有界流的推动力是我尝试了内置range
函数,但Python声称我想看的范围太大了。为了提高记忆效率,我已转向Streams。
答案 0 :(得分:10)
对于在for x in object
中进行迭代,您需要提供一个__iter__
方法,该方法将返回一个新的迭代器。
迭代器是一个对象,它有一个方法next()
(Python 2)或__next__
(Python 3),它返回下一个元素或在没有更多时引发StopIteration
异常元素。 (迭代器也应该有一个返回自身的方法__iter__
。)
提示:您通常不需要自己编写迭代器代码;在类上实现
__iter__
的最简单方法是使其成为generator function
或从中返回生成器表达式(所有生成器都是迭代器)。你也可以只返回从另一个对象获得的迭代器;iter
内置版在这里很有帮助。
要测试if x in object
,您需要提供__contains__
方法。
答案 1 :(得分:4)
我尝试了内置范围功能,但Python声称我想看的范围太大了。
请尝试使用xrange
。这需要O(1)内存,因为它实际上并不创建数字列表,它只是创建一个行为类似于数字列表的对象。换句话说,您正在尝试做的事情已经可用。
>>> 5 in range(10**9)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
MemoryError
>>> 5 in xrange(10**9)
True
注释
答案 2 :(得分:2)
作为@Kos答案的附录,Python Data model有更多功能可以让您模拟其他类型,包括所提到的__contains__
和__iter__
方法的文档。
答案 3 :(得分:2)
要将您的类变为可迭代,您需要添加此方法
def __iter__(self):
while True:
yield self.stream_pop()
请注意,这不需要限制流。它也适用于无限流的