Python-3.12.0文档解读-内置函数bytes()详细说明+记忆策略+常用场景+巧妙用法+综合技巧

news2024/10/7 12:26:16


一个认为一切根源都是“自己不够强”的INTJ

个人主页:用哲学编程-CSDN博客
专栏:每日一题——举一反三
Python编程学习
Python内置函数

Python-3.12.0文档解读

目录

详细说明

概述

构造函数

参数说明

示例

字节串字面值

操作与方法

相关类型

记忆策略

1. 理解函数名的构成

2. 关联函数名与作用

常用场景

场景 1: 编码字符串为字节

场景 2: 创建固定长度的字节序列

场景 3: 处理二进制数据

场景 4: 字节数据的序列化和反序列化

场景 5: 字节数据的格式化和解析

巧妙用法

1. 生成随机字节序列

2. 字节序列的快速填充

3. 字节序列的编码和解码

4. 字节序列的位操作

综合技巧

1. 使用 zip 和 bytes 进行字节级操作

2. 使用 itertools 和 bytes 进行字节串的迭代处理

3. 使用 functools.reduce 和 bytes 进行字节串的累积操作


详细说明

概述

bytes 类返回一个新的“bytes”对象,这是一种不可变的序列,其包含的元素范围为 0 <= x < 256 的整数。bytes 是 bytearray 的不可变版本,提供了类似的操作方法,但其内容一旦创建便无法修改。bytes 对象支持索引和切片操作,可以通过多种方式构造,具体如下。

构造函数
  1. bytes(source=b''):
    • 默认构造函数,返回一个空的 bytes 对象。
    • 如果提供了 source 参数,则根据不同的类型创建对应的 bytes 对象。
  2. bytes(source, encoding):
    • 使用指定的字符编码将 source 转换为 bytes 对象。
    • source 应该是一个字符串类型,encoding 指定了编码方案(如 'utf-8','ascii' 等)。
  3. bytes(source, encoding, errors):
  • 与上述构造函数类似,但是多了一个 errors 参数,用于指定如何处理编码错误。
  • errors 参数可以是 'strict'(默认),'ignore','replace' 等等。
参数说明
  • source:
    • 字符串(str):需要提供 encoding 参数,将字符串编码为字节。
    • 整数(int):创建一个长度为 source 的零字节数组。
    • 可迭代对象:包括列表、元组等,元素必须是 0 到 255 之间的整数。
    • 缓冲区接口对象:如 bytes,bytearray,memoryview 等,可以直接转换为 bytes 对象。
  • encoding(可选):指定字符串编码,常用的编码方式有 utf-8,ascii,latin-1 等。
  • errors(可选):指定编码错误的处理方式,常见的取值有 strict,ignore,replace,xmlcharrefreplace,backslashreplace 等。
示例

# 使用字符串和编码构造 bytes 对象
s = "Hello, 世界"
b = bytes(s, 'utf-8')
print(b)  # 输出: b'Hello, \xe4\xb8\x96\xe7\x95\x8c'

# 从整数构造 bytes 对象
b = bytes(5)
print(b)  # 输出: b'\x00\x00\x00\x00\x00'

# 从可迭代对象构造 bytes 对象
b = bytes([65, 66, 67, 68])
print(b)  # 输出: b'ABCD'

# 通过缓冲区接口对象构造 bytes 对象
ba = bytearray(b'hello')
b = bytes(ba)
print(b)  # 输出: b'hello'
字节串字面值

bytes 对象可以通过字面值创建。字面值以 b 或 B 开头,后跟一对引号(单引号或双引号)包围的内容。例如,b'hello' 或 B"hello" 都是合法的字节串字面值。

b1 = b'hello'
b2 = B"hello"
print(b1 == b2)  # 输出: True
操作与方法

bytes 对象支持众多操作和方法,包括:

  • 索引和切片:
    b = b'hello'
    print(b[1])     # 输出: 101
    print(b[1:3])   # 输出: b'el'
  • 常用方法:
  • b.count(sub[, start[, end]]):返回子序列 sub 在 b 中出现的次数。
  • b.find(sub[, start[, end]]):返回子序列 sub 在 b 中第一次出现的位置。
  • b.replace(old, new[, count]):返回一个新的 bytes 对象,其中的 old 子序列被替换为 new。
  • b.split(sep=None, maxsplit=-1):将 b 拆分为一个列表。
  • b.decode(encoding='utf-8', errors='strict'):将 bytes 对象解码为字符串。

