標籤:規則 16進位 字母 day image 數字 證明 英文 內容
一.今日內容
(一) is,==,id
(二) 代碼塊的含義
(三) 小資料池
(四) python編碼之二
(一)代碼塊
python程式是有代碼塊組成的,塊是一個python程式的文本,是作為一個單元的執行。
代碼塊:一個模組,一個函數,一個檔案都是一個代碼塊。但是,在互動環境(終端環境)中,每輸入的一個命令,每一行都是一個代碼塊。
而且在一個檔案中的兩個函數,也分別是不同的代碼塊:
(二) ==,id(),is
‘==’:用於判斷兩個對象的內容是否相等
#一個“ = ” 表示賦值運算式name = ‘he‘#“==” 表示數值內容的相同print(‘he‘ == ‘he‘)>>> Truename = ‘he‘name1 = ‘alex‘print(name == name1)>>>False
id() : 返回對象在記憶體當中的記憶體位址
1.在記憶體中,id都是唯一的
2.如果兩個變數指向的值的id相同,就證明他們在記憶體中是同一個。
name = ‘he‘name1 = ‘he‘print(id(name))>>> 2101255303664print(id(name1))>>> 2101255303664
is : 判斷兩個值是否id(記憶體位址)相同
name = ‘he‘name1 = ‘he‘print(name1 is name)>>> True
# 結論:如果is為True,說明記憶體位址相同,那麼值一定相同;如果值相同,記憶體位址未必相同。
(三)小資料池(緩衝機制,駐留機制)
小資料池:又稱為小整數緩衝機制,駐留機制。
小資料池的前提:小資料池的資料類型只針對“整數,字串,bool值”
概念: 小資料池是Python對記憶體做的一個最佳化,將-5~256的整數,以及一定規則的字串,提前在記憶體中建立
了池,池裡固定的放了這些資料。優點:1. 節省記憶體
2. 提高效能和效率
int : -5~256的整數,如果多個變數同時指向這個範圍內的整數,那麼它們在記憶體中將指向同一個記憶體位址。
str:什麼才是一定規則的字串呢??
(1)當字串的長度為0或者1時,預設採用小資料池駐留機制。
(2)當字串的長度大於1時,如果只由英文字母,數字,底線組成,預設採用小資料池駐留機制。
(3)用“*”得到的字串,可以分為兩種情況:
3.1 乘數為1,預設駐留
3.2 乘數為2,但字串總長度小於20時,預設駐留
bool類型:bool值就是True,False,無論你建立多少個變數指向True,False,那麼他在記憶體中只存在一個。
### 代碼塊與小資料池之間的關係 ####
# pycharm 通過運行檔案的方式執行下列代碼:i1 = 1000i2 = 1000print(i1 is i2) # 結果為True
通過互動方式中執行下面代碼:>>> i1 = 1000>>> i2 = 1000>>> print(i1 is i2)False
為什麼在pycharm與互動環境中,輸出的結果會不同呢???這就牽涉到了代碼塊與小資料池之間的關係。
Python在同一個代碼塊中,初始化對象時,會把變數以及對應的值放置到記憶體的一個字典中(類似:dic={‘name‘ =‘he‘對應的記憶體位址}),如果下面代碼再遇到對象的初始化賦值時,如果有相同的值,會去字典中尋找,然後直接複用,指向同一個記憶體位址。
Python在不同代碼塊中,初始化對象時,會遵循小資料池的原則。
參考上面關於代碼塊的概念,因為pycharm中一個py檔案為一個代碼塊,而在互動檔案中,不同的兩行為不同的代碼塊,所以會出現上面的差異。
(四)python編碼之二
編碼之初的內容,看回之前的部落格內容。
###########################################################################################
從之前的內容,我們可以得出以下結論:
(1)編碼之間是不能相互識別的。
(2)因為unicode太過於浪費資源,所以在網路傳輸,本機存放區,都必須不能夠以unicode作為編碼格式。
###########################################################################################
前提須知:
在python3.x版本中,字串的編碼為unicode,其他均為utf-8.
但是這樣又存在了問題,那麼字串作為網路傳輸,本機存放區的資料類型,編碼類別型為unicode,是不允許的。。那要怎麼辦?
於是此時,引出了有一個python中的基礎資料型別 (Elementary Data Type)bytes。bytes類型好比與str類型的雙胞胎兄弟,str類型所有的方法,bytes類型都可以使用。
### bytes類型與str類型的區別?###
對於英文:
str:
表現形式: s1 = ‘hehehe‘
編碼類別型: unicode
bytes:
表現形式: b1 = b‘hehehe‘
編碼類別型: 非unicode
對於中文:
str:
表現形式: s1 = ‘呵呵呵‘
編碼類別型: unicode
bytes:
表現形式: b1 = b‘\xe5\x91\xb5\xe5\x91\xb5\xe5\x91\xb5‘
表現類型:非unicode
結論:
#為什麼需要同時擁有str與bytes?因為中文在bytes中的顯示方式是16進位,不便於閱讀。所以需要同時存在str與bytes#str類型和bytes類型如何使用?在本機存放區/網路socekt傳輸時,用bytes類型,因為字串編碼為unicode。其他用str類型
### bytes類型與str類型的轉換?###
‘‘‘str與bytes的轉換‘‘‘str ----> bytes encode()編碼s1 = ‘alex‘b1 = s1.encode(‘utf-8‘)print(b1,type(b1))
#bytes ---->str decode()解碼b1 = b‘\xe5\x91\xb5\xe5\x91\xb5\xe5\x91\xb5‘s1 = b1.decode(‘utf-8‘)print(s1)>>> 呵呵呵
DAY6 Python之代碼塊,小資料池的詳解