python中小數據池和編碼

⼀. 小數據池

在說小數據池之前. 我們先看⼀個概念. 什麼是代碼塊:

根據提示我們從官⽅⽂檔找到了這樣的說法:

A Python program is constructed from code blocks. A block is a piece of Python program text that is executed as a unit. The following are blocks: a module, a function body, and a class definition. Each command typed interactively is a block. A script file (a file given as standard input to the interpreter or specified as a command line argument to the interpreter) is a code block. A script command (a command specified on the interpreter command line with the ‘-c‘ option) is a code block. The string argument passed to the built-in functions eval() and exec() is a code block. A code block is executed in an execution frame. A frame contains some administrative information (used for debugging) and determines where and how execution continues after the code block’s execution has completed.

粗略的翻譯:

python程序是由代碼塊構成的. ⼀個代碼塊的⽂本作爲python程序執⾏的單元. 代碼塊: ⼀個模塊, ⼀個函數, ⼀個類,
甚⾄每⼀個command命令都是⼀個代碼塊. ⼀個⽂件也是⼀ 個代碼塊, eval()和exec()執⾏的時候也是⼀個代碼塊

二、接下來我們來看一下小數據池is和 ==的區別

1、id( )

通過id( )我們可以查看到一個變量表示的值的內存地址

s = 'alex'
print(id(s)) # 4326667072

2、is和==

== 判斷左右兩段的值是否相等,是否一致

is 判斷左右兩端的內存地址是否一致,如果一致就返回True

注意:如果內存地址相同. 那麼值⼀定是相等的;如果值相等. 則不⼀定是同⼀個對象 。

3、小數據池.:⼀種數據緩存機制. 也被稱爲駐留機制.

小數據池只針對: 整數, 字符串, 布爾值. 其他的數據類型不存在駐留機制 。

對於整數, Python官⽅⽂檔中這麼說:
The current implementation keeps an array of integer objects for all integers between -5 and 256, when you create an int in that range you actually just get back a reference to the existing object. So it should be possible to change the value of 1. I suspect the behaviour of Python in this case is undefined.

對於字符串:
Incomputer science, string interning is a method of storing only onecopy of each distinct string value, which must be immutable. Interning strings makes some stringprocessing tasks more time- or space-efficient at the cost of requiring moretime when the string is created or interned. The distinct values are stored ina string intern pool. –引⾃維基百科

在python中對-5到256之間的整數會被駐留在內存中,將一定規則的字符串緩存,在使用的時候,內存中只會創建一個該數據的對象,保存小數據池中,當使用的時候直接從

小數據池中獲取對象的內存引用,二不需要創建一個新的數據,這樣可以節省更多的內存。

  • 優點:能夠提高一些字符串、整數的處理速度,省去了創建對象的過程。

  • 缺點:在”池“中插入或者創建新值會花費更多時間。

對於數字: -5~256是會被加到⼩數據池中的. 每次使⽤都是同⼀個對象.

對於字符串:

  1. 如果字符串的⻓度是0或者1, 都會默認進⾏緩存
  2. 字符串⻓度⼤於1, 但是字符串中只包含字⺟, 數字, 下劃線時纔會緩存
  3. ⽤乘法的到的字符串.
    ①. 乘數爲1, 僅包含數字, 字⺟, 下劃線時會被緩存. 如果包含其他字符, ⽽⻓度<=1 也會被駐存,
    ②. 乘數⼤於1 . 僅包含數字, 字⺟, 下劃線這個時候會被緩存. 但字符串⻓度不能⼤於20
  4. 指定駐留. 我們可以通過sys模塊中的intern()函數來指定要駐留的內容.
a = 1000
b = 1000
print(a is b)

注意. 在py⽂件中.得到的結果是True, 但是在command中就不是了.

