- 译者序
- 前言
- 第1章 问答环节
- 第2章 Python 如何运行程序
- 第3章 如何运行程序
- 第4章 介绍 Python 对象类型
- 第5章 数字
- 第6章 动态类型简介
- 第7章 字符串
- 第8章 列表与字典
- 第9章 元组、文件及其他
- 第10章 Python 语句简介
- 第11章 赋值、表达式和打印
- 第12章 if 测试和语法规则
- 第13章 while 和 for 循环
- 第14章 迭代器和解析,第一部分
- 第15章 文档
- 第16章 函数基础
- 第17章 作用域
- 第18章 参数
- 第19章 函数的高级话题
- 第20章 迭代和解析,第二部分
- 第21章 模块:宏伟蓝图
- 第22章 模块代码编写基础
- 第23章 模块包
- 第24章 高级模块话题
- 第25章 OOP:宏伟蓝图
- 第27章 更多实例
- 第28章 类代码编写细节
- 第29章 运算符重载
- 第30章 类的设计
- 第31章 类的高级主题
- 第32章 异常基础
- 第34章 异常对象
- 第35章 异常的设计
- 第36章 Unicode 和字节字符串
- 字符串基础知识
- Python 的字符串类型
- 文本和二进制文件
- Python 3.0 中的字符串应用
- 转换
- 编码 Unicode 字符串
- 编码非ASCII文本
- 编码和解码非ASCII文本
- 其他 Unicode 编码技术
- 转换编码
- 在 Python 2.6 中编码 Unicode 字符串
- 源文件字符集编码声明
- 使用 Python 3.0 Bytes 对象
- 序列操作
- 创建 bytes 对象的其他方式
- 混合字符串类型
- 使用 Python 3.0(和 Python 2.6)bytearray 对象
- 使用文本文件和二进制文件
- Python 3.0 中的文本和二进制模式
- 类型和内容错误匹配
- 使用 Unicode 文件
- 在 Python 3.0 中处理 BOM
- Python 2.6 中的 Unicode 文件
- Python 3.0 中其他字符串工具的变化
- Struct二进制数据模块
- pickle对象序列化模块
- XML解析工具
- 本章小结
- 本章习题
- 习题解答
- 第37章 管理属性
- 第38章 装饰器
- 第39章 元类
- 附录A 安装和配置
- 附录B 各部分练习题的解答
- 作者介绍
- 封面介绍
Python 的字符串类型
·str表示8位文本和二进制数据。
·unicode用来表示宽字符Unicode文本。
Python 2.X的两种字符串类型是不同的(unicode考虑到字符的额外大小并且支持编码和解码),但是,它们的操作集大多是重叠的。Python 2.X中的str字符串类型用于可以用8位字节表示的文本,以及绝对字节值所表示的二进制数据。
相反,Python 3.X带有3种字符串对象类型——一种用于文本数据,两种用于二进制数据:
·str表示Unicode文本(8位的和更宽的)。
·bytes表示二进制数据。
·bytearray,是一种可变的bytes类型。
正如前面所提到的,bytearray在Python 2.6中可以使用,但它是从Python 3.0才有的升级功能,此后较少有特定内容的行为,并且通常看做是一个Python 3.0类型。
Python 3.0中所有3种字符串类型都支持类似的操作集,但是,它们都有不同的角色。Python 3.X之后关于这一修改的主要目标是,把Python 2.X中常规的和Unicode字符串类型合并到一个单独的字符串类型中,以支持常规的和Unicode文本:开发者想要删除Python 2.X中的字符串区分,并且让Unicode的处理更加自然。假设ASCII和其他的8位文本真的是一种简单的Unicode,这种融合听起来很符合逻辑。
为了实现这一点,Python 3.0的str类型定义为一个不可改变的字符序列(不一定是字节),这可能是像ASCII这样的每个字符一个字节的常规文本,或者是像UTF-8 Unicode这样可能包含多字节字符的字符集文本。你的脚本所使用的字符串处理,带有这种每个平台默认编码的类型,但是,在内存中以及在文件之间来回转换的时候,将会提供明确的编码名,以便在str对象和不同的方案之间来回转换。
尽管Python 3.0新的str类型确实实现了想要的字符串/Unicode结合,但很多程序仍然需要处理那些没有针对每个任意文本格式都编码的raw字节数据。图像和声音文件,以及用来与设备接口的打包数据,或者你想要用Python的struct模块处理的C程序,都属于这一类型。因此,为了支持真正的二进制数据的处理,还引入了一种新的类型,即bytes。
在Python 2.X中,通用的str类型填补了二进制数据的这一角色,因为字符串也只是字节的序列(单独的unicode类型处理宽字符串)。在Python 3.0中,bytes类型定义为一个8位整数的不可变序列,表示绝对的字节值。此外,Python 3.0的bytes类型支持几乎str类型所做的所有相同操作:这包括字符串方法、序列操作,甚至r e模块模式匹配;但是不包括字符串格式化。
一个Python 3.0 bytes对象其实只是较小整数的一个序列,其中每个整数的范围都在0到255之间;索引一个bytes将返回一个int,分片一个bytes将返回另一个bytes,并且在一个bytes上运行内置函数list将返回整数,而不是字符的一个列表。当用那些假设字符的操作处理bytes的时候,bytes对象的内容被假设为ASCII编码的字节(例如,isalpha方法假设每个字节都是一个ASCII字符代码)。此外,为了方便起见,bytes对象打印为字符串而不是整数。
尽管如此,Python的开发者也在Python 3.0中添加了一个bytearray类型,bytearray是bytes类型的一个变体,它是可变的并且支持原处修改。它支持str和bytes所支持的常见的字符串操作,以及和列表相同的很多原处修改操作(例如,append和extend方法,以及向索引赋值)。假设字符串可以作为raw字节对待,bytearray最终为字符串数据添加了直接原处可修改的能力,这在Python 2.0中不通过转换为一个可变类型是不可能做到的,并且也是Python 3.0的str或bytes所不支持的。
尽管Python 2.6和Python 3.0提供了很多相同的功能,但它们还是以不同方式包装了功能。实际上,从Python 2.6到Python 3.0的字符串类型映射并不是直接的,Python 2.8的str等同于Python 3.0中的str和bytes,并且Python 3.0的str等同于Python 2.6中的str和Unicode。此外,Python 3.0的可变的bytearray是独特的。
然而,实际上,这种不对称并不像听上去那么令人生畏。它可以概括如下:在Python 2.6中,我们可以对简单的文本使用str并且对文本的更高级的形式使用二进制数据和unicode;在Python 3.0中,我们将针对任何类型的文本(简单的和Unicode)使用str,并且针对二进制数据使用bytes或bytearray。实际上,这种选择常常由你所使用的工具决定,尤其是在文件处理工具的例子中,这是下一小节的主题。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论