我能让我的班级很好地使用Python'&引用;在;关键词?

我能让我的班级很好地使用Python'&引用;在;关键词?,python,Python,我即将进入Python使用经验的第5个小时左右,到目前为止,我对它的功能印象深刻。我目前的努力是对一个流类进行一次简短的尝试,其代码如下: class Stream: """A Basic class implementing the stream abstraction. """ def __init__(self,data,funct): self.current = data self._f = funct def stream

我即将进入Python使用经验的第5个小时左右,到目前为止,我对它的功能印象深刻。我目前的努力是对一个流类进行一次简短的尝试,其代码如下:

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
循环来干净地完成这项工作。我想为我自己的班级保持清洁。有没有什么方法可以实现,或者任何其他语言特性可以让我做到这一点?如果您能为新手提供任何答案或其他帮助,我们将不胜感激

-大卫

附言


对于那些想知道的人来说,有界流的动力是我尝试了内置的
range
函数,但是Python声称我想要查看的范围太大了。为了提高内存效率,我转向了流。

对于对象中x的迭代,您需要提供一个
\uuu iter\uuu
方法,该方法将返回一个新的迭代器

迭代器是一个对象,它有一个方法
next()
(Python 2)或
\uuuuuuuuuuuuuuu
(Python 3),当没有更多元素时,该方法返回下一个元素或引发
StopIteration
异常。(迭代器还应该有一个返回自身的方法
。)

提示:您通常不需要自己编写迭代器;在类上实现
\uuu iter\uu
的最简单方法是将其设为or,并从中返回一个生成器表达式(所有生成器都是迭代器)。也可以只返回从另一个对象获得的迭代器;
iter
内置在这里很有用


要测试对象中的x是否为
,需要提供
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

进一步阅读:

我尝试了内置范围函数,但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
>5范围内(10**9)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
记忆者
>>>X范围内为5(10**9)
真的
注释

  • 在Python3中,这甚至不是一个问题——xrange已经被删除,现在range与Python2.x中的xrange一样。)
  • xrange确实允许您创建非常大的范围,但不幸的是不能任意大。还有一个限度

作为@Kos答案的补充,具有更多的函数,允许您模拟其他类型,包括所提到的和方法的文档。

要将类转换为一个iterable,您需要添加此方法

def __iter__(self):
    while True:
        yield self.stream_pop()

请注意,这并不要求流有边界。它也适用于无界流

Python声称我想要查看的范围太大-您还记得Python是如何表达它的声明的吗?查看您的代码和由此产生的错误将非常有趣。您希望或计划如何定义
BoundedStream
类的边界?谢谢!这正是我想要的。谢谢大家的快速回答和良好的细节。不客气。如果你在左边勾上绿色的勾号,我会很高兴,这就是我们在上面标记已接受答案的方式。这也将标志着问题已经解决。