文章引用:html
https://www.cnblogs.com/654321cc/p/7419124.htmlpython
http://www.cnblogs.com/alex3714/articles/5465198.html編程
若有侵權,請聯繫刪除網絡
1.bytes類型:ide
python3中,字符串是unicode格式,字節包括utf-8,gbk等等,網絡傳輸,硬盤保存是以字節格式保存的。函數
str和bytes格式的區別:編碼
str: spa
表現形式:a='hello,world'3d
內部原理:00000000 00000000 00000000 01101000 ‘h’code
。。。
。。。
bytes:
表現形式:a=b'hello,world'
內部原理:
01101000 utf-8
。。。
。。。
00000000 01101000 gbk
。。。
。。。
Bytes 對象是由單個字節做爲基本元素(8位,取值範圍 0-255)組成的序列,爲不可變對象。
Bytes 對象只負責以二進制字節序列的形式記錄所需記錄的對象,至於該對象到底表示什麼(好比究竟是什麼字符)則由相應的編碼格式解碼所決定。咱們能夠經過調用 bytes() 類(沒錯,它是類,不是函數)生成 bytes 實例,其值形式爲 b'xxxxx',其中 'xxxxx' 爲一至多個轉義的十六進制字符串(單個 x 的形式爲:\xHH,其中 \x 爲小寫的十六進制轉義字符,HH 爲二位十六進制數)組成的序列,每兩個十六進制數即每一個‘x’表明一個字節(八位二進制數,取值範圍 0-255),對於同一個字符串若是採用不一樣的編碼方式生成 bytes 對象,就會造成不一樣的值。
Python 3最重要的新特性大概要算是對文本和二進制數據做了更爲清晰的區分。文本老是Unicode,由str類型表示,二進制數據則由bytes類型表示。Python 3不會以任意隱式的方式混用str和bytes,正是這使得二者的區分特別清晰。你不能拼接字符串和字節包,也沒法在字節包裏搜索字符串(反之亦然),也不能將字符串傳入參數爲字節包的函數(反之亦然 )。
例如:
1 a = '你好' 2 a_b = a.encode('utf-8') 3 print(a,b) 4 for i in a_b: 5 print(i) 6 for i in a_b: 7 print(bin(i))
輸出:
1 b'\xe4\xbd\xa0\xe5\xa5\xbd' #原來如此,\xe4 長得這麼醜,實際是十六進制的數字。和128,12,沒什麼本質的區別。天然就能夠bin()變爲二進制數字了。 2 228 3 189 4 160 5 229 6 165 7 189 8 0b11100100 9 0b10111101 10 0b10100000 11 0b11100101 12 0b10100101 13 0b10111101
回到bytes
和str
的身上。bytes
是一種比特流,它的存在形式是01010001110這種。咱們不管是在寫代碼,仍是閱讀文章的過程當中,確定不會有人直接閱讀這種比特流,它必須有一個編碼方式,使得它變成有意義的比特流,而不是一堆晦澀難懂的01組合。由於編碼方式的不一樣,對這個比特流的解讀也會不一樣,對實際使用形成了很大的困擾。下面讓咱們看看Python是如何處理這一系列編碼問題的:
1 >>> s = "中文" 2 >>> s 3 '中文' 4 >>> type(s) 5 <class 'str'> 6 >>> b = bytes(s, encoding='utf-8') 7 >>> b 8 b'\xe4\xb8\xad\xe6\x96\x87' 9 >>> type(b) 10 <class 'bytes'>
從例子能夠看出,s
是個字符串類型。Python有個內置函數bytes()
能夠將字符串str
類型轉換成bytes
類型,b
其實是一串01的組合,但爲了在ide環境中讓咱們相對直觀的觀察,它被表現成了b'\xe4\xb8\xad\xe6\x96\x87'
這種形式,開頭的b
表示這是一個bytes
類型。\xe4
是十六進制的表示方式,它佔用1個字節的長度,所以」中文「被編碼成utf-8
後,咱們能夠數得出一共用了6個字節,每一個漢字佔用3個,這印證了上面的論述。在使用內置函數bytes()
的時候,必須明確encoding
的參數,不可省略。
咱們都知道,字符串類str
裏有一個encode()
方法,它是從字符串向比特流的編碼過程。而bytes
類型剛好有個decode()
方法,它是從比特流向字符串解碼的過程。除此以外,咱們查看Python源碼會發現bytes
和str
擁有幾乎如出一轍的方法列表,最大的區別就是encode
和decode
。
從實質上來講,字符串在磁盤上的保存形式也是01的組合,也須要編碼解碼。
若是,上面的闡述還不能讓你搞清楚二者的區別,那麼記住下面兩幾句話:
在將字符串存入磁盤和從磁盤讀取字符串的過程當中,Python自動地幫你完成了編碼和解碼的工做,你不須要關心它的過程。
使用bytes
類型,實質上是告訴Python,不須要它幫你自動地完成編碼和解碼的工做,而是用戶本身手動進行,並指定編碼格式。
Python已經嚴格區分了bytes
和str
兩種數據類型,你不能在須要bytes
類型參數的時候使用str
參數,反之亦然。這點在讀寫磁盤文件時容易碰到。
2.三元運算:
1 result = a if 條件 else b
若是條件爲真,result = a
若是條件爲假,result = b
3.進制:
計算機內存地址和爲何用16進制?
爲何用16進制一、計算機硬件是0101二進制的,16進制恰好是2的倍數,更容易表達一個命令或者數據。十六進制更簡短,由於換算的時候一位16進制數能夠頂4位2進制數,也就是一個字節(8位進制能夠用兩個16進製表示)二、最先規定ASCII字符集採用的就是8bit(後期擴展了,可是基礎單位仍是8bit),8bit用2個16進制直接就能表達出來,無論閱讀仍是存儲都比其餘進制要方便
三、計算機中CPU運算也是遵守ASCII字符集,以1六、3二、64的這樣的方式在發展,所以數據交換的時候16進制也顯得更好
四、爲了統一規範,CPU、內存、硬盤咱們看到都是採用的16進制計算
16進制用在哪裏
一、網絡編程,數據交換的時候須要對字節進行解析都是一個byte一個byte的處理,1個byte能夠用0xFF兩個16進制來表達。經過網絡抓包,能夠看到數據是經過16進制傳輸的。
二、數據存儲,存儲到硬件中是0101的方式,存儲到系統中的表達方式都是byte方式三、一些經常使用值的定義,好比:咱們常常用到的html中color表達,就是用的16進制方式,4個16進制位能夠表達好幾百萬的顏色信息。
4.Python中一切皆對象:
對象是基於類建立的
因此,如下這些值都是對象: "wupeiqi"、3八、['北京', '上海', '深圳'],而且是根據不一樣的類生成的對象。