成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

PyTips 0x08 - Python 字節(jié)與字節(jié)數(shù)組

Leo_chen / 1801人閱讀

摘要:回到對字節(jié)和字節(jié)數(shù)組的定義為了用計(jì)算機(jī)可以理解的數(shù)字描述人類使用的字符,我們需要一張數(shù)字與字符對應(yīng)的表。由于和字符串一樣是序列類型,字節(jié)和字節(jié)數(shù)組可用的方法也類似,這里就不一一列舉了。

項(xiàng)目地址:https://git.io/pytips

0x07 中介紹了 Python 中的字符串類型,字符串類型是對人類友好的符號,但計(jì)算機(jī)只認(rèn)識一種符號,那就是二進(jìn)制(binary)數(shù),或者說是數(shù)字:

上面這張圖片來自 OpenCV,非常直觀地解釋了計(jì)算機(jī)處理的信息與我們看到的圖像之間的關(guān)系。回到 Python 對字節(jié)和字節(jié)數(shù)組的定義:

The core built-in types for manipulating binary data are bytes and bytearray.

1Byte of ASCII

為了用計(jì)算機(jī)可以理解的數(shù)字描述人類使用的字符,我們需要一張數(shù)字與字符對應(yīng)的表。我們都知道在計(jì)算機(jī)中 1 byte = 8bits,可以存儲 0~255 共256個(gè)值,也就是說 1byte 最多可以表示 256 個(gè)字符,在最初的計(jì)算機(jī)世界中,256 足以容納所有大小寫英文字母和 0~9 阿拉伯?dāng)?shù)字以及一些常用的符號,于是就有了 ASCII 編碼:

在 Python 中創(chuàng)建字節(jié)與字符串類似,只不過需要在引號外面加一個(gè)前綴b

print(b"Python")
python = (b"P" b"y" b"t" b"o" b"n")
print(python)
b"Python"
b"Pyton"

Bytes 代表的是(二進(jìn)制)數(shù)字的序列,只不過在是通過 ASCII 編碼之后才是我們看到的字符形式,如果我們多帶帶取出一個(gè)字節(jié),它仍然是一個(gè)數(shù)字:

print(b"Python"[0])
80

我們可以用 b"*" 的形式創(chuàng)建一個(gè)字節(jié)類型,前提條件是這里的 * 必須是 ASCII 中可用的字符,否則將會超出限制:

print(b"雨")
  File "", line 1
    print(b"雨")
         ^
SyntaxError: bytes can only contain ASCII literal characters.

錯(cuò)誤提示說明:字節(jié)類型只能允許 ASCII 字符。

0~127~255

那么問題來了,我們發(fā)現(xiàn)上面的 ASCII 表里面所有的字符只占據(jù)了 [31, 127],那對于這一范圍之外的數(shù)字我們要怎么才能表示為字節(jié)類型?答案就是用特殊的轉(zhuǎn)義符號x+十六進(jìn)制數(shù)字 :

print(b"xff"[0])
print(b"x24")
255
b"$"

反過來我們也可以將數(shù)字(0~255)轉(zhuǎn)變成轉(zhuǎn)義后的字節(jié)類型:

print(bytes([24]))
print(bytes([36,36,36])) # 記住字節(jié)類型是一個(gè)序列
b"x18"
b"$$$"

或者直接從十六進(jìn)制得來:

print(bytes.fromhex("7b 7d"))

# 逆運(yùn)算
print(b"{ }".hex())

int(b" ".hex(), base=16)
b"{}"
7b207d
32
encode

字符串有 decode 方法,而字節(jié)有 encode 方法,我們這里先簡單看一下 encode("ascii") 。對于給定的字符我們可以通過編碼得到它在編碼表里面的坐標(biāo)(即碼位),因此對字符進(jìn)行encode("ascii")操作是找到其在 ASCII 中的位置:

print("$".encode("ascii"))
print("$".encode("ascii")[0])
b"$"
36

也就是說字符 "$" (0x07中已經(jīng)介紹過這是一個(gè) Unicode 編碼的字符)在 ASCII 中的位置就是 $(或者說36)。

可是如果我們對一些奇怪的字符進(jìn)行 ASCII 編碼,就會發(fā)生:

snake = "?"
try:
    snake.encode("ascii")
except UnicodeEncodeError as err:
    print(err)

# 正確的做法應(yīng)該是用 UTF-8 進(jìn)行編碼,因?yàn)樽址际?UTF-8 的
print(snake.encode()) # utf-8 by default
"ascii" codec can"t encode character "U0001f40d" in position 0: ordinal not in range(128)
b"xf0x9fx90x8d"

于是就得到了我們最熟悉的錯(cuò)誤:ordinal not in range(128),至于為什么是 128,現(xiàn)在應(yīng)該很好理解了吧!

字節(jié)數(shù)組

和字符串一樣,字節(jié)類型也是不可變序列,而字節(jié)數(shù)組就是可變版本的字節(jié),它們的關(guān)系就相當(dāng)于listtuple

