3、字符串和编码的转换
1、转换单个字符为编码:
ord(c)
返回值可以认为是数字类型。
foo = '中'
print(ord(foo)) # 20013
如果不止一个字符,则会报错
2、转换单个字符的编码为字符
chr(code)
返回值是字符
print(chr(20013)) # '中'
3、用unicode方式输出字符
\u十六进制编码
例如,20013转为十六进制是4E2D
print('\u4e2d') # '中'
4、将字符转为bytes
形式的编码
首先,当字符串前面有b时表示是bytes
形式的编码。
例如,b'\xe4\xb8\xad'
表示文字中
。这个东西一般是需要进行网络传输,或者在硬盘上读写时使用的。
str.encode(encoding=’UTF-8’,errors=’strict’)
附个中文说明吧,找不到类似MDN这样的完善的说明网站。
两个参数都可以省略,默认转为utf-8格式。其作用大致类似js里的encodeURI()
方法,虽然我并不能完全肯定其是否一样。
示例:
foo = '中'.encode('utf-8')
print(foo) # b'\xe4\xb8\xad'
5、从bytes
形式的编码转回普通字符串
属于上面的逆向行为。
bytes.decode(encoding=”utf-8”, errors=”strict”)
foo = b'\xe4\xb8\xad'.decode()
print(foo) # '中'
4、字符串的长度
len(o)
参数是被检查的字符串。
这个比较智能:
- 对普通字符串,返回其字符个数,例如
len('中')
的返回值是1(只有一个字符); - 对于
bytes
形式的编码,返回其字节数。例如len(b'\xe4\xb8\xad')
的返回值是3; - 对于普通字符串,像
\n
这样的换行符或者其他转义字符,其长度视为1; - 但假如字符串前面加了r(视为非转义字符),那么
\n
的长度则视为2;
len('中') # 1
len(b'\xe4\xb8\xad') # 3
len('a\nb') # 3
len(r'a\nb') # 4
5、字符串的替换/占位符
简单来说,占位符就是先占住一个固定的位置,然后用其他东西替换这个位置的内容。
如果玩过c语言,那么应该很熟悉。
标准占位符是:%d
,注意是小写的,其他占位符也一样是小写。
通用写法是:
foo = '→%s←' % ('abc')
print(foo) # 箭头指向的地方被替换的→abc←
占位符的数量和括号里的参数数量要一致,不然抛错
因为上面只有一个占位符,所以括号可以省略。
foo = '→%s←' % 'abc'
print(foo) # →abc←
整数占位符(%d)
参数可以是浮点数(小数)或整数,浮点数的话直接取整数位使用。
foo = '%d' % (1.9)
print(foo) # 1
整数占位符的补位写法:
在%
和后面的d
之间添加两个数字,可以表示补足到多少位内容和以什么字符来补。
常见写法是补零,如示例:
foo = '%03d' % 1
print(foo) # 001
%
后面跟的第一个是0,表示用0是补位内容;第二个字符开始至d
之前的字符是3,表示补足到三位。
具体来说,就是首先用1
来替换%03d
的位置,替换后结果是1
。
然后发现第二个至d之间是3,表示要补足3位,即xx1
这样。
但这个x是什么呢?发现第一位是0,因此变成001
,即结果。
两种特殊情况:
- 假如被替换后超出三位,例如
foo = '%03d' % 1234
替换后结果是1234。这种情况不补位; - 可以用其他填充么?答案是不行。
浮点数占位符(%f)
会把参数变为一个六位小数,然后替换。
示例:
foo = '%f' % 2.1234
print(foo) # 2.123400
也可以只取几位小数,写法是 %
和 f
之间加 .
和需要保留的位数。
示例:
foo = '%.2f' % 2.1234
print(foo) # 2.12
另外需要注意,浮点数由于精确度问题,因此最后一位并不是四舍五入,也不是直接舍去后面的内容。
这涉及到浮点数的存储问题,就不深谈了。
转为十六进制(%x)
很好理解,将数字转为十六进制
foo = '%x' % 31
print(foo) # 1f
另外提一下十六进制转为十进制的方法:
foo = '1f' # 这里需要是字符串
print(int(foo, 16)) # 31