⭐️Python内置函数bytearray()详解 基本用法 整数序列字节串字符串创建 特性与方法 可变性 转换 性能考虑 示例 进行位操作 处理网络数据 兼容性注意事项——《跟老吕学Python》

Python内置函数bytearray()详解 基本用法 整数序列字节串字符串创建 特性与方法 可变性 转换 性能考虑 示例 进行位操作 处理网络数据 兼容性注意事项——《跟老吕学Python》

Python内置函数bytearray()详解

一、概述


bytearray() 是 Python 的一个内置函数,用于创建一个可变字节序列。与 bytes 类型不同,bytearray 对象的内容是可以修改的。它主要用于在需要字节级别的数据操作时,提供一种更灵活、可变的存储方式。





二、基本用法


1. 创建空的 bytearray 对象


可以通过调用 bytearray() 并传入 0 作为参数来创建一个空的 bytearray 对象:

ba = bytearray()
print(ba)  # 输出: bytearray(b'')





2. 从整数序列创建 bytearray


bytearray() 也可以接受一个整数序列作为参数,这些整数将被视为字节(0-255 的范围):

ba = bytearray([65, 66, 67])
print(ba)  # 输出: bytearray(b'ABC')





3. 从字节串(bytes)创建 bytearray


bytearray() 还可以接受一个 bytes 类型的对象作为参数,并返回一个包含相同字节的 bytearray 对象:

b = bytes('ABC', 'utf-8')
ba = bytearray(b)
print(ba)  # 输出: bytearray(b'ABC')





4. 从字符串创建 bytearray


虽然 bytearray() 不直接接受字符串作为参数来创建对象,但可以通过将字符串首先转换为 bytes 然后再转换为 bytearray 来实现。这通常涉及到指定一个编码方式,如 ‘utf-8’:

s = "ABC"
ba = bytearray(s.encode('utf-8'))
print(ba)  # 输出: bytearray(b'ABC')





三、特性与方法


1. 可变性


bytearray 对象的最大特性是其内容的可变性。这意味着你可以修改其中的字节:

ba = bytearray(b'ABC')
ba[0] = 68  # 将第一个字节修改为 'D' 的 ASCII 值
print(ba)  # 输出: bytearray(b'DBC')





2. 方法


bytearray 类提供了许多方法来操作字节序列,例如:

  • append(int): 在末尾添加一个字节。
  • extend(iterable_int):: 在末尾添加多个字节。
  • insert(index, int): 在指定索引处插入一个字节。
  • remove(int): 移除第一个出现的指定字节。
  • pop([index]): 移除并返回指定索引处的字节(默认为最后一个)。

以及许多其他与 bytes 类型类似的方法,如 count(), index(), startswith(), endswith(), find(), rfind(), split(), join(), replace(), strip(), lstrip(), rstrip(), 等等。

下面,我们将通过一些示例来展示这些方法的用法:

# 创建一个 bytearray 对象
ba = bytearray(b'hello')

# 使用 append 方法添加一个字节
ba.append(ord('!'))
print(ba)  # 输出: bytearray(b'hello!')

# 使用 extend 方法添加多个字节
ba.extend(b' world')
print(ba)  # 输出: bytearray(b'hello! world')

# 使用 insert 方法在指定索引处插入一个字节
ba.insert(6, ord(' '))  # 在 '!' 和 'w' 之间插入一个空格
print(ba)  # 输出: bytearray(b'hello! world')

# 注意,尽管我们插入了一个空格,但由于之前已经有了一个空格,所以结果是相同的

# 使用 remove 方法移除第一个出现的指定字节
ba.remove(ord(' '))  # 移除第一个空格
print(ba)  # 输出: bytearray(b'hello!world')

# 使用 pop 方法移除并返回指定索引处的字节
byte_removed = ba.pop(5)  # 移除 '!' 并返回它
print(byte_removed)  # 输出: 104('h' 的 ASCII 值)
print(ba)  # 输出: bytearray(b'helloorld')

# 使用其他方法,如 count
count = ba.count(ord('o'))
print(count)  # 输出: 2,因为 'o' 出现了两次

# 使用 replace 方法
ba = ba.replace(ord('o'), ord('0'))
print(ba)  # 输出: bytearray(b'hell00rld')

# 注意:这些示例展示了如何使用 bytearray 对象中的方法。由于 bytearray 对象是可变的,你可以修改其内容。而 bytes 对象是不可变的,因此没有这些方法。`

这些示例展示了 bytearray 类的强大功能,它允许你以灵活的方式操作字节序列。无论是在网络通信、文件操作,还是在其他需要处理二进制数据的场合中,bytearray 都是一个非常有用的工具。





3. 转换


你可以使用 bytes() 函数将 bytearray 对象转换回 bytes 类型,这是不可逆的,因为 bytes 对象是不可变的:

ba = bytearray(b'ABC')
b = bytes(ba)
print(b)  # 输出: b'ABC'

同时,你也可以使用 str() 函数将 bytearray 对象(或其对应的 bytes 对象)解码为字符串,但你需要指定正确的编码方式:

ba = bytearray(b'ABC')
s = ba.decode('utf-8')
print(s)  # 输出: 'ABC'





