我能让我的班级很好地使用Python'&引用;在;关键词?
我即将进入Python使用经验的第5个小时左右,到目前为止,我对它的功能印象深刻。我目前的努力是对一个流类进行一次简短的尝试,其代码如下:我能让我的班级很好地使用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
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
类的边界?谢谢!这正是我想要的。谢谢大家的快速回答和良好的细节。不客气。如果你在左边勾上绿色的勾号,我会很高兴,这就是我们在上面标记已接受答案的方式。这也将标志着问题已经解决。