我正在从串行连接(pyserial)读取行,目前我正在使用while循环读取该行,然后对该输入执行一系列函数,然后将其存储在对象(范围查找器)中
有人提到我应该将串行输入视为生成器,因为这就是在python中完成的事情。
有没有人有这方面的经验?
或者至少可以原则上解释如何实现这一目标?
为什么它更好?这纯粹是为了记忆/速度吗?
编辑:
功能在哪里:
at_end()
来自哪里? 我得到了:
AttributeError: 'Serial' object has no attribute 'at_end'
如果我使用
while True:
yield source.readline()
然后我得到输出。
答案 0 :(得分: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库都使用迭代器。
关于内存使用:假设您想要使用另一个接受数据流的函数来处理您的源代码。您不必加载所有源数据,只需将生成器(迭代器)传递给处理函数,即可根据需要读取数据。
答案 1 :(得分:1)
你应该做的是:
for x in myObject:
# do stuff with x
这将迭代myObject中的值。为此,对象必须实现迭代器协议(请参阅http://docs.python.org/library/stdtypes.html#iterator-types)。这将适用于列表,元组,生成器,字典......
好消息是你不需要索引,并且该对象不必实现__getitem__
答案 2 :(得分:0)
Python文档是最好的文档之一,因此我只是将您重定向到Generator documentation
是的,它纯粹是为了记忆和速度。