1. 程式人生 > >python基礎知識(day3)

python基礎知識(day3)

傳參數 就會 保健 file col 別名 encode 關鍵參數 fun

一、字符編碼與轉碼

先說python2

  1. py2裏默認編碼是ascii
  2. 文件開頭那個編碼聲明是告訴解釋這個代碼的程序 以什麽編碼格式 把這段代碼讀入到內存,因為到了內存裏,這段代碼其實是以bytes二進制格式存的,不過即使是2進制流,也可以按不同的編碼格式轉成2進制流,你懂麽?
  3. 如果在文件頭聲明了#_*_coding:utf-8_*_,就可以寫中文了, 不聲明的話,python在處理這段代碼時按ascii,顯然會出錯, 加了這個聲明後,裏面的代碼就全是utf-8格式了
  4. 在有#_*_coding:utf-8*_的情況下,你在聲明變量如果寫成name=u"大保健",那這個字符就是unicode格式,不加這個u,那你聲明的字符串就是utf-8格式
  5. utf-8 to gbk怎麽轉,utf8先decode成unicode,再encode成gbk

再說python3

  1. py3裏默認文件編碼就是utf-8,所以可以直接寫中文,也不需要文件頭聲明編碼了,幹的漂亮
  2. 你聲明的變量默認是unicode編碼,不是utf-8, 因為默認即是unicode了(不像在py2裏,你想直接聲明成unicode還得在變量前加個u), 此時你想轉成gbk的話,直接your_str.encode("gbk")即可以
  3. 但py3裏,你在your_str.encode("gbk")時,感覺好像還加了一個動作,就是就是encode的數據變成了bytes裏,我擦,這是怎麽個情況,因為在py3裏,str and bytes做了明確的區分,你可以理解為bytes就是2進制流,你會說,我看到的不是010101這樣的2進制呀, 那是因為python為了讓你能對數據進行操作而在內存級別又幫你做了一層封裝,否則讓你直接看到一堆2進制,你能看出哪個字符對應哪段2進制麽?什麽?自己換算,得了吧,你連超過2位數的數字加減運算都費勁,還還是省省心吧。  
  4. 那你說,在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)