字元問題
python3的str物件中獲取的元素是unicode字元。
unicode標準:
碼位:是0~1114111的數字(十進位制),在unicode標準中以4 ~ 6個十六進製制的數字表示,且加字首「u+」。
位元組序列:從位元組序列(非字串行)到碼位的過程是解碼,從碼位到位元組序列的過程是編碼。
>>
> s =
'caf$'
>>
>
len(s)
4>>
> b = s.encode(
'utf8'
)>>
> b
b'caf$'
#bytes型別以b開頭
>>
>
>>
> b.decode(
'utf8'
)'caf$'
位元組概要
python3引入了不可變bytes型別和bytearray型別。兩個型別的物件的各個元素都是位於0 ~ 255的整數。
>>
> cafe =
bytes
('cafè'
,encoding =
'utf_8'
)>>
> cafe
b'caf\xc3\xa8'
>>
> cafe[0]
99>>
> cafe[:1
]
b'c'
>>
> cafe_arr =
bytearray
(cafe)
>>
> cafe_arr
bytearray
(b'caf\xc3\xa8'
)>>
> cafe_arr[-1
:]bytearray
(b'\xa8'
)
只有在str中s[0] == s[:1] 是對的,在其餘的序列中s[0]返回的是乙個元素,s[:1]返回的是乙個只有乙個元素的序列。
二進位制序列會以三種方法顯示:
二進位制序列有個類方法,fromhex()。作用是解析十六進製制數字,構建二進位制序列:
>>
>
bytes
.fromhex(
'314bcea9'
)b'1k\xce\xa9'
使用陣列中的原始資料初始化bytes物件:
>>
>
import array
>>
> nums = array.array(
'h',[-
2,-1
,0,1
,2])
>>
> octets =
bytes
(nums)
>>
> octets
b'\xfe\xff\xff\xff\x00\x00\x01\x00\x02\x00'
處理編碼錯誤
unicodedecodeerror錯誤:
>>
> octets = b'montr\xe9al'
>>
> octets.decode(
'cp1252'
)'montréal'
>>
> octets.decode(
'iso8859_7'
)'montrιal'
>>
> octets.decode(
'koi8_r'
)'montrиal'
>>
> octets.decode(
'utf8'
)traceback (most recent call last)
: file ""
, line 1,in
octets.decode(
'utf8'
)unicodedecodeerror:
'utf-8' codec can't decode byte 0xe9
in position 5
: invalid continuation byte
>>
> octets.decode(
'utf8'
, errors =
'replace'
)'montr�al'
unicodeencodeerror錯誤:
與decodeerror錯誤類似,當無法將乙個字元解碼成二進位制序列時,會報錯,可以使用encode(『cp437』, errors = 『ignore』),encode(『cp437』, errors = 『replace』),encode(『cp437』, errors = 『xmlcharrefreplace』)分別對錯誤進行跳過,替換成『?』和替換成xml實體。
python3預設使用utf-8編碼原始碼,如果開啟包含utf-8之外的資料,會丟擲syntaxerror錯誤,這時可以在頂部新增注釋:
# coding:cp1252
bom位元組序標記
b』\xff\xfe 指明編碼時使用小字節序,小字節序是指各個碼位的最低有效位元組在前面,例如字母』e『的碼位為u+0045(十進位制69),則在位元組偏移的第二位和第三位編碼為69和0,大字節序則為0和69。
utf-16有兩個變種:utf-16le顯式使用小字節序,utf-16be顯式使用大字節序。這兩個不會生成bom。
處理文字檔案
使用read()和write()函式會自動將文字中的位元組序列解碼成字串。
eval()函式,接受乙個字串引數,作用是將這個字串當作python表示式執行,就相當於在python中寫出這個字串然後執行。
規範化unicode字串
unicode有組合字元(字母加符號)如é可以看作e\u0301,因為碼位序列不同,所以python判定這兩個不相等,可以使用unicodedata.normalize將unicode規範化,normalize()函式有兩個引數,第乙個是』nfc『,』nfd『,』nfkc『,』nfkd『四個中的乙個,nfc指明使用最少的碼位構成字串,nfd則是將組合字元分解成基字元和單獨的組合字元,nfkc和nfkd會將字元轉化為相容其他編碼的字元,有時會改變意思,第二個引數即字串。
casefold()函式與lower()函式得到的結果一樣,只有少數的不一樣,可忽略。
第四章總結
1.對貪心演算法的認識 貪心演算法在求解問題時,不從整體上考慮,而是得到某種意義上的區域性最優解,做出當前看來是最好的選擇。每次的選擇都會依賴之前作出的選擇,而對後面的選擇不會產生影響。它具有最優子結構的性質,即問題的最優解包含其子問題的最優解。但貪心演算法不是對於所有的問題都能得到整體最優解,最重...
第四章(筆記總結)
簡單的組合語言源程式基本語法 assume cs code code segment mov ax 0001h add ax ax mov ax 4c00h int 21h code ends end在組合語言源程式中,包含兩種指令分別是,彙編指令和偽指令 彙編指令 1 mov ax 0001h i...
第四章作業總結
include using namespace std int main cout a endl system pause return 0 注意getchar 不能迴圈條件用一次,算式中再用一次,否則算兩次getchar 只能先設個變數再用。將使用者輸入的任意十進位制整數轉換為16進製制數輸出 利...