python - 如何将输入视为生成器

标签 python input serial-port generator

我正在从串行连接 (pyserial) 读取线路,目前我正在使用 while 循环读取线路,然后对该输入执行一系列功能,然后将其存储在一个对象(测距仪)中.

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

有没有人有这方面的经验?
或者至少可以从原则上解释这是如何实现的?
为什么更好?纯粹是为了内存/速度?

编辑:

函数在哪里:

at_end()

从哪里来? 我得到:

AttributeError: 'Serial' 对象没有属性 'at_end'

如果我用

while True:
    yield source.readline()

然后我得到输出。

最佳答案

你可以看看 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 = [serial_reader 中数据的数据]
  • itertools
  • 快速简单地转换为列表:list(serial_reader) - 将读取所有数据并返回一个列表
  • ...更多

Iterator 是非常 pythonic 的模式,你可以经常遇到。许多 Python 库都使用迭代器。

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

关于python - 如何将输入视为生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10125435/

相关文章:

serial-port - Windows UWP Windows.Devices.SerialCommunication.SerialDevice 不工作

java - Java从串口读取文件

python - 为什么 python 中的打印格式化程序不完全相同?

python - 多个蓝牙设备扫描

html - 链接单选按钮和文本输入

Javascript:获取标签中具有特定 "for"的单选按钮标签

c++ - C++:如果没有来自串行端口的新数据,如何忽略ReadFile()?

python - 将 NLTK 分词器与 utf8 结合使用

python - conda env 创建失败?

javascript - 在angularjs中动态命名输入控件