ba = bytearray(b"hello")
ba[0:1] = b"w"
print(ba)
bytearray(b"wello")

由于和字符串一樣是序列類型,字節(jié)和字節(jié)數(shù)組可用的方法也類似,這里就不一一列舉了。

總結(jié)

字節(jié)(字節(jié)數(shù)組)是二進(jìn)制數(shù)據(jù)組成的序列,其中每個(gè)元素由8bit二進(jìn)制即1byte亦即2位十六進(jìn)制數(shù)亦亦即0~255組成;

字節(jié)是計(jì)算機(jī)的語言,字符串是人類語言,它們之間通過編碼表形成一一對應(yīng)的關(guān)系;

最小的 ASCII 編碼表只需要一位字節(jié),且只占用了其中 [31,127] 的碼位;

關(guān)于字節(jié)與字符串之間的關(guān)系,將在下一期[0x08]()詳細(xì)介紹。

參考

Pragmatic Unicode


歡迎關(guān)注公眾號 PyHub!

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/37834.html

相關(guān)文章

  • PyTips 0x09 - Python 中 Unicode 的正確用法

    摘要:只包含了個(gè)基本拉丁字母阿拉伯?dāng)?shù)目字和英式標(biāo)點(diǎn)符號一共個(gè)字符,因此只需要不占滿一個(gè)字節(jié)就可以存儲,而則涵蓋的數(shù)據(jù)除了視覺上的字形編碼方法標(biāo)準(zhǔn)的字符編碼外,還包含了字符特性,如大小寫字母,共可包含個(gè)字符,而到現(xiàn)在只填充了其中的個(gè)位置。 項(xiàng)目地址:https://git.io/pytips 0x07 和 0x08 分別介紹了 Python 中的字符串類型(str)和字節(jié)類型(byte),以及...

    shenhualong 評論0 收藏0
  • PyTips 0x07 - Python 字符串

    摘要:項(xiàng)目地址所有用過的人應(yīng)該都看過下面兩行錯(cuò)誤信息這就是界的錕斤拷今天和接下來幾期的內(nèi)容將主要關(guān)注中的字符串字節(jié)及兩者之間的相互轉(zhuǎn)換。 項(xiàng)目地址:https://git.io/pytips 所有用過 Python (2&3)的人應(yīng)該都看過下面兩行錯(cuò)誤信息: UnicodeEncodeError: ascii codec cant encode characters in position...

    go4it 評論0 收藏0
  • WebSocket協(xié)議以及ws源碼分析

    摘要:本文包括如下內(nèi)容協(xié)議第四章連接握手協(xié)議第五章數(shù)據(jù)幀庫源碼分析連接握手過程庫源碼分析數(shù)據(jù)幀解析過程參考協(xié)議深入探究本文對的概念定義解釋和用途等基礎(chǔ)知識不會涉及稍微偏干一點(diǎn)篇幅較長大約行閱讀需要耐心連接握手過程關(guān)于有一句很常見的話復(fù)用 ? 本文包括如下內(nèi)容: WebSocket協(xié)議第四章 - 連接握手 WebSocket協(xié)議第五章 - 數(shù)據(jù)幀 nodejs ws庫源碼分析 - 連接...

    ytwman 評論0 收藏0
  • PyTips 0x05 - Python 函數(shù)參數(shù)解包

    摘要:這里的關(guān)鍵詞函數(shù)必須明確指明,不能通過位置推斷則代表任意數(shù)量的關(guān)鍵詞參數(shù)添加的新特性,使得可以在函數(shù)參數(shù)之外使用這里的逗號不能漏掉所謂的解包實(shí)際上可以看做是去掉的元組或者是去掉的字典。 項(xiàng)目地址:https://git.io/pytips 函數(shù)調(diào)用的參數(shù)規(guī)則與解包 Python 的函數(shù)在聲明參數(shù)時(shí)大概有下面 4 種形式: 不帶默認(rèn)值的:def func(a): pass 帶有默認(rèn)值的...

    pubdreamcc 評論0 收藏0
  • PyTips 0x10 - Python 的堆優(yōu)先隊(duì)列

    摘要:項(xiàng)目地址中內(nèi)置的庫和分別提供了堆和優(yōu)先隊(duì)列結(jié)構(gòu),其中優(yōu)先隊(duì)列本身也是基于實(shí)現(xiàn)的,因此我們這次重點(diǎn)看一下。堆可以用于實(shí)現(xiàn)調(diào)度器例見之協(xié)程,更常用的是優(yōu)先隊(duì)列例如。 項(xiàng)目地址:https://git.io/pytips Python 中內(nèi)置的 heapq 庫和 queue 分別提供了堆和優(yōu)先隊(duì)列結(jié)構(gòu),其中優(yōu)先隊(duì)列 queue.PriorityQueue 本身也是基于 heapq 實(shí)現(xiàn)的,因...

    dreambei 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<