b = b'hello, world'
print(b.count(b'l'))          # 输出: 3
print(b.find(b'world'))       # 输出: 7
print(b.replace(b'world', b'Python'))  # 输出: b'hello, Python'
print(b.split(b', '))         # 输出: [b'hello', b'world']
print(b.decode('utf-8'))      # 输出: 'hello, world'
相关类型
  • bytearray:与 bytes 类似,但它是可变的。
  • memoryview:允许在不复制数据的情况下操作数组的切片,提供对缓冲区协议的支持。

通过 bytes 类,Python 提供了一种高效且灵活的方法来处理二进制数据。理解和掌握 bytes 类及其相关操作,对于在实际开发中进行文件处理、网络通信、数据加密等操作都有着重要的意义。


记忆策略

1. 理解函数名的构成

  • 分解函数名:将函数名分解为几个部分,每个部分代表一个概念或动作。例如,bytes 可以分解为 byte 和 s,其中 byte 表示单个字节,s 可能表示复数或序列。
  • 理解每个部分的含义:确保你理解每个部分在函数名中的作用。例如,byte 表示数据的最小单位,而 s 表示多个这样的单位。

2. 关联函数名与作用

  • 创建关联:将函数名与它的作用直接关联起来。例如,bytes 的作用是创建一个字节序列,因此你可以想象一个场景,其中需要将信息转换为字节序列。
  • 使用助记符:创建一个简短的助记符或缩写来帮助记忆。例如,bytes 可以简化为 b,然后你可以将 b 与“字节”(byte)联系起来。

常用场景

假设我们讨论的函数是 Python 中的 bytes 函数,它用于创建一个新的字节对象。以下是几个使用场景,每个场景都包含详细的代码和注释:

场景 1: 编码字符串为字节

在网络编程或文件处理中,经常需要将字符串编码为字节,以便进行传输或存储。

# 定义一个字符串
str_data = "Hello, World!"

# 使用 bytes 函数将字符串编码为字节,指定编码为 UTF-8
byte_data = bytes(str_data, 'utf-8')

# 打印字节数据
print(byte_data)  # 输出: b'Hello, World!'

场景 2: 创建固定长度的字节序列

在某些应用中,可能需要创建一个固定长度的字节序列,例如在加密或哈希操作中。

# 创建一个长度为10的字节序列,每个字节填充为0
byte_sequence = bytes(10)

# 打印字节序列
print(byte_sequence)  # 输出: b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'

场景 3: 处理二进制数据

在处理二进制文件(如图片、音频或视频文件)时,需要操作字节数据。

# 假设有一个二进制文件的路径
file_path = 'example.bin'

# 打开文件并读取其内容为字节
with open(file_path, 'rb') as file:
    binary_data = file.read()

# 打印读取的字节数据
print(binary_data)  # 输出文件内容的字节表示

场景 4: 字节数据的序列化和反序列化

在网络通信中,经常需要将数据序列化为字节,以便通过网络传输。

import pickle

# 定义一个 Python 对象
data_object = {'name': 'Alice', 'age': 30}

# 使用 pickle 将对象序列化为字节
serialized_data = pickle.dumps(data_object)

# 打印序列化后的字节数据
print(serialized_data)  # 输出: 序列化后的字节数据

# 使用 pickle 将字节反序列化为对象
deserialized_object = pickle.loads(serialized_data)

# 打印反序列化后的对象
print(deserialized_object)  # 输出: {'name': 'Alice', 'age': 30}

场景 5: 字节数据的格式化和解析

在处理某些协议或数据格式时,需要将数据格式化为字节或从字节解析数据。

import struct

# 定义一个包含整数和浮点数的数据包
data_packet = (123, 3.14)

# 使用 struct 将数据包格式化为字节
formatted_data = struct.pack('if', *data_packet)

# 打印格式化后的字节数据
print(formatted_data)  # 输出: b'{\x00\x00\x00\xf0?'

# 使用 struct 从字节解析数据
parsed_data = struct.unpack('if', formatted_data)

# 打印解析后的数据
print(parsed_data)  # 输出: (123, 3.14)

