標籤:return get 就會 客戶 根據 美國人 伺服器 結果 技術
瞭解字元編碼的知識儲備
我們日常用到的文字編輯器有nodepad++,pycharm,word等等,用他們存取檔案的過程大致類似,需要知道開啟編輯器就開啟了啟動了一個進程,是在記憶體中的,所以在編輯器編寫的內容也都是存放與記憶體中的,斷電後資料丟失。
為了防止資料丟失我們一般都會點擊儲存,儲存的過程實際就是從記憶體中把資料刷到了硬碟上。
在這一點上,我們編寫一個py檔案(沒有執行),跟編寫其他檔案沒有任何區別,都只是在編寫一堆字元而已。
python解譯器執行py檔案的原理 ,例如python test.py
第一階段:python解譯器啟動,此時就相當於啟動了一個文字編輯器
第二階段:python解譯器相當於文字編輯器,去開啟test.py檔案,從硬碟上將test.py的檔案內容讀入到記憶體中
第三階段:python解譯器解釋執行剛剛載入到記憶體中test.py的代碼
python解譯器是解釋執行檔案內容的,因而python解譯器具備讀py檔案的功能,這一點與文字編輯器一樣
與文字編輯器不一樣的地方在於,python解譯器不僅可以讀檔案內容,還可以執行檔案內容
什麼是字元編碼
我們知道電腦基於高低電平工作,高低平即位元1,低電平即位元0,編程的目的是讓電腦幹活,而編程的結果說白了只是一堆字元,也就是說我們編程最終要實現的是:一堆字元驅動電腦幹活
所以必須經過一個過程:
字元--------(翻譯過程)------->數字
這個過程實際就是一個字元如何對應一個特定數位標準,這個標準稱之為字元編碼
字元編碼的發展史階段一:現代電腦起源於美國,最早誕生也是基於英文考慮的ASCII
ASCII:一個Bytes代表一個字元(英文字元/鍵盤上的所有其他字元),1Bytes=8bit,8bit可以表示0-2**8-1種變化,即可以表示256個字元
ASCII最初只用了後七位,127個數字,已經完全能夠代表鍵盤上所有的字元了(英文字元/鍵盤的所有其他字元)
後來為了將拉丁文也編碼進了ASCII表,將最高位也佔用了
階段二:為了滿足中文,中國人定製了GBK
GBK:2Bytes代表一個字元
為了滿足其他國家,各個國家紛紛定製了自己的編碼
日本把日文編到Shift_JIS裡,韓國把韓文編到Euc-kr裡
階段三:各國有各國的標準,就會不可避免地出現衝突,結果就是,在多語言混合的文本中,顯示出來會有亂碼。
於是產生了unicode, 統一用2Bytes代表一個字元, 2**16-1=65535,可代表6萬多個字元,因而相容萬國語言
但對於通篇都是英文的文本來說,這種編碼方式無疑是多了一倍的儲存空間(二進位最終都是以電或者磁的方式儲存到儲存介質中的)
於是產生了UTF-8,對英文字元只用1Bytes表示,對中文字元用3Bytes
需要強調的一點是:
unicode:簡單粗暴,所有字元都是2Bytes,優點是字元->數位轉換速度快,缺點是佔用空間大
utf-8:精準,對不同的字元用不同的長度表示,優點是節省空間的,缺點是:字元->數位轉換速度慢,因為每次都需要計算出字元需要多長的Bytes才能夠準確表示
記憶體中使用的編碼是unicode,用空間換時間(程式都需要載入到記憶體才能運行,因而記憶體應該是儘可能的保證快)
硬碟中或者網路傳輸用utf-8,網路I/O延遲或磁碟I/O延遲要遠大與utf-8的轉換延遲,而且I/O應該是儘可能地節省頻寬,保證資料轉送的穩定性。
字元編碼分類
電腦由美國人發明,最早的字元編碼為ASCII,只規定了英文字母數字和一些特殊字元與數位對應關係。最多隻能用 8 位來表示(一個位元組),即:2**8 = 256,所以,ASCII碼最多隻能表示 256 個符號
ascii用1個位元組(8位二進位)代表一個字元
unicode常用2個位元組(16位二進位)代表一個字元,生僻字需要用4個位元組
這時候亂碼問題消失了,所有的文檔我們都使用但是新問題出現了,如果我們的文檔通篇都是英文,你用unicode會比ascii耗費多一倍的空間,在儲存和傳輸上十分的低效
本著節約的精神,又出現了把Unicode編碼轉化為“可變長編碼”的UTF-8編碼。UTF-8編碼把一個Unicode字元根據不同的數字大小編碼成1-6個位元組,常用的英文字母被編碼成1個位元組,漢字通常是3個位元組,只有很生僻的字元才會被編碼成4-6個位元組。如果你要傳輸的文本包含大量英文字元,用UTF-8編碼就能節省空間的:
字元編碼的使用文字編輯器一鍋端
總結:
無論是何種編輯器,要防止檔案出現亂碼(請一定注意,存放一段代碼的檔案也僅僅只是一個普通檔案而已,此處指的是檔案沒有執行前,我們開啟檔案時出現的亂碼)
核心法則就是,檔案以什麼編碼儲存的,就以什麼編碼方式開啟
程式的執行
階段一:啟動python解譯器
階段二:python解譯器此時就是一個文字編輯器,負責開啟檔案test.py,即從硬碟中讀取test.py的內容到記憶體中
此時,python解譯器會讀取test.py的第一行內容,#coding:utf-8,來決定以什麼編碼格式來讀入記憶體,這一行就是來設定python解譯器這個軟體的編碼使用的編碼格式這個編碼,
可以用sys.getdefaultencoding()查看,如果不在python檔案指定頭資訊#-*-coding:utf-8-*-,那就使用預設的
python2中預設使用ascii,python3中預設使用utf-8
階段三:讀取已經載入到記憶體的代碼(unicode編碼的二進位),然後執行,執行過程中可能會開闢新的記憶體空間,比如x="egon"
記憶體的編碼使用unicode,不代表記憶體中全都是unicode編碼的二進位,
在程式執行之前,記憶體中確實都是unicode編碼的二進位,比如從檔案中讀取了一行x="egon",其中的x,等號,引號,地位都一樣,都是一般字元而已,都是以unicode編碼的二進位形式存放與記憶體中的
但是程式在執行過程中,會申請記憶體(與程式碼所存在的記憶體是倆個空間),可以存放任意編碼格式的資料,比如x="egon",會被python解譯器識別為字串,會申請記憶體空間來存放"hello",然後讓x指向該記憶體位址,此時新申請的該記憶體位址儲存也是unicode編碼的egon,如果代碼換成x="egon".encode(‘utf-8‘),那麼新申請的記憶體空間裡存放的就是utf-8編碼的字串egon了
針對python3如
瀏覽網頁的時候,伺服器會把動態產生的Unicode內容轉換為UTF-8再傳輸到瀏覽器
如果服務端encode的編碼格式是utf-8, 用戶端記憶體中收到的也是utf-8編碼的二進位。
python2與python3的區別在python2中有兩種字串類型str和unicode
str類型
當python解譯器執行到產生字串的代碼時(例如s=‘林‘),會申請新的記憶體位址,然後將‘林‘encode成檔案開頭指定的編碼格式,這已經是encode之後的結果了,所以s只能decode
所以很重要的一點是:
在python2中,str就是編碼後的結果bytes,str=bytes,所以在python2中,unicode字元編碼的結果是str/bytes
unicode類型
當python解譯器執行到產生字串的代碼時(例如s=u‘林‘),會申請新的記憶體位址,然後將‘林‘以unicode的格式存放到新的記憶體空間中,所以s只能encode,不能decode
列印到終端
對於print需要特別說明的是:
當程式執行時,比如
x=‘林‘
print(x) #這一步是將x指向的那塊新的記憶體空間(非代碼所在的記憶體空間)中的記憶體,列印到終端,而終端仍然是運行於記憶體中的,所以這列印可以理解為從記憶體列印到記憶體,即記憶體->記憶體,unicode->unicode
對於unicode格式的資料來說,無論怎麼列印,都不會亂碼
python3中的字串與python2中的u‘字串‘,都是unicode,所以無論如何列印都不會亂碼
在pycharm中
在windows終端
但是在python2中存在另外一種非unicode的字串,此時,print x,會按照終端的編碼執行x.decode(‘終端編碼‘),變成unicode後,再列印,此時終端編碼若與檔案開頭指定的編碼不一致,亂碼就產生了
在pycharm中(終端編碼為utf-8,檔案編碼為utf-8,不會亂碼)
在windows終端(終端編碼為gbk,檔案編碼為utf-8,亂碼產生)
在python3中也有兩種字串類型str和bytes
str是unicode
bytes是bytes
-------------------------------------------------------------------------------------------------------------------------------------
python中的函數
python中函數定義:函數是邏輯結構化和過程化的一種編程方法。
python中函數定義方法:
def test(x): "The function definitions" x+=1 return x def:定義函數的關鍵字test:函數名():內可定義形參"":文檔描述(非必要,但是強烈建議為你的函數添加描述資訊)x+=1:泛指代碼塊或程式處理邏輯return:定義傳回值調用運行:可以帶參數也可以不帶函數名(
補充:
1.程式設計語言中的函數與數學意義的函數是截然不同的倆個概念,程式設計語言中的函數是通過一個函數名封裝好一串用來完成某一特定功能的邏輯
2.函數式編程就是:先定義一個數學函數(數學建模),然後按照這個數學模型用程式設計語言去實現它。至於具體如何?和這麼做的好處,且看後續的函數式編程。
為何使用函數
總結使用函數的好處:
1.代碼重用
2.保持一致性,易維護
3.可擴充性
函數和過程
流程定義:過程就是簡單特殊沒有傳回值的函數
def test01(): msg=‘hello The little green frog‘ print msg def test02(): msg=‘hello WuDaLang‘ print msg return msg t1=test01() t2=test02() print ‘from test01 return is [%s]‘ %t1print ‘from test02 return is [%s]‘ %t2
總結:當一個函數/過程沒有使用return顯示的定義傳回值時,python解譯器會隱式的返回None,
所以在python中即便是過程也可以算作函數。
def test01(): pass def test02(): return 0 def test03(): return 0,10,‘hello‘,[‘alex‘,‘lb‘],{‘WuDaLang‘:‘lb‘} t1=test01()t2=test02()t3=test03() print ‘from test01 return is [%s]: ‘ %type(t1),t1print ‘from test02 return is [%s]: ‘ %type(t2),t2print ‘from test03 return is [%s]: ‘ %type(t3),t3
總結:
傳回值數=0:返回None
傳回值數=1:返回object
傳回值數>1:返回tuple
函數參數
1.形參變數只有在被調用時才分配記憶體單元,在調用結束時,即刻釋放所分配的記憶體單元。因此,形參只在函數內部有效。函數調用結束返回主調用函數後則不能再使用該形參變數
2.實參可以是常量、變數、運算式、函數等,無論實參是何種類型的量,在進行函數調用時,它們都必須有確定的值,以便把這些值傳送給形參。因此應預先用賦值,輸入等辦法使參數獲得確定值
3.位置參數和關鍵字(標準調用:實參與形參位置一一對應;關鍵字調用:位置無需固定)
4.預設參數
5.參數組
內建函數
Python--字元編碼、文文書處理、函數