天天看點

風火程式設計--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庫

繼續閱讀