这些场景展示了 bytes 函数在不同情况下的应用,从简单的字符串编码到复杂的二进制数据处理。通过这些详细的代码示例,可以更好地理解和记忆 bytes 函数的使用方法。


巧妙用法

bytes 函数在 Python 中主要用于创建字节对象,通常用于处理二进制数据。虽然它的基本用法相对直接,但有一些巧妙的使用技巧可能不是每个人都能立即想到的。以下是一些较为巧妙的使用场景:

1. 生成随机字节序列

在需要生成随机字节序列的场景中,可以使用 bytes 函数结合 random 模块来创建随机数据。这在测试、加密或随机数生成等应用中非常有用。

import random

# 生成一个长度为16的随机字节序列
random_bytes = bytes([random.randint(0, 255) for _ in range(16)])

print(random_bytes)  # 输出: 一个16字节的随机序列

2. 字节序列的快速填充

在某些情况下,可能需要快速填充一个字节序列,例如在创建固定大小的数据包或缓冲区时。

# 创建一个长度为10的字节序列,每个字节填充为0xAA
fill_bytes = bytes([0xAA for _ in range(10)])

print(fill_bytes)  # 输出: b'\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa'

3. 字节序列的编码和解码

在处理网络协议或自定义数据格式时,可能需要手动编码和解码字节序列。

# 定义一个简单的编码规则:每个字符的ASCII值加1
def custom_encode(data):
    return bytes(ord(c) + 1 for c in data)

# 定义解码规则:每个字节的值减1
def custom_decode(data):
    return ''.join(chr(b - 1) for b in data)

# 编码字符串
encoded_data = custom_encode("Hello")
print(encoded_data)  # 输出: b'Ifmmp'

# 解码字节序列
decoded_data = custom_decode(encoded_data)
print(decoded_data)  # 输出: 'Hello'

4. 字节序列的位操作

在需要对字节序列进行位操作的场景中,bytes 函数可以与位操作符结合使用。

# 创建一个字节序列,然后对其进行位移操作
byte_data = bytes([0x01, 0x02, 0x04])

# 对每个字节进行左移操作
shifted_bytes = bytes(b << 1 for b in byte_data)

print(shifted_bytes)  # 输出: b'\x02\x04\x08'

这些技巧展示了 bytes 函数在处理字节数据时的灵活性和强大功能。通过结合其他 Python 特性和模块,bytes 函数可以用于解决各种复杂的编程问题。


综合技巧

在Python中,bytes 函数可以与多种其他函数和方法结合使用,以实现一些高效且巧妙的功能。以下是一些巧妙的使用示例:

1. 使用 zip 和 bytes 进行字节级操作

结合 zip 和 bytes,可以创建字节级的操作,例如交换字节的顺序。

def swap_bytes(data):
    # 假设data是偶数长度的字节串
    return bytes(a ^ b for a, b in zip(data[::2], data[1::2]))

data = bytes([0x11, 0x22, 0x33, 0x44, 0x55, 0x66])
swapped_data = swap_bytes(data)
print(swapped_data)  # 输出: b'\x00\x00\x00\x00\x00\x00'

2. 使用 itertools 和 bytes 进行字节串的迭代处理

结合 itertools 和 bytes,可以对字节串进行复杂的迭代处理。

import itertools

def generate_combinations(data, length):
    # 生成所有可能的长度为length的字节组合
    return [bytes(seq) for seq in itertools.product(data, repeat=length)]

data = bytes([0x00, 0xFF])
combinations = generate_combinations(data, 3)
for combo in combinations:
    print(combo)
    # 输出: b'\x00\x00\x00', b'\x00\x00\xFF', b'\x00\xFF\x00', b'\x00\xFF\xFF', b'\xFF\x00\x00', b'\xFF\x00\xFF', b'\xFF\xFF\x00', b'\xFF\xFF\xFF'

3. 使用 functools.reduce 和 bytes 进行字节串的累积操作

结合 functools.reduce 和 bytes,可以对字节串进行累积操作,例如字节串的累加。

import functools

def byte_accumulate(data):
    # 累积字节值
    return bytes(functools.reduce(lambda a, b: a + b, data))

data = bytes([0x11, 0x22, 0x33])
accumulated_data = byte_accumulate(data)
print(accumulated_data)  # 输出: b'\x66'

