python基礎知識(day3)
阿新 • • 發佈:2017-06-23
傳參數 就會 保健 file col 別名 encode 關鍵參數 fun
一、字符編碼與轉碼
先說python2
- py2裏默認編碼是ascii
- 文件開頭那個編碼聲明是告訴解釋這個代碼的程序 以什麽編碼格式 把這段代碼讀入到內存,因為到了內存裏,這段代碼其實是以bytes二進制格式存的,不過即使是2進制流,也可以按不同的編碼格式轉成2進制流,你懂麽?
- 如果在文件頭聲明了#_*_coding:utf-8_*_,就可以寫中文了, 不聲明的話,python在處理這段代碼時按ascii,顯然會出錯, 加了這個聲明後,裏面的代碼就全是utf-8格式了
- 在有#_*_coding:utf-8*_的情況下,你在聲明變量如果寫成name=u"大保健",那這個字符就是unicode格式,不加這個u,那你聲明的字符串就是utf-8格式
- utf-8 to gbk怎麽轉,utf8先decode成unicode,再encode成gbk
再說python3
- py3裏默認文件編碼就是utf-8,所以可以直接寫中文,也不需要文件頭聲明編碼了,幹的漂亮
- 你聲明的變量默認是unicode編碼,不是utf-8, 因為默認即是unicode了(不像在py2裏,你想直接聲明成unicode還得在變量前加個u), 此時你想轉成gbk的話,直接your_str.encode("gbk")即可以
- 但py3裏,你在your_str.encode("gbk")時,感覺好像還加了一個動作,就是就是encode的數據變成了bytes裏,我擦,這是怎麽個情況,因為在py3裏,str and bytes做了明確的區分,你可以理解為bytes就是2進制流,你會說,我看到的不是010101這樣的2進制呀, 那是因為python為了讓你能對數據進行操作而在內存級別又幫你做了一層封裝,否則讓你直接看到一堆2進制,你能看出哪個字符對應哪段2進制麽?什麽?自己換算,得了吧,你連超過2位數的數字加減運算都費勁,還還是省省心吧。
- 那你說,在py2裏好像也有bytes呀,是的,不過py2裏的bytes只是對str做了個別名(python2裏的str就是bytes, py3裏的str是unicode),沒有像py3一樣給你顯示的多出來一層封裝,但其實其內部還是封裝了的。 這麽講吧, 無論是2還是三, 從硬盤到內存,數據格式都是 010101二進制到-->b‘\xe4\xbd\xa0\xe5\xa5\xbd‘ bytes類型-->按照指定編碼轉成你能看懂的文字
在py3中encode,在轉碼的同時還會把string 變成bytes類型,decode在解碼的同時還會把bytes變回string
轉碼方式如下圖所示:
1 __author__ = ‘NL‘ 2 3 import sys 4 5 print(sys.getfilesystemencoding()) 6 print(sys.getdefaultencoding()) 7 8 str = "編碼測試" #python3中,默認編碼格式為unicode 9 print(str) 10 11 str_gbk = str.encode("gbk") #編碼的同時,將string轉成bytes 12 str_decode = str_gbk.decode("gbk") #解碼的同時,將bytes轉成string 13 print(str_gbk) #輸出結果:b‘\xb1\xe0\xc2\xeb\xb2\xe2\xca\xd4‘ 14 print(str_decode)View Code
二、函數
1、函數的基本定義
__author__ = ‘NL‘ def func1(): #不帶參數的函數,無返回值,---》過程 print("func1") def func2(): #不帶參數的函數,有返回值,---》函數 print("func1") return 0 func1() #函數調用 func2() print(func1()) #返回值為None print(func2()) #返回值為0
2、帶參數的函數
1 __author__ = ‘NL‘ 2 3 def func1(x,y): 4 z = x + y 5 return z 6 7 def func2(*args): 8 return args 9 10 def func3(**kwargs): 11 return kwargs 12 13 def func4(x,y=3,*args,**kwargs): 14 return x,y,args,kwargs 15 16 print(func1(3,4)) #結果為7 17 print(func2(1,"haha",[1,5,"kkkte"])) #結果為tuple:(1, ‘haha‘, [1, 5, ‘kkkte‘]) 18 print(func3(name="nl",age=22,sex="M")) #結果為dict:{‘name‘: ‘nl‘, ‘age‘: 22, ‘sex‘: ‘M‘} 19 print(func4(4,9,"nihao",[1,2,3],name="wqx")) #結果為:(4, 9, (‘nihao‘, [1, 2, 3]), {‘name‘: ‘wqx‘})
關鍵參數
正常情況下,給函數傳參數要按順序,不想按順序就可以用關鍵參數,只需指定參數名即可,但記住一個要求就是,關鍵參數必須放在位置參數之後。
遞歸函數
代碼演示,二分查找:
遞歸特性:
1. 必須有一個明確的結束條件
2. 每次進入更深一層遞歸時,問題規模相比上次遞歸都應有所減少
3. 遞歸效率不高,遞歸層次過多會導致棧溢出(在計算機中,函數調用是通過棧(stack)這種數據結構實現的,每當進入一個函數調用,棧就會加一層棧幀,每當函數返回,棧就會減一層棧幀。由於棧的大小不是無限的,所以,遞歸調用的次數過多,會導致棧溢出)
python基礎知識(day3)