《流畅的python》读书笔记(三)
4.2python3的字节类型
python3的bytes或bytearrary是不可变数据了理性, 它的元素是0-255之间的整数, bytearray对象没有字面量显示句法.
bytres的索引取到整数,bytearray的索引取到bytes, bytearray切片取到bytearray对象.
内存视图
import struct
ftm = “3s3sHH”
with open(“path”, “rb”) as f:
mv = memoryview(f.read())
header = mv[:10]
t, h, *o = struct.unpack(ftm, header)
print(t,h, o)
del mv # 释放引用
表情符使用utf-16编码
二进制转str直接编码encode
decode(“utf-8”)可以解码任意编码格式而不报错, 但未必都可用,如果无法解码会返回乱码,
乱码的BOM(字节序标注)包含一些编码信息
在encode的时候会报错.
为确保文件跨平台可用, 打开文件的时候应制定encoing=“utf-8”
open(“path”, “r”)默认返回TextIOWrapper文件对象, 通过encoding属性查看编码方式
4.6 unicode规范化
from unicodedata import nomalize
s = nomalize('NFC', str)
5.4 可调用对象
内置函数和内置方法是使用C语言实现的
5.5 自定义可调用对象的类
实现__call__()的对象可调用
callable(obj)判断obj是否是可调用对象
5.7仅限关键字参数
形参中出现单独的,*,代表后面的参数必须使用关键字参数.
5.8 获取关于参数的信息
内省
app对象会自动获取视图函数锁需要的参数,然后从request中取出来传递给视图函数.
如果request中没有该参数,会抛出参数丢失的missing异常.
5.9 函数注解
示例:
定义函数func,
形参a为str,
b为大于0的int, 默认值为1,
返回值为str
def func(a: str, b: 'int>0' =1) -> str:
return a + str(b)
r= func("is: ", 3)
print(r)
5.10 函数式编程的包
运算符在operator包中,
高阶函数在functools包中,
redfuce用来进行累计运算, partial用来固化部分参数|(类似闭包)
累计运算
from functools import reduce
from operator import mul
r = reduce(mul, range(1,6))
print(r)
冻结部分参数
from operator import mul
from functools import partial
my_mul = partial(mul, 3)
r = my_mul(5)
print(r)
取元素的元素
itermgetter替代lambda
from operator import itemgetter
li = [(3,3),(1,1), (2,2)]
r = sorted(li, key=itemgetter(1))
print(r)
函数的内省使用six库