这些示例展示了如何巧妙地使用 bytes 函数与其他Python内置函数和模块结合,以实现高效和复杂的字节级操作。这些技巧在处理二进制数据、加密、网络通信等领域非常有用。


以上是本节全部内容,感谢阅读。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1716764.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

富凡行是什么软件,来具体聊一聊它的详情,感兴趣的不要错过了

目前做网络项目的人很多&#xff0c;也就衍生出了很多的软件、项目、平台。接触过了很多的产品&#xff0c;感触颇深&#xff0c;确实市面上的东西差别都很大&#xff0c;有好的&#xff0c;有不好的。 我也是喜欢在网上做点副业&#xff0c;自己捣鼓一下&#xff0c;毕竟互联网…

基于51单片机的温湿度控制系统

一.硬件方案 本设计采用51单片机每2秒钟从DHT11温湿度传感器中读入温度和湿度&#xff0c;在液晶屏上即时显示。液晶屏上同时显示温湿度上限值&#xff0c;该上限值保存外外部EEPROM存储器中&#xff0c;掉电不失&#xff0c;并且可以通过四只按键上调或下调。当温度或湿度值超…

Linux驱动开发笔记(二) 基于字符设备驱动的GPIO操作

文章目录 前言一、设备驱动的作用与本质1. 驱动的作用2. 有无操作系统的区别 二、内存管理单元MMU三、相关函数1. ioremap( )2. iounmap( )3. class_create( )4. class_destroy( ) 四、GPIO的基本知识1. GPIO的寄存器进行读写操作流程2. 引脚复用2. 定义GPIO寄存器物理地址 五、…

小红书图文笔记怎么做?纯干货!

小红书图文笔记的制作是一门艺术&#xff0c;它需要结合精美的图片和有价值的内容&#xff0c;以吸引和留住用户的注意力。伯乐网络传媒给大家分享制作小红书图文笔记的干货指南&#xff0c;包括准备、制作、发布和优化的各个环节。 一、准备阶段 确定目标受众&#xff1a;找到…

kubernetes-PV与PVC、存储卷

一、PV和PVC详解 当前&#xff0c;存储的方式和种类有很多&#xff0c;并且各种存储的参数也需要非常专业的技术人员才能够了解。在Kubernetes集群中&#xff0c;放了方便我们的使用和管理&#xff0c;Kubernetes提出了PV和PVC的概念&#xff0c;这样Kubernetes集群的管理人员就…

npm镜像源管理、nvm安装多版本node异常处理

查看当前使用的镜像源 npm config get registry --locationglobal 设置使用官方源 npm config set registry https://registry.npmjs.org/ --locationglobal 设置淘宝镜像源 npm config set registry https://registry.npm.taobao.org/ --locationglobal 需要更改淘宝镜像源地址…

uniapp登录成功后跳回原有页面+无感刷新token

uniapp登录成功后跳回原有页面 引言 在C端的页面场景中&#xff0c;我们经常会有几种情况到登录页&#xff1a; 区分需要登录和不用登录的页面&#xff0c;点击需要登录才能查看的页面 已经登录但是超时&#xff0c;用户凭证失效等原因 以上情况可以细分为两种&#xff0c;一…

自动化测试实践:揭秘WebSocket在接口测试中的应用

如何写接口自动化&#xff1f;这个问题&#xff0c;但凡涉足过自动化测试的人员都能娓娓道来。Requests、urlib、jmeter、curl等等&#xff0c;不在话下。那么&#xff0c;如何获取接口的url、参数、响应等信息呢&#xff1f;&#xff01;答案就更是随口而出&#xff1a;看接口…

必看项目|多维度揭示心力衰竭患者生存关键因素(生存分析、统计检验、随机森林)

1.项目背景 心力衰竭是一种严重的公共卫生问题,影响着全球数百万人的生活质量和寿命,心力衰竭的病因复杂多样,既有个体生理因素的影响,也受到环境和社会因素的制约,个体的生活方式、饮食结构和医疗状况在很大程度上决定了其心力衰竭的风险。在现代社会,随着生活水平的提…

利用英特尔 Gaudi 2 和至强 CPU 构建经济高效的企业级 RAG 应用