在代碼塊內的緩存機制是不⼀樣的. 在執⾏同⼀個代碼塊的初始化對象的命令時, 會檢查是否其值是否已經存在, 如果存在, 會將其重⽤. 換句話說: 執⾏同⼀個代碼塊時,

遇到初始化對象的命令時, 他會將初始化的這個變量與值存儲在⼀個字典中, 在遇到新的變量時, 會先在字典中查詢記錄, 如果有同樣的記錄那麼它會重複使⽤這個字典中的

之前的這個值. 所以在你給出的例⼦中, ⽂件執⾏時(同⼀個代碼塊) 會把a, b兩個變量指向同⼀個對象.如果是不同的代碼塊, 他就會看這個兩個變量是否是滿⾜⼩數據池的數據,

如果是滿⾜⼩數據池的數據則會指向同⼀個地址. 所以: a, b的賦值語句分別被當作兩個代碼塊執⾏, 但是他們不滿⾜⼩數據池的數據所以會得到兩個不同的對象, 因⽽is判斷

返回False.

三、編碼

  1. ASCII : 最早的編碼. ⾥⾯有英⽂⼤寫字⺟, ⼩寫字⺟, 數字, ⼀些特殊字符. 沒有中⽂,8個01代碼, 8個bit, 1個byte
  2. GBK: 中⽂國標碼, ⾥⾯包含了ASCII編碼和中⽂常⽤編碼. 16個bit, 2個byte
  3. UNICODE: 萬國碼, ⾥⾯包含了全世界所有國家⽂字的編碼. 32個bit, 4個byte, 包含了ASCII
  4. UTF-8: 可變⻓度的萬國碼. 是unicode的⼀種實現. 最⼩字符佔8位
    英⽂: 8bit 1byte
    歐洲⽂字:16bit 2byte
    中⽂:24bit 3byte

在python3的內存中,在程序運行階段,使用的是unicode編碼。因爲unicode是萬國碼,什麼內容都可以進行顯示,那麼在數據傳輸和存儲的時候由於unicode比較浪費時間和資源。需要把unicode轉村委utf-8或者gbk進行存儲。

在python中可以把文字信息進行編碼。編碼以後的內容就可以進行傳輸了,編碼以後的數據都是bytes類型的數據,其實原來的數據只是被編碼了,並沒有改變信息內容。

  1. bytes的表現形式:
  • 英文 b' alex’ 引文的表現形式跟字符串沒什麼區別

  • 中文 b'\xe4\xb8\xad‘ 這是一個漢字的utf-8的bytes表現形式。

字符串在傳輸時轉化成bytes=> encode(字符集)來完成

s = "alex"
print(s.encode("utf-8")) # 將字符串編碼成UTF-8
print(s.encode("GBK")) # 將字符串編碼成GBK

#結果:
b'alex'b'alex'
s = "中"
print(s.encode("UTF-8")) # 中⽂編碼成UTF-8
print(s.encode("GBK")) # 中⽂編碼成GBK

#結果:
b'\xe4\xb8\xad'
b'\xd6\xd0

解碼

s = "我叫李嘉誠"
print(s.encode("utf-8")) #
b'\xe6\x88\x91\xe5\x8f\xab\xe6\x9d\x8e\xe5\x98\x89\xe8\xaf\x9a'
print(b'\xe6\x88\x91\xe5\x8f\xab\xe6\x9d\x8e\xe5\x98\x89\xe8\xaf\x9a'.decode("utf-8")) # 解碼

編碼和解碼的時候都需要制定編碼格式.

#學習中遇到問題沒人解答?小編創建了一個Python學習交流羣:153708845
s = "我是⽂字"
bs = s.encode("GBK") # 我們這樣可以獲取到GBK的⽂字
# 把GBK轉換成UTF-8
# ⾸先要把GBK轉換成unicode. 也就是需要解碼
s = bs.decode("GBK") # 解碼
# 然後需要進⾏重新編碼成UTF-8
bss = s.encode("UTF-8") # 重新編碼
print(bss)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章