== 其餘基礎一 ==

文章引用: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))
View Code

輸出:

 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
View Code

 

回到bytesstr的身上。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'>
View Code

從例子能夠看出,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源碼會發現bytesstr擁有幾乎如出一轍的方法列表,最大的區別就是encodedecode

從實質上來講,字符串在磁盤上的保存形式也是01的組合,也須要編碼解碼。

若是,上面的闡述還不能讓你搞清楚二者的區別,那麼記住下面兩幾句話:

  1. 在將字符串存入磁盤和從磁盤讀取字符串的過程當中,Python自動地幫你完成了編碼和解碼的工做,你不須要關心它的過程。

  2. 使用bytes類型,實質上是告訴Python,不須要它幫你自動地完成編碼和解碼的工做,而是用戶本身手動進行,並指定編碼格式。

  3. Python已經嚴格區分了bytesstr兩種數據類型,你不能在須要bytes類型參數的時候使用str參數,反之亦然。這點在讀寫磁盤文件時容易碰到。

 

2.三元運算:

1 result = a if 條件 else b

若是條件爲真,result = a

若是條件爲假,result = b

3.進制:

  • 二進制,01
  • 八進制,01234567
  • 十進制,0123456789
  • 十六進制,0123456789ABCDEF  二進制到16進制轉換http://jingyan.baidu.com/album/47a29f24292608c0142399cb.html?picindex=1

計算機內存地址和爲何用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八、['北京', '上海', '深圳'],而且是根據不一樣的類生成的對象。

相關文章
相關標籤/搜索