Python lambda中的字节串联

Python lambda中的字节串联,python,python-3.x,lambda,Python,Python 3.x,Lambda,假设我有以下链条: bchain = b'\x00\x01\x02\x03\x04\x05\x06\x07\x08' 然后我为这个链创建一个迭代器: iterator = iter(bchain) 我想做的是获得bchain的前4个字节,但是使用迭代器并耗尽它。在lambda表达式中这样做 我曾尝试: lambda iterator: b''.join(next(iterator) for i in range(4)) 但是我得到了这个错误 TypeError: sequence item

假设我有以下链条:

bchain = b'\x00\x01\x02\x03\x04\x05\x06\x07\x08'
然后我为这个链创建一个迭代器:

iterator = iter(bchain)
我想做的是获得bchain的前4个字节,但是使用迭代器并耗尽它。在lambda表达式中这样做

我曾尝试:

lambda iterator: b''.join(next(iterator) for i in range(4))
但是我得到了这个错误

TypeError: sequence item 0: expected bytes, bytearray, or an object with the buffer interface, int found
似乎next(迭代器)给出了链中下一个字节表示的int,而不是字节本身。在这种情况下,lambda应该输出

b'\x00\x01\x02\x03'
感谢

,正如文档中所解释的:

虽然字节文字和表示基于ASCII文本,但字节对象的行为实际上类似于不可变的整数序列

换句话说,如果
b=b'abcd'
,那么
b[0]
next(iter(b))
97,而不是
b'a'

如果要从一个小整数组成的iterable构造一个
字节
对象,请不要使用
b'
,只需调用构造函数:

bytes(next(iterator) for i in range(4))
当然,一种更简单的方法是只对
字节进行切片:

bchain[:4]
或者,如果您想处理任何小整数的iterable,而不仅仅是
字节
,请使用:



正如J.F.塞巴斯蒂安所指出的,这就是为什么包括
iterbytes
。假设它被添加到Python3.5中,您可以使用
b.iterbytes()
——或者,如果
b
只是“一些
bytes
——就像iterable”,
memoryview(b).iterbytes()
——而不是
iter(b)
,那么您一开始就不会有这个问题了。

您只想要前4个字节吗?您已经知道了,把你的问题复杂化了。您想知道如何干净地编写此代码,还是想知道现有代码无法工作的原因?
bytes(下一个(迭代器)用于范围(4)中的i)
。非常感谢。我考虑过slice,但它不会增加迭代器本身以进行进一步的操作。@RobeInvalier:正如我在回答中所说的“如果你想让它在任何iterable上工作…,请使用包含迭代器的
islice
”。
iterator=bchain.iterbytes()
bytes(itertools.islice(bchain, 4))