Python 内置数据结构之四(字符串下)


一、字符串的格式化

1.1 字符串的格式化是一种拼接字符串输出样式的手段,更灵活方便
  • join 拼接只能使用分割符,切要求被拼接的是可迭代对象且其元素是字符串
  • + 拼接字符串还算方便,但是非字符串需要先转换为字符串才能拼接
1.2 Python 2.5 版本之前,只能使用 printf style 风格的 print 输出
  • printf-style formatting,来自于 C 语言的 print 函数

  • 格式要求

    1. 占位符:使用 % 和格式字符组成
      a) 示例
      %s %d


      示例.png

    b) s 调用 str(),r 调用 repr(),所有对象都可以被这两个转换

    1. 在微幅中还可以插入修饰字符,例如 %03d 表示打印 3 个位置,不够前面补零


      示例.png
    2. format % values,格式字符串和被格式的值之间使用 % 分割

    3. 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,)
示例.png
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)
示例.png
补充示例.png
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')
示例.png
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)
示例.png
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%
示例.png

二、bytes、bytearray

2.1 Python 3 引入两个新类型
  • bytes
    1. 不可变 字节类型
  • bytearray
    1. 字节数组
    2. 可变
2.2 字符串与 bytes
  • 字符串是字符组成的有序序列,字符可以使用编码来理解
  • bytes 是字节组成的有序的 不可变 序列
  • bytearray 是字节组成的有序的 可变 序列
2.3 编码与解码
  • 字符串按照不同的字符集编码 encode 返回字节序列 bytes
    1. encode(encoding='utf-8',errors='strict') -> str
encode 示例.png
  • 字节序列按照不同的字符集解码 decode 返回字符串
    1. bytes.decode(encoding="utf-8",errors="strict") -> str
    2. bytearray.decode(encoding="utf-8",errors="strict") -> str


      decode 示例.png

三、ASCII

3.1 ASCII (American Standard Code for Information Interchange)
  • 美国信息交换标准代码,是基于拉丁字母的一套字节编码系统


    ASCII.png

四、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 前缀定义
    1. 只允许基本 ASCII 使用字符形式 b'abc9'
    2. 使用 16 进制表示 b"\x41\x61"


      示例.png

五、bytes 操作

5.1 和 str 类型类似,都是不可变类型,所以方法很多都一样,只不过 bytes 的方法,输入是 bytes,输出是 bytes
  • 示例
b'abcdef'.replace(b'f',b'k')
b'abc'.find(b'b')
示例.png
5.2 类方法 bytes.fromhex(string)
  • string 必须是 2 个字符的 16 进制的形式,'6162 6a 6b',空格将被忽略
  • 示例
bytes.fromhex('6162 09 6a 6b00')
示例.png
5.3 hex()
  • 返回 16 进制表示的字符串
  • 示例
'abc'.encode().hex()
示例.png
5.4 索引
  • b'abcdef'[2] 返回该字节对应的数,int 类型


    示例.png

六、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 类型
    示例.png

七、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 类型


    示例.png
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()
示例.png

八、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'
示例.png

你可能感兴趣的:(Python 内置数据结构之四(字符串下))