《流暢的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庫