Python字符編碼與函數(shù)的基本使用方法
一、Python2中的字符存在的解碼編碼問題
如果是現(xiàn)在正在用Python2的人應該都知道存在字符編碼問題,就舉一個最簡單的例子吧:Python2是無法在命令行直接打印中文的,當然他也是不會報錯的,頂多是一堆你看不懂的亂碼。如果想在直接顯示中文,我們是可以在Python2文件頭部申明字符編碼的格式。如下圖

這里 #-*-coding:utf-8 -*- 是用來申明下面的代碼是用什么編碼來解釋;
1.1.Python2中的解碼和編碼:
在編碼和解碼的世界中,我們得需要找一個大家都知道的文字。也可以這么理解。我是一個中國人現(xiàn)在和一個日本人溝通,我肯定是無法理解他說的是什么,他同樣也無法理解,但是這樣就沒有辦法了嗎?或許我們需要一個國際的語言——英語。這樣來自不同國家的人也可以進行溝通了(雖然我知道 are you ok 0-0)。在編碼中也是一樣,gbk和utf-8都不知道對方的格式是什么吊意思。所以如果要上gbk讀懂utf-8的編碼就得將utf-8 decode成 Unicode,而Unicode有知道gkb,這里需要將Unicode在encode成gbk就行了

#-*- coding:utf-8 -*- msg = "中國" print msg #解碼在編碼的過程,encoding是申明用申明這段代碼是什么編碼 gbk_str = msg.decode(encoding='utf-8').encode(encoding='gbk') print gbk_str #其實兩種輸出的結果是一樣的
在Python2中默認是使用gbk來解釋IDE中的代碼的,所以無法直接在Python命令行中直接輸入中文,所以我們才會使用 #-*-coding:utf-8 -*-來申明頭部,我們到底需要使用什么語言來解釋下面代碼。細心的人肯定是發(fā)現(xiàn)了一個問題,申明頭部只是使用utf-8來解釋下面的話,按理說命令行中雖然不報錯,但是應該也是亂碼才是,這里為啥會直接輸出中文呢畢竟DOS命令行中默認支持的是gbk格式的字符代碼呀?這里就涉及到另外的一個概念了。Python到內存解釋器里面,默認是用的Unicode,文件加載到內存后自動解碼成Unicode,而Unicode是外國碼,自然也就可以翻譯來自utf-8的編碼,也可以翻譯成gbk的編碼了。顧可以顯示中文了。
PS:這里我們得出一個結論:python2 中解碼動作是必須的,但是編碼可以不用,因為內存就是Unicode
1.2、Python3中字符編碼的問題:
額,這還有什么可以說的呢?Python3默認就是使用utf-8解釋代碼的。也就是行首自帶 #-*-coding:utf-8 -*-(GBM),所以也就不存在解碼的問題。但是我在這里提上一嘴(其實就是怕自己以后也忘了,嘿嘿),如果我們將utf-8的字符編碼的格式給編碼成gbk。這里會輸出bytes格式的東西。

bytes到底是什么東西呢?這里我簡單的說一下。其實就是這個字符在ASCII碼中對應的位置。不信,我們通過一段代碼截圖看看:

在這一幅圖中我們看到中國被傳成了一堆看不懂的鳥文。而英文還是顯示出來了。但是我們通過列表的截取,看出最后一位的c輸出的是99,其實這里輸出的就是ASCII中c對應的位置,而3個bytes是一個中文,所以我們看到了6段鳥文字,這里我們就不過多解釋了。
PS:大家得記得一個東西就是:Python2 里面的str 就是Python3中的bytes格式,而Python2中的str其實就是Unicode
二、Python3對文件操作補充
2.1、帶“+”的文件操作:
在這里我會說三個,但是其實這些東西都沒有什么鳥用,只是這算上一個知識點
r+: 可讀,可以追加
w+:清空源文件,再寫入新內容
a+:追加,可以讀
f = open('lyrics','r+',encoding='utf-8') #這里的lyrics是文件名字
f.read() #我先讀取
f.write("Leon Have Dream") #在后面追加
f.close()
r+:如果是先f.read()再f.write()就是在文件的結尾追加,如果是直接f.write()就直接將文件開始的內容替換成()中的內容;
f = open('lyricsback','w+',encoding='utf-8')
f.read()
f.write("Leon Have Dream")
f.read()
f.close()
w+:其實就是清空內容再重新寫入write()中的內容,并且f.read()也不會報錯,個人建議可以在快要離職的時候執(zhí)行這個操作
f = open('lyricsback','a+',encoding='utf-8')
f.read()
f.write("Leon Have A Draem")
f.read()
f.close()
a+:其實和r+非常相似是在結尾中追加內容,可讀內容
PS:這里的補充一下,為什么在使用r+的時候先執(zhí)行f.read()再執(zhí)行f.write()就會在文件的結尾追加和直接使用f.write()直接就替換文件最前邊的內容呢?這是因為Python在讀文件的時候自己維護這一個“指針”,如果我們使用f.read()就相當于讀完了這個文件,這時候指針也就會在最后面了。下面我在補充“f”這個對象的幾個用法來證明Python文件指針。
f = open('lyricsback','r+' ,encoding='utf-8')
print(f.tell()) #this number is 0
f.seek(12) # 將指針向后面移動幾個字節(jié),一個漢字是三個字節(jié)
print(f.tell()) # this is seek number
f.write("Love Girl") #這里就從seek到地方替換
print(f.tell()) # tell()用法就是文件的指針位置
f.close()
2.2、加b的方式對文件進行操作
rb:將文件以二進制的方式從硬盤中讀取出來,這里得記住在open()函數(shù)中不要加encoding= 這個參數(shù)因為二進制不存在編碼上的問題
wb:將文件以二進制的方式寫入內容,不過在f.write()中加上encode="utf-8",意思就是申明編碼的格式,并且會清楚原來文件內容
ab:只能以二進制方式追加。
三、函數(shù)
什么是函數(shù)?函數(shù)可以簡單理解一段命令的集合。為什么需要用函數(shù)?這里有一個非常簡單的原因,比如說你需要對一段代碼反復進行操作,這里你當然可以一直復制再粘貼,但是這樣靈活性和日后的維護成本將會變大。
#比方說現(xiàn)在需要寫一個報警(調用接口)的程序,這里就用監(jiān)控做比喻 if cpu > 80%: 連接郵箱服務器 發(fā)送消息 關閉連接 if memery > 80%: 連接郵箱服務器 發(fā)送消息 關閉連接 if disk > 80% 連接郵箱服務器 發(fā)送消息 關閉連接 #通過寫這樣的一個程序我們發(fā)現(xiàn)我們一直在重復調用發(fā)送郵箱的這一套接口。這樣我們是否能想出一個辦法解決這樣的重復操作呢?請看下一個版本 發(fā)送郵件(): l連接郵箱服務器 發(fā)送連接 關閉連接 if cpu > 80% 發(fā)送郵件() if memery > 80%: 發(fā)送郵件() ....... # 這樣以此類推,我們只需要挑用發(fā)送郵件的這個接口就可以節(jié)省代碼的發(fā)送郵件了
通過上面的代碼我們發(fā)現(xiàn),我們只需要將報警的這一套流程放到一個公共的地方,等下面觸發(fā)報警的條件的時候調用報警的函數(shù),這樣我們就可以省去當每次觸發(fā)報警的時候我們自己在寫報警的步驟了。但是函數(shù)是怎么定義呢?又有什么語法和定義呢?請看下面的一段代碼,其中代碼輸出的是“Leon Have A Dream”
def leon(): #leon是函數(shù)名字
print("Leon Have A Dream")
leon() #調用函數(shù)
帶參數(shù)的函數(shù):
a = 10 b = 5 def calc(a,b): print(a ** b) c = calc(a,b) print(c)
首先上面這些代碼執(zhí)行完會輸出兩個字符,一個是10000,一個是None,為什么會這樣呢?首先c是等于執(zhí)行了一遍calc這個函數(shù),所以輸出10000這個數(shù)字是肯定的,但是為什么還會輸出一個None呢?原來我們的“c”執(zhí)行了儀表calc函數(shù),而calc函數(shù)中沒有任何的返回值,所以c == None 。
PS:函數(shù)的返回結果就是return,其中return的含義就是:把函數(shù)的執(zhí)行結果返回給外面,從而讓挑用函數(shù)的“對象”得到執(zhí)行結果
下面我們在看與之相似的列子
a = 10 b = 5 def calc(a,b): print(a ** b) return a + b c = calc(a,b) c = calc(10,6) print(c)
首先會輸出的有三個值,分別是100000,1000000,16,為什么會是這三個呢,下面用一副圖來說一下

PS:
形參變量只有在被調用時才分配內存單元,在調用結束時,即刻釋放所分配的內存單元。因此,形參只在函數(shù)內部有效。函數(shù)調用結束返回主調用函數(shù)后則不能再使用該形參變量
實參可以是常量、變量、表達式、函數(shù)等,無論實參是何種類型的量,在進行函數(shù)調用時,它們都必須有確定的值,以便把這些值傳送給形參。因此應預先用賦值,輸入等辦法使參數(shù)獲得確定值
Python中的全局變量和局部變量

PS:函數(shù)內部是可以修改列表,字典,集合,實例(class),我們通過下面一個圖來說明

為什么列表和字典等會被添加和修改呢,原來函數(shù)內部知識引用了字典和列表的內存地址,而內存地址無法修改(可以重新開辟一塊內存地址),而每個字典和列表中的每一個值都有對應的內存地址,但是記住我們函數(shù)是引用的列表或者字典本身的內存地址,所以這樣打印到出來的也就會跟著改變了。
全局與局部變量
在子程序中定義的變量稱為局部變量,在程序的一開始定義的變量稱為全局變量。
全局變量作用域是整個程序,局部變量作用域是定義該變量的子程序。
當全局變量與局部變量同名時:
在定義局部變量的子程序內,局部變量起作用;在其它地方全局變量起作用。
位置參數(shù):

像上面這樣實參和形參一一對應的上就是就是位置參數(shù)
默認參數(shù):

在函數(shù)將一個位置參數(shù)設置成一個默認的值的那一個變量就是默認參數(shù),記住默認參數(shù)得在位置參數(shù)得后面
關鍵參數(shù):

像上面這樣實參和形參不一一對應,并且在調用函數(shù)的時候給參數(shù)賦值的叫做關鍵參數(shù)
非固定函數(shù):

通過輸出結果我們發(fā)現(xiàn)*args是接收多余的字符串類型的參數(shù),而想Python="simple"(字典)類型的會傳入給**kwargs,這就是非固定參數(shù);當你不知道這個參數(shù)需要多少個參數(shù)時可以使用該函數(shù)類型
遞歸函數(shù)——二分查找
a = [1,2,3,4,5,7,9,10,11,12,14,15,16,17,19,21]
def calc(num,find_num):
print(num)
mid = int(len(num) / 2)
if mid == 0:
if num[mid] == find_num:
print("find it %s"%find_num)
else:
print("cannt find num")
if num[mid] == find_num:
print("find_num %s"%find_num)
elif num[mid] > find_num:
calc(num[0:mid],find_num)
elif num[mid] < find_num:
calc(num[mid+1:],find_num)
calc(a,12)

遞歸的特性
函數(shù)必須有明確的結束(判斷)條件,也就是上圖一開始的mid[0] 不能等于0,因為這樣就會沒有意義了
每次進入更深一層遞歸時,問題規(guī)模相比上次遞歸都應有所減少
遞歸函數(shù)每次向下遞歸一次,上次的函數(shù)占用的內存地址不會被釋放,而是一直會被阻塞主,等待函數(shù)全部執(zhí)行完畢后釋放,所以也可以說遞歸是相當消耗內存空間的,對此Python有遞歸的深度,如果超過該深度函數(shù)將會被推出(棧溢出)
匿名函數(shù):
calc = lambda x:x+2 # x是形參,冒號后的內容是該匿名函數(shù)執(zhí)行的動作 print(calc(5)) #匿名函數(shù)意識需要通過調用來執(zhí)行的 calc = lambda x,y,z:x*y*z #匿名函數(shù)可以傳入多個形參,各個參數(shù)之間用逗號隔開 print(calc(2,4,6)) c = map(lambda x:x*2,[2,5,4,6]) #map方法需要 傳入兩個參數(shù)一個是function(函數(shù)),itrables(可迭代)的數(shù)據(jù)類型 for i in c: print(i) #三元運算 for i in map(lambda x:x**2 if x >5 else x - 1,[1,2,3,5,7,8,9]): #lambda最多支持三元運算,map是直接調用匿名函數(shù),但是如果想打印map的內容,需要循環(huán) print(i)
高階函數(shù):
def calc(x,y,f): print(f(x) + f(y)) calc(10,-10,abs)
高階函數(shù)的特性
把一個函數(shù)的內存地址傳給另外一個函數(shù),當做參數(shù)
一個函數(shù)把另外一個函數(shù)的當做返回值返回
滿足上面的這個兩個特性中的一個就可以稱為高階函數(shù),這里因為偷懶,就是直接調用了Python中的內置函數(shù)
以上這篇Python字符編碼與函數(shù)的基本使用方法就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
Python3.6安裝及引入Requests庫的實現(xiàn)方法
下面小編就為大家分享一篇Python3.6安裝及引入Requests庫的實現(xiàn)方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-01-01
python opencv實現(xiàn)信用卡的數(shù)字識別
這篇文章主要介紹了python opencv實現(xiàn)信用卡的數(shù)字識別,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2020-01-01