检索增强生成 (Retrieval Augmented Generation&#xff0c;RAG) 可将存储在外部数据库中的新鲜领域知识纳入大语言模型以增强其文本生成能力。其提供了一种将公司数据与训练期间语言模型学到的知识分开的方式&#xff0c;有助于我们在性能、准确性及安全隐私之间进行有效折衷。…

计算机网络-Traffic-Filter流量过滤策略

一、概述 为提高网络安全性&#xff0c;管理人员需要控制进入网络的流量&#xff0c;将不信任的报文丢弃在网络边界。所谓的不信任报文是指对用户来说存在安全隐患或者不愿意接收的报文。同时保证数据访问安全性&#xff0c;企业网络中经常会要求一些部门之间不能相互访问。 背…

金融行业专题|超融合对国密卡和国产加密技术的支持能力如何?

目前&#xff0c;不少金融机构都使用国密卡&#xff08;满足国密算法要求的加密卡&#xff09;和国产密码解决方案保障金融信息安全。而在传统虚拟化架构下&#xff0c;单块加密卡通常只能服务一个系统&#xff0c;经常会出现资源利用率低、加密处理性能不足等问题&#xff0c;…

神经网络与深度学习——第14章 深度强化学习

本文讨论的内容参考自《神经网络与深度学习》https://nndl.github.io/ 第14章 深度强化学习 深度强化学习 强化学习&#xff08;Reinforcement Learning&#xff0c;RL&#xff09;&#xff0c;也叫增强学习&#xff0c;是指一类从与环境交互中不断学习的问题以及解决这类问题…

最简单的安卓模拟器抓包?

安装模拟器抓包似乎是有个绕不开的话题&#xff0c;但是现在普遍的安卓模拟器抓包会遇到以下问题&#xff1a; 1.证书配置繁琐 2.模拟器不兼容软件 3.系统设置繁琐。 前几天写过一次微信小程序如何抓包&#xff0c;现在来讲一下模拟器怎么抓包吧。首先使用的工具还是TangGo测…

开源集运wms系统

集运WMS系统是一种专为集运业务设计的仓库管理系统&#xff0c;它能够高效地处理来自多个来源的货物&#xff0c;优化存储和发货流程。 经过长时间的开发和测试&#xff0c;推出了我的集运WMS系统。它不仅具备传统WMS系统的所有功能&#xff0c;还针对集运业务的特点进行了特别…

Python轻量级的插件框架库之pluginbase使用详解

概要 在软件开发中,插件系统是一个常见的需求。插件系统允许开发者动态加载和卸载功能模块,从而提高应用程序的灵活性和可扩展性。Python的pluginbase库是一个轻量级的插件框架,旨在简化插件系统的构建过程。pluginbase库提供了一套简单易用的API,使开发者能够快速集成插件…

初步研究Pose_300W_LP datasets.py

mat文件参数解读 Color_para&#xff1a;颜色参数&#xff0c;用于描述图像的颜色属性&#xff0c;比如图像的亮度、对比度等信息。 亮度属性、对比度属性、饱和度属性&#xff08;颜色越鲜艳&#xff09;、色调属性&#xff08;色调越偏向蓝色&#xff09;、色温属性&#xf…

结构体(自定义类型)

1.结构体 结构体这种自定义的数据类型&#xff0c;让程序员可以自己创造适合的类型 结构是一些值的集合&#xff0c;这些值称为成员变量&#xff0c;结构的每个成员可以是不同类型的变量&#xff0c;可以是标量&#xff0c;数组&#xff0c;指针甚至是其他结构体 1.1.1 结构…

六西格玛培训:企业逆袭的秘密武器!——张驰咨询

为了提升企业的运营效率、产品质量和客户满意度&#xff0c;六西格玛培训成为了一个不可或缺的环节。以下是企业成功实施六西格玛培训的关键步骤&#xff1a; 一、清晰设定培训目标 首先&#xff0c;企业应明确六西格玛培训的具体目标&#xff0c;如提升产品质量、降低成本、…

武汉城投城更公司与竹云科技签署战略协议,携手构建智慧城市新未来!

2024年5月16日&#xff0c;武汉城投城更公司与深圳竹云科技股份有限公司&#xff08;以下简称“竹云”&#xff09;签订战略合作协议&#xff0c;双方将深入推进产业项目合作。 签约现场&#xff0c;双方围绕产业项目合作方向、路径和内容等进行了全面深入交流。城投城更公司党…