01,定義函式
上回說到有沒有什麼辦法,把經常用的功能實現,重複使用且只需叫一聲就好
程式碼如下
1 def etc_num(): 2 s1 = "wanhaha" 3 s = 0 4 for I in s1: 5 s = s + 1 6 print(s)
這樣可能看的沒什麼感覺,那就在來一遍,如下
1 def num_ret(): 2 s1 = "wanhahah" 3 s = 0 4 for I in s1: 5 s = s+1 6 print(s) 7 num_ret()
總結:
1,關鍵字def開頭中間空格 後面在加函式名函式名後面在加括號在加封號,(def num_ret():)
切記:定義函式必須使用def開頭,中間加空格加括號,加封號,這是python的規定
2,函式名:只能包含字串,下劃線,函式名隨便起,但是最好使用有意義的名字增加程式碼可讀性
3,呼叫:呼叫函式一定要帶括號。
函式的返回值
剛才我們使用函式得到字串的長度,那麼這和len()方法還是不太一樣,我們使用len()都會得到一個值,我們用一個變數來接收這個值
str_len = len("wanhahha")
這個str_len()變數名得到了字串的長度,那麼函式可以做到嗎,我們大膽試試!
1 def num_ret(): 2 s1 = "wanhahah" 3 s = 0 4 for I in s1: 5 s = s+1 6 print(s) 7 func = num_ret() 8 print(func)
執行了這段程式碼,事實證明不行,它給我返回一個Non,那怎麼才能得到我們想要的返回值哪
1 # 定義函式 2 def func(): 3 s1 = "wanhahah" 4 s = 0 5 for I in s1: 6 s = s+1 7 return s 8 ret = func() 9 print(ret)
在這段程式碼裡面有一個新的內建函式,就是return,他到底是什麼,能幹什麼,沒有它可以嗎,
下面繼續,go,go,go
return關鍵字
這個關鍵字非常重要,return翻譯中文的意思是(返回),那麼返回有幾種情況那
1,一個返回值,2,沒返回值,3,多個返回值
(1),一個返回值:就是我們剛剛第一次用return的那一串程式碼,就是一個返回值
(2),沒返回值:就不用寫return,那有人就有疑問了,那一定寫return是不是就肯定有返回值,那我們上程式碼說答案
1 def fucn(): 2 print("沒有返回值哈哈哈") 3 return 4 print("真的沒有哦") 5 ret = fucn() 6 print(ret)
這幾行程式碼,要說一下return下面的print()沒有執行,這個是return的另一種用法,程式一旦遇到rreturn,就結束整個函式
(3)多個返回值:
1 def re_l(): 2 return 1,2,3,4 3 def re_c(): 4 return 1,2,'c',['s','e'] 5 demo = re_l() 6 print(demo) 7 demo_ret = re_c() 8 print(demo)
返回多個值會被組織成元組被返回,也可以用多個值來接收
1 def fu(): 2 return 1,2,3,4 3 # 多個值用一個變數來接收 4 ret1 = fu() 5 print() 6 7 # 多個值,用多個變數來接收 8 a,c,v,b = fu() 9 print(fu())
為什麼會這樣那??,答:用逗號隔開,python會認為這是一個元組
1 # 事例1 2 >>> a,b,c,d = [1,2,3,4] 3 >>> a 4 1 5 >>> b 6 2 7 >>> c 8 3 9 >>> d 10 4 11 >>> 12 13 # 事例2 14 >>> a,_,c,_ = [1,2,3,4] 15 >>> a 16 1 17 >>> c 18 3 19 20 # 事例3:也適用於字串,列表,字典,集合 21 >>> a,b = {'name':'eva','age':18} 22 >>> a 23 'name' 24 >>> b 25 'age' 26 >>>
函式中的引數
現在我們已經完成一個可以返回字串長度的函式,假如(又來了哈哈哈),我們換一個字串怎麼辦,這樣的話我們的函式還是不完美
1 # 定義函式 2 def fucn(s1): 3 '''計算s1的長度''' 4 length = 0 5 for i in s1: 6 length = length + 1 7 return length 8 ret = fucn('hello world') 9 print('ret %s'%ret)
這個時候的函式fucn(s1),就是我們要告訴它要計算誰,這個過程就叫傳遞引數,簡稱傳參,函式裡的s1和hello world就是引數
我們經常聽別人說實參和形參,這兩個到底有什麼區別??
實參和形參
其實最好理解的也很正確的就是我們傳的“hello world”,被稱為實際引數,因為這個實際的引數要交給函式的內容,簡稱實參
所謂s1就是一個形參,因為這個s1只是一個變數的名字,被稱為形式引數,主要因為定義函式的時候它只是一個形式而已,簡稱形參
注意:引數可以傳多個 ,用逗號隔開
1 def func(x,y): 2 the_max = x if x > y else y 3 return the_max 4 ret = func(30,20) 5 print(ret)
引數小班車馬上出發,Are you ready?
位置傳參
1,按照位置傳值
1 def func(x,y): 2 # 此時x是100,y 是20 3 tme_ret = x if x > y else y 4 return tme_ret 5 ret = func(100,20) 6 print(ret)
2,關鍵字傳值
1 def func(x,y): 2 tem_ret = x if x > y else y 3 return tem_ret 4 ret = func(x = 100,y = 200) 5 print(ret)
3,合起來用
1 def fucn(x,y): 2 print(x,y) 3 tme_ret = x if x > y else y 4 return tme_ret 5 ret = fucn(10,y = 30) 6 print(ret)
正確用法
問題一:位置引數必須在關鍵字引數的前面
問題二:對於一個形參只能賦值一次
注意:位置引數必須傳值
def fucn(x,y): tme_ret = x if x > y else y return the_ret ret = fucn() print(ret) # 報錯:TypeError: fucn() missing 2 required positional arguments: 'x' and 'y'
預設引數的定義及使用:
1 def stu(name,sex = 'wede'): 2 '''這裡sex的預設引數是sex值是wede''' 3 print(name,sex) 4 5 stu('xiaohui') 6 stu('xiaobai')
預設引數的陷阱
1 def deul(a,l = []): 2 l.append(a) 3 print(l) 4 5 deul('wede') 6 deul('xiaobai')
動態引數
按位置傳值多餘的引數都由args統一接收,儲存成一個元組的形式
1 def mysum(*args): 2 the_sum = 0 3 for i in args: 4 the_sum+=i 5 return the_sum 6 7 the_sum = mysum(1,2,3,4) 8 print(the_sum)
1 def stu(**kwargs): 2 print(kwargs) 3 print(kwargs['name'],kwargs['sex']) 4 stu(name = 'wede',sex = 'male')
初識函式小結:
定義函式:
1.定義:def 關鍵詞開頭,空格之後接函式名稱和圓括號()。
2.引數:圓括號用來接收引數。若傳入多個引數,引數之間用逗號分割。
引數可以定義多個,也可以不定義。
引數有很多種,如果涉及到多種引數的定義,應始終遵循位置引數、*args、預設引數、**kwargs順序定義。
如上述定義過程中某引數型別預設,其他引數依舊遵循上述排序 3.註釋:函式的第一行語句應該新增註釋。 4.函式體:函式內容以冒號起始,並且縮排。 5.返回值:return [表示式] 結束函式。不帶表示式的return相當於返回 None def 函式名(引數1,引數2,*args,預設引數,**kwargs): """註釋:函式功能和引數說明""" 函式體 …… return 返回值
呼叫函式:
1.函式名() 函式名後面+圓括號就是函式的呼叫。 2.引數: 圓括號用來接收引數。 若傳入多個引數: 應按先位置傳值,再按關鍵字傳值 具體的傳入順序應按照函式定義的引數情況而定 3.返回值 如果函式有返回值,還應該定義“變數”接收返回值 如果返回值有多個,也可以用多個變數來接收,變數數應和返回值數目一致 無返回值的情況: 函式名() 有返回值的情況: 變數 = 函式名() 多個變數接收多返回值: 變數1,變數2,... = 函式名()
引數總結: