3

我正在从串行连接(pyserial)读取行,目前我正在使用 while 循环来读取行,然后对该输入执行一系列功能,然后将其存储在一个对象(范围查找器)中。

有人提到我应该将串行输入视为生成器,因为这就是在 python 中完成的方式。

有人对这个有经验么?
或者至少可以原则上解释如何实现这一目标?
为什么更好?纯粹是为了内存/速度吗?

编辑:

功能在哪里:

at_end()

来自?我越来越:

AttributeError: 'Serial' object has no attribute 'at_end'

如果我使用

while True:
    yield source.readline()

然后我得到输出。

4

3 回答 3

2

您可能会查看Iterator Types。基本上你实现了一个类:

class SerialReader(object):
    def __init__(self, source):
        super(SerialReader, self).__init__()
        self.source = source

    def next(self):
        """Provide next piece of data from the serial source."""
        # If we have no more data, we have to raise StopIteration exception
        if self.source.at_end():
            raise StopIteration
        else:
            return self.source.read()

    def __iter__(self):
        return self

reader = SerialReader(some_serial_source)

for data in reader:
    do_something_with_data(data)

优点是使用这种迭代器/生成器 - 您可以将它与任何接受迭代器的 python 方法一起使用:

  • 列表理解:sample = [data for data in serial_reader]
  • 迭代工具
  • 快速简单地转换为列表:list(serial_reader)- 将读取所有数据并返回一个列表
  • ... 多得多

迭代器是非常 Pythonic 的模式,你可以经常见面。许多 python 库都使用迭代器。

关于内存使用:假设您想使用另一个接受数据流的函数来处理您的源。您不必加载所有源数据,只需将生成器(迭代器)传递给处理函数,即可根据需要读取数据。

于 2012-04-12T14:30:20.043 回答
1

你应该做的是:

for x in myObject:
    # do stuff with x

这将迭代 myObject 中的值。为此,对象必须实现迭代器协议(请参阅http://docs.python.org/library/stdtypes.html#iterator-types)。这将适用于列表、元组、生成器、字典 ...

好处是您不需要索引,并且对象不必实现 __getitem__

于 2012-04-12T14:26:12.920 回答
0

Python 文档是最好的文档之一,所以我只会将您重定向到Generator 文档

是的,它纯粹是为了内存和速度。

于 2012-04-12T14:24:47.113 回答