python學習隨筆(四)_內置數據結構_bytes,bytearray


python3新引入兩個新類型
    bytes    #不可變字節序列
    bytearray    #字節數組,可變    #用的少
字符串與bytes
    字符串是字符組成的有序序列,字符可以使用編碼來理解
    bytes是字節組成的有序的不可變序列
    bytearray是字節組成的有序的可變序列

編碼與解碼
    字符串按照不同的字符集編碼encode返回字節序列bytes
        encode(encoding='utf-8', errors='strict') -> bytes
    字節序列按照不同的字符集解碼decode返回字符串
        bytes.decode(encoding="utf-8", errors="strict") -> str
        bytearray.decode(encoding="utf-8", errors="strict") -> str

ASCII
ASCII(American StandardCode for InformationInterchange,美國信息交換標准代碼)是基於拉丁字母的一套單字節編碼系統
所有字節都可以用ASCII編碼,一切字節都可以當文本理解

bytes定義
    bytes()空bytes
    bytes(int)指定字節bytes,被0填充
    bytes(iterable_of_ints) -> bytes [0,255]的int組成的可迭代對象
    bytes(string, encoding[, errors]) -> bytes 等價於string.encode()
    bytes(bytes_or_buffer) -> immutable copy of bytes_or_buffer 從一個字節序列或者buffer復制出
        一個新的不可變的bytes對象
    使用b前綴定義
        只允許基本ASCII使用字符形式b'abc9'
        使用16進制表示b"\x41\x61"

bytes操作
    和str類型類似,都是不可變類型,所以方法很多都一樣。只不過bytes的方法,輸入是bytes,輸出是
        bytes
            b'abcdef'.replace(b'f',b'k')    #b'abcdek'    k替換f
            b'abc'.find(b'b')        #1        找得是相同類型
    類方法 bytes.fromhex(string)
        string必須是2個字符的16進制的形式,'6162 6a 6b',空格將被忽略
        bytes.fromhex('6162 09 6a 6b00')    #b'ab\tjk\x00'
    hex()
        返回16進制表示的字符串
        'abc'.encode().hex()        #'616263'
    索引
        b'abcdef'[2] 返回該字節對應的數,int類型    #99(a是97,c是99)

bytearray定義
    bytearray() 空bytearray
    bytearray(int) 指定字節的bytearray,被0填充
    bytearray(iterable_of_ints) -> bytearray [0,255]的int組成的可迭代對象
    bytearray(string, encoding[, errors]) -> bytearray 近似string.encode(),不過返回可變對象
    bytearray(bytes_or_buffer) 從一個字節序列或者buffer復制出一個新的可變的bytearray對象
**注意,b前綴定義的類型是bytes類型

bytearray操作
    和bytes類型的方法相同
        bytearray(b'abcdef').replace(b'f',b'k')    #bytearray(b'abcdek')
        bytearray(b'abc').find(b'b')        #1
    類方法 bytearray.fromhex(string)
        string必須是2個字符的16進制的形式,'6162 6a 6b',空格將被忽略
        bytearray.fromhex('6162 09 6a 6b00')    #bytearray(b'ab\tjk\x00')
    hex()
        返回16進制表示的字符串
        bytearray('abc'.encode()).hex()    #'616263'
    索引
        bytearray(b'abcdef')[2] 返回該字節對應的數,int類型    #99

bytearray操作
    append(int) 尾部追加一個元素
    insert(index, int) 在指定索引位置插入元素
    extend(iterable_of_ints) 將一個可迭代的整數集合追加到當前bytearray
    pop(index=-1) 從指定索引上移除元素,默認從尾部移除
    remove(value) 找到第一個value移除,找不到拋ValueError異常
***注意:上述方法若需要使用int類型,值在[0, 255]
    clear() 清空bytearray
    reverse() 翻轉bytearray,就地修改
b = bytearray()
b.append(97)
b.append(99)
b.insert(1,98)
b.extend([65,66,67])
b.remove(66)
b.pop()
b.reverse()
b.clear()

int和bytes
    int.from_bytes(bytes, byteorder)
        將一個字節數組表示成整數
    int.to_bytes(length, byteorder)
        byteorder字節序
        將一個整數表達成一個指定長度的字節數組
i = int.from_bytes(b'abc', 'big')
print(i, hex(i))         # 6382179 0x616263
print(i.to_bytes(3, 'big'))     # b'abc'

----------------------------------------------------------------

線性結構
    可迭代 for ... in
    len()可以獲取長度
    通過下標可以訪問
    可以切片
學過的線性結構
    列表、元組、字符串、bytes、bytearray

切片    #start要在stop左邊,stop大於start
    切片(中間調用了copy)
    通過索引區間訪問線性結構的一段數據
    sequence[start:stop] 表示返回[start, stop)區間的子序列
    支持負索引
    start為0,可以省略
    stop為末尾,可以省略
    超過上界(右邊界),就取到末尾;超過下界(左邊界),取到開頭
    start一定要在stop的左邊
    [:] 表示從頭至尾,全部元素被取出,等效於copy()方法

步長切片        #有步長后start和stop在誰那邊都可以 只要三個數方向一致就可以,從小到大切
    [start:stop:step]
    step為步長,可以正、負整數,默認是1
    step要和start:stop同向,否則返回空序列













免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM