1. 程式人生 > >18/5/4 小數據池,編碼的進階

18/5/4 小數據池,編碼的進階

src HA 亂碼 條件 error: splay 轉化 width seq

一、內存地址(id):

  變量:將計算的中間結果儲存起來,以便後續代碼使用

    問題來了:變量存在哪裏呢,或許可以這樣問:變量儲存在內存哪裏呢?

      內存會進行分區,每個分區都有一個序號,而每個分區裏面都儲存著數據,變量就來自這裏,而分區的序號就叫內存地址

  python 這門語言不像 C 語言,C 語言是屬於內存級別的語言,C 涉及到指針,內存。而 python 不同,它的內存級別的已經設計好了。所以 python 比 C 簡單,也正是如此,雖然 python 也有內存地址這個概念,但是它的內存地址和真實的內存地址是不一樣的,只是 python 解釋器虛擬的一個地址

name = 
alex print(id(name)) #查詢‘alex’的內存地址 2471424258264 name = alex print(id(name)) #再次查詢 1648814026968 #id出現變化

    一個等號 “=” 代表賦值,兩個等號 “==” 代表比較是否相等

    is 內存地址是否相同 【驗證內存地址是否相等不能在pycharm中進行,必須在終端驗證】

技術分享圖片

因為第一個是 True 所以 i 和 i1 在內存中用的是同一個值,第二個是 False 所以 i 和 i1 在內存中用的是兩個值 這就引出來小數據池的概念

二、小數據池 :

  只存在於 int(整數) str(字符串)當中,在一定範圍內,如果兩個數值相同:為了節省內存,共用一個內存地址。

技術分享圖片

int的範圍: -5 ~256

str的限制條件【不知道全不全】

                1.單個字母元素*個數(不能超過21)存在小數據池

                2.自己設置的字符串(只包含數字字母),不管多大,都存在小數據池

技術分享圖片

三、編碼的進階

  1.不同的密碼本之間的二進制是不能全互相識別的,容易報錯或者產生亂碼

技術分享圖片
#gbk  utf-8

#對於字母,數字,特殊符號的編碼都是引用  ascii  碼,所以可以直接轉化。
s1 = 123asd*&^ b1 = s1.encode(utf-8) # 轉化為 utf-8 的字節 s2 = b1.decode(gbk) #直接轉化 gbk 的字符串 print(s2) 123asd*&^
補充:字母數字特殊字符,可以互相轉換

  2.計算機的文件存儲和傳輸都是二進制 010101 (gbk , utf-8 , ascii , gb2312) 不能是unicode(萬國碼,造成資源浪費)

大前提:python3x ,編碼

  數據類型:

    int

    str

    bytes (字節) : str 擁有的所有方法,bytes都有

    bool

    list

    tupule (元組)

    dict (字典)

    set (集合)

  str ; python3x 內存中的(字符串)編碼方式是 Unicode (規定)

技術分享圖片

    英文:

      str:表現形式 name = ‘alex‘

        內部編碼: unicode

name = alex
print(name,type(name))

alex <class str>

      bytes:表現形式: name1 = b‘alex‘

         內部編碼:非unicode

name1 = balex
print(name1,type(name1))

balex <class bytes>

    中文:

      str:表現形式: name = “中國”

        內部編碼: Unicode

name1 = 中國
print(name1,type(name1))

中國 <class str>

      bytes:表現形式:b‘\xe4\xb8\xad\xe5\x9b\xbd‘

        內部編碼:非Unicode

name = 中國.encode(‘utf-8‘)
print(name,type(name))

b\xe4\xb8\xad\xe5\x9b\xbd <class bytes>    #\xe4 : 一個字節

技術分享圖片

四、str ---> bytes 轉化    ‘字符串‘.encode(編碼方式)    # encode 編碼

  bytes--->str 轉化 字節.decode(編碼方式)    # decode  解碼

    #  編碼方式必須相同,否則會產生亂碼或報錯

name = 中國.encode(utf-8)
print(name,type(name))
name1 = name.decode(gbk)
print(name1,type(name1))


b\xe4\xb8\xad\xe5\x9b\xbd <class bytes>
UnicodeDecodeError: gbk codec cant decode byte 0xad in position 2: illegal multibyte sequence          #報錯

18/5/4 小數據池,編碼的進階