【发布时间】:2019-10-25 17:29:01
【问题描述】:
让我们从我的问题开始:你能写出比下面的代码更好的代码吗?
FRAME_DELIMITER = b'\x0a\x0b\x0c\x0d'
def get_data():
f = bytearray();
# detect frame delimiter
while True:
f += read_byte()
if f[-4:] == FRAME_DELIMITER:
start = len(f)-2
break
# read data until next frame delimiter
while True:
f += self._read_byte()
if f[-4:] == FRAME_DELIMITER:
return f[start:-2]
简而言之,此代码正在读取数据流并返回整个帧。每帧由 0x0a 0x0b 0x0c 分隔。read_byte 函数读取数据流上的一个字节(也许可以方便地检索 x 字节的缓冲区)。
我查看了 Python 文档以尝试以更 Python 的方式编写此代码(以及更好的性能?)。
我来到了生成器和迭代器。
我们可以想象创建一个像这样的生成器:
def my_generator(self):
while True:
yield self._read_byte()
并玩弄像这样的列表理解和迭代工具:
f = b''.join(itertools.takewhile(lambda c: c != b'\x03', self.my_generator()))
但实际上我被卡住了,因为我需要检查分隔符模式而不仅仅是一个字符。 你能帮我指明正确的方向吗……或者我上面的代码正是我需要的?!
谢谢!
【问题讨论】:
-
回答你的问题“你能写出比下面那个更好的代码吗?”:是的,我能写出比这个更好的代码;)。问一个反问题:你写的东西有问题吗?有什么问题?
-
我写的代码没问题。只是寻找一种更现代的、pythonic 的方式,如果我能获得更好的执行性能。
-
刚刚编辑了上面的问题以纠正关于模式长度(4字节)的错误。 read_byte 函数返回一个字节(我也可以决定读取 n 个字节)。
-
这种问题更适合codereview.stackexchange.com。它实际上是关于堆栈溢出的题外话。
标签: python python-3.x loops