位元組型別bytes,記憶體檢視menoryview,unicode規範化, 引數註解,運算子包operator,函式式包functools,累計運算reduce,凍結引數
《流暢的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)
函式的內省使用six庫