一、字符串的格式化
1.1 字符串的格式化是一种拼接字符串输出样式的手段,更灵活方便
- join 拼接只能使用分割符,切要求被拼接的是可迭代对象且其元素是字符串
- + 拼接字符串还算方便,但是非字符串需要先转换为字符串才能拼接
1.2 Python 2.5 版本之前,只能使用 printf style 风格的 print 输出
printf-style formatting,来自于 C 语言的 print 函数
-
格式要求
-
占位符:使用 % 和格式字符组成
a) 示例
%s %d
b) s 调用 str(),r 调用 repr(),所有对象都可以被这两个转换
-
在微幅中还可以插入修饰字符,例如 %03d 表示打印 3 个位置,不够前面补零
format % values,格式字符串和被格式的值之间使用 % 分割
values 只能是一个对象,或是一个与格式字符串占位符数目相等的元组,或一个字典
-
printf-style formatting 示例
"I am %03d" % (20,)
'I like %s' % 'Python'
'%3.2f%% , 0x%x, 0X%02X' % (89.7654, 10, 15)
"I am %-5d" % (20,)
1.3 format 函数格式字符串语法 —— Python 鼓励使用
- "{} {xxx}".format(*args, **kwargs) -> str
- args 是可变位置参数,是一个元组
- kwargs 是可变关键字参数,是一个字典
- 花括号表示占位符
- {} 表示按照顺序匹配位置参数,(n) 表示取位置参数索引为 n 的值
- {xxx} 表示在关键字参数中搜索名称一致的
- {{}} 表示打印花括号
- 示例
# 位置参数
"{}:{}".format('192.168.1.100',8888)
# 这就是按照位置顺序用位置参数替换前面的格式字符串的占位符
# 关键字参数或命名参数
"{server} {1}:{0}".format(8888, '192.168.1.100', server='Web Server Info :')
# 位置参数按照序号匹配,关键字参数按照名词匹配
# 访问元素
"{0[0]}.{0[1]}".format(('rookie','com'))
# 对象属性访问
from collections import namedtuple
Point = namedtuple('Point','x y')
p = Point(4,5)
"{{{0.x},{0.y}}}".format(p)
1.4 对齐
- 示例
'{0}*{1}={2:<2}'.format(3,2,2*3)
'{0}*{1}={2:<02}'.format(3,2,2*3)
'{0}*{1}={2:>02}'.format(3,2,2*3)
'{:^30}'.format('centered')
'{:*^30}'.format('centered')
1.5 进制
- 示例
"int: {0:d}; hex:{0:x}; oct: {0:o}; bin: {0:b}".format(42)
"int: {0:d}; hex:{0:#x}; oct: {0:#o}; bin: {0:#b}".format(42)
octets = [192, 168, 0, 1]
'{:02X}{:02x}{:02x}{:02x}'.format(*octets)
1.6 浮点数
- 示例
print("{}".format(3**0.5)) # 1.7320508075688772
print("{:f}".format(2**0.5)) # 1.732051,精度默认 6
print("{:10f}".format(3**0.5)) # 右对齐,宽度 10
print("{:2}".format(102.231)) # 宽度 2
print("{:.2}".format(3**0.5)) # 1.7 2 个数字
print("{:.2f}".format(3**0.5)) # 1.73 小数点后 2 位
print("{:3.2f}".format(3**0.5)) # 1.73 宽度 3,小数点后 2 位
print("{:3.3f}".format(0.2745)) # 0.275
print("{:3.3%}".format(1/3)) # 33.333%
二、bytes、bytearray
2.1 Python 3 引入两个新类型
- bytes
- 不可变 字节类型
- bytearray
- 字节数组
- 可变
2.2 字符串与 bytes
- 字符串是字符组成的有序序列,字符可以使用编码来理解
- bytes 是字节组成的有序的 不可变 序列
- bytearray 是字节组成的有序的 可变 序列
2.3 编码与解码
- 字符串按照不同的字符集编码 encode 返回字节序列 bytes
- encode(encoding='utf-8',errors='strict') -> str
- 字节序列按照不同的字符集解码 decode 返回字符串
- bytes.decode(encoding="utf-8",errors="strict") -> str
-
bytearray.decode(encoding="utf-8",errors="strict") -> str
三、ASCII
3.1 ASCII (American Standard Code for Information Interchange)
-
美国信息交换标准代码,是基于拉丁字母的一套字节编码系统
四、bytes 定义
4.1 定义
- bytes() 空 bytes
- bytes(int) 指定字节的 bytes,被 0 填充
- bytes(iterable_of_ints) -> bytes [0,255] 的 int 组成的可迭代对象
- bytes(string, encoding[, erors]) -> bytes 等价于 string.encode()
- bytes(bytes_or_buffer) -> immutable copy of bytes_or_buffer 从一个字节序列或者 buffer 复制出一个新的不可变的 bytes 对象
- 使用 b 前缀定义
- 只允许基本 ASCII 使用字符形式 b'abc9'
-
使用 16 进制表示 b"\x41\x61"
五、bytes 操作
5.1 和 str 类型类似,都是不可变类型,所以方法很多都一样,只不过 bytes 的方法,输入是 bytes,输出是 bytes
- 示例
b'abcdef'.replace(b'f',b'k')
b'abc'.find(b'b')
5.2 类方法 bytes.fromhex(string)
- string 必须是 2 个字符的 16 进制的形式,'6162 6a 6b',空格将被忽略
- 示例
bytes.fromhex('6162 09 6a 6b00')
5.3 hex()
- 返回 16 进制表示的字符串
- 示例
'abc'.encode().hex()
5.4 索引
-
b'abcdef'[2] 返回该字节对应的数,int 类型
六、bytearray 定义
6.1 定义
- byutearray() 空 bytearray
- bytearray(int) 指定字节的 bytearray,被 0 填充
- bytearray(iterable_of_ints) -> bytearray [0,255] 的 int 组成的可迭代对象
- bytearray(string, encoding[, errors]) -> bytearray 近似 string.encode(),不过返回可变对象
- bytearray(bytes_or_buffer) 从一个字节序列或者 buffer 复制出一个新的可变的 butearray 对象
-
注意,b 前缀定义的类型是 bytes 类型
七、bytearray 操作
7.1 和 bytes 类型的方法相同
- 示例
bytearray(b'abcdef').replace(b'f',b'k')
bytearray(b'abc').find(b'b')
7.2 类方法 bytearray.fromhex(string)
- string 必须是 2 个字符的 16 进制的形式,'6162 6a 6b',空的将被忽略
- 示例
bytearray.fromhex('6162 09 6a 6b00')
7.3 hex()
- 返回 16 进制表示的字符串
7.4 索引
-
bytearray(b'abcdef')[2] 返回该字节对应的数,int 类型
7.5 其他操作
- append(int) 尾部追加一个元素
- insert(index, int) 在指定索引位置插入元素
- extend(iterable_of_ints) 将一个可迭代的证书集合追加到当前 bytearray
- pop(index=-1) 从指定索引上移除元素,默认从尾部移除
- remove(value) 找到第一个 value 移除,找不到抛 ValueError 异常
- 注意:上述方法若需要使用 int 类型,取值区间 [0, 255]
- clear() 清空 bytearray
- reverse() 翻转 bytearray,就地修改
- 示例
b = bytearray()
b.append(97)
b.append(99)
b.insert(1,98)
b.extend([65,66,67])
b.remove(66)
b.pop()
b.reverse()
b.clear()
八、int 和 butes
8.1 int.from_bytes(bytes, byteorder)
- 将一个字节数组表示成整数
8.2 int.to_bytes(length, byteorder)
- byteorder 字节序
- 将一个整数表达成一个指定长度的字节数组
- 示例
i = int.from_bytes(b'abc', 'big')
print(i, hex(i)) # 6382179 0x616263
print(i.to_bytes(3, 'big')) # b'abc'