天天看点

风火编程--bytes, memoryview, unicode规范化,运算符包operator,函数式包functools: partial, reduce, itemgetter

《流畅的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库