四、性能考虑


尽管 bytearray 提供了字节序列的可变性,但在某些情况下,如果你知道你的数据在创建后不会改变,使用 bytes 可能会更加高效。bytes 对象是不可变的,这意味着它们可以被缓存和共享,而不需要担心它们的内容会被意外修改。

在处理大量数据或需要高性能的场合,选择正确的数据类型可以显著提高代码的执行效率。





五、示例


示例 1:使用 bytearray 进行位操作


由于 bytearray 对象的内容是可变的,因此它非常适合用于需要频繁修改字节序列的位操作。例如,你可以使用 bytearray 来存储一个二进制数,并通过修改其字节值来改变这个数。

# 创建一个表示二进制数 10110011 的 bytearray 对象
ba = bytearray([0b10110011])

# 打印初始值
print(ba)  # 输出: bytearray(b'\xb3')

# 修改第一个字节的最低位为 0
ba[0] &= ~1

# 打印修改后的值
print(ba)  # 输出: bytearray(b'\xb2')





示例 2:使用 bytearray 处理网络数据


在网络编程中,你经常需要处理字节级别的数据。bytearray 提供了一种方便的方式来存储和修改这些数据。例如,你可以使用 bytearray 来构建一个 TCP/IP 数据包,并在发送之前修改其头部信息。

# 创建一个空的 bytearray 对象来存储数据包
packet = bytearray()

# 添加一些头部信息(这里只是示例数据)
packet.extend([0x45, 0x00, 0x00, 0x1c, ...])

# 添加一些有效载荷数据(这里只是一个简单的字符串)
payload = 'Hello, world!'.encode('utf-8')
packet.extend(payload)

# 在发送之前,你可能需要修改头部信息中的某些字段(如校验和)
# ...

# 发送数据包(这里只是示例,实际发送方式取决于你使用的网络库或框架)
# send(packet)





六、兼容性


bytearray在Python 2.6及更高版本中可用,并且其行为在所有支持的Python版本中都是一致的。这意味着无论你是在使用Python 2.x的晚期版本还是Python 3.x的任何一个版本,你都可以安心地使用bytearray来处理字节序列。





七、注意事项


当使用bytearraydecode()方法将字节序列转换为字符串时,需要确保字节序列是有效的UTF-8(或其他指定编码)编码。否则,decode()方法可能会引发UnicodeDecodeError异常。这是因为decode()方法试图根据给定的编码来解读字节序列中的字节,并将其转换为相应的Unicode字符。如果字节序列不符合给定的编码规范,解码过程就会失败并抛出异常。

除了decode()方法外,bytearray还提供了许多其他有用的方法,如append()用于在末尾添加单个字节,extend()用于在末尾添加另一个字节序列,insert()用于在指定位置插入字节等。此外,你还可以像操作列表一样操作bytearray,如使用索引访问和修改元素,使用切片获取子序列等。

然而,尽管bytearray提供了很多方便的功能,但在使用时还是需要注意一些细节。例如,由于bytearray是可变的,因此在多线程环境中使用时需要特别小心,以避免出现竞态条件。此外,由于bytearray中的元素是字节,因此在进行算术运算时需要注意溢出问题。





总结


bytearray() 是 Python 中一个强大的内置函数,它允许你创建可变字节序列。与 bytes 类型相比,bytearray 提供了更多的灵活性和可修改性,这使得它在需要动态修改字节序列的场合特别有用。然而,由于 bytearray 的可变性,它可能在某些情况下不如 bytes 类型高效,因为 bytes 对象是不可变的,可以被缓存和共享。因此,在选择使用 bytearray 还是 bytes 时,你应该根据你的具体需求和数据的使用模式来做出决策。





### PyCharm 打开文件显示全的解决方案 当遇到PyCharm打开文件显示全的情况时,可以尝试以下几种方法来解决问题。 #### 方法一:清理缓存并重启IDE 有时IDE内部缓存可能导致文件加载异常。通过清除缓存再启动程序能够有效改善此状况。具体操作路径为`File -> Invalidate Caches / Restart...`,之后按照提示完成相应动作即可[^1]。 #### 方法二:调整编辑器字体设置 如果是因为字体原因造成的内容显示问题,则可以通过修改编辑区内的文字样式来进行修复。进入`Settings/Preferences | Editor | Font`选项卡内更改合适的字号大小以及启用抗锯齿功能等参数配置[^2]。 #### 方法三:检查项目结构配置 对于某些特定场景下的源码视图缺失现象,可能是由于当前工作空间未能正确识别全部模块所引起。此时应该核查Project Structure的Content Roots设定项是否涵盖了整个工程根目录;必要时可手动添加遗漏部分,并保存变更生效[^3]。 ```python # 示例代码用于展示如何获取当前项目的根路径,在实际应用中可根据需求调用该函数辅助排查问题 import os def get_project_root(): current_file = os.path.abspath(__file__) project_dir = os.path.dirname(current_file) while not os.path.exists(os.path.join(project_dir, '.idea')): parent_dir = os.path.dirname(project_dir) if parent_dir == project_dir: break project_dir = parent_dir return project_dir print(f"Current Project Root Directory is {get_project_root()}") ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Python老吕

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值