1、函數app
1、什麼是函數函數
函數就是具備某個具體功能的工具工具
2、爲何要用函數spa
減小代碼冗餘code
提供開發效率blog
提升程序的擴展性開發
3、定義一個函數字符串
def是定義函數的關鍵字class
函數名:函數名的命名規則與變量名的命名規則同樣效率
1.不能以關鍵字命名
2.函數名也要作到見名之意
函數在定義的時候只檢測語法,不會執行代碼
調用函數的固定格式 :
函數名+括號
函數名只要遇到括號會當即執行函數代碼
代碼中遇到函數名加括號 優先級最高
先去執行函數 再去看下面的代碼
2、函數的返回值 return
函數內要想返回給調用者,必須用return
有五種狀況:
1.不寫return :函數默認返回None
def func(): print(1+2) #3 res1 = func() print(res1) #None
2.只寫return:也是返回None,除了有返回值,還能夠直接結束整個函數運行,無論嵌套了幾層循環都會被結束。
print(1+2)不會執行,由於在它前面有個return,以後的全部代碼都不會執行,最終結果只返回None
def func(): return print(1+2) res1 = func() print(res1) #None
3.寫return None:也是返回None,和只寫return同樣也會結束函數運行
def func(): return None print(1+2) res1 = func() print(res1) #None
4.寫return 返回一個值:這個值能夠是任何數據類型
def func(): return '1234' def func1(): return [1,2,3] def func2(): return (1,2,3,4) def func3(): return {'name':'aaa'} print(func(),func1(),func2(),func3()) #1234 [1, 2, 3] (1, 2, 3, 4) {'name': 'aaa'}
5.寫return 返回多個值:return 會自動將多個值以元組的形式返回給調用者
def func(): return '1','2','3' def func1(): return [1,2,3],[4,5,6],[7,8,9] def func2(): return (1,2,3,4),(1,2,3) def func3(): return {'name':'aaa'},{'age':18} print(func(),func1(),func2(),func3()) #('1', '2', '3') ([1, 2, 3], [4, 5, 6], [7, 8, 9]) ((1, 2, 3, 4), (1, 2, 3)) ({'name': 'aaa'}, {'age': 18})
若是不想以元組的方式返回,那就手動加上你想返回的數據類型的符號
def func4(): return [(1,2,3,4),(1,2,3)] print(func4()) #[(1, 2, 3, 4), (1, 2, 3)]
總結:1.全部函數都有返回值,不寫return返回值是None
2.光寫return 或者return None不是考慮函數返回值,而是函數結束運行
3、函數參數 四種:位置參數、關鍵字參數、默認值參數、可變長參數(不定長參數)
函數參數的兩大類型:
形參:在函數定義階段 括號內寫的變量名,叫作該函數的形式參數
實參:在函數調用階段 括號內傳入的實際值,叫作實際參數
形參與實參的關係:
形參就至關於變量名,實參就至關於變量名的值
函數調用傳參的過程,就是給形參賦值的過程
注意:形參和實參的綁定關係只在函數的調用階段有效,函數運行結束關係自動解除,只有在函數內部有效,函數外部無任何影響
如今咱們能夠得出函數的簡易結構:
def 函數名(形參1,形參2。。。):
'''函數註釋'''
函數代碼體1
函數代碼體2
。。。
return 函數的返回值
1.位置參數:在函數定義階段按照位置從左往右依次書寫的變量名,叫作位置形參
位置形參在調用的時候 必須爲其傳值
def func(x,y): return x+y res = func(1,2) print(res) #3
位置實參:在調用函數的時候,多一個參數,少一個參數都不行,傳入的參數要按照位置一一對應傳給形參
2.關鍵字參數:在函數調用階段,給變量名賦值。
def func(x,y): return x+y res = func(3,y=2) print(res) #5
總結:
注意:在函數調用階段,位置參數和關鍵字參數能夠混合使用
但必須保證:
1.位置關鍵字參數必須在關鍵字參數前面(越短的越靠前,越長的越複雜的越靠後),在函數定義階段這個也適用
2.同一個參數不能被屢次賦值
3.默認值參數:在函數定義階段,給變量名賦值
在調用函數階段,若是不給該參數(變量名)傳值,就默認使用在定義階段賦值的值。
在調用函數階段,若是給該參數(變量名)傳值,就使用你傳的值。
在定義階段也是位置參數放在前面,默認值參數放在後面(越短的越在前面,越長的越在後面)
#在調用的時候,不給y傳值 def func(x,y=3): return x+y res = func(3) print(res) #6 #在調用的時候,給y傳值 def func(x,y=3): return x+y res = func(3,y=6) print(res) #9
易錯題分析(這裏一直是在使用惟一一個列表,因此會一直往一個列表裏面添加)
def info(username,hobby,l=[]): l.append(hobby) print('%s 的愛好是 %s'%(username,l)) info('jason','study') info('tank','生蠔') info('kevin','喝腰子湯') info('egon','女教練') #結果 #jason 的愛好是 ['study'] #tank 的愛好是 ['study', '生蠔'] #kevin 的愛好是 ['study', '生蠔', '喝腰子湯'] #egon 的愛好是 ['study', '生蠔', '喝腰子湯', '女教練']
糾正(在調用info的時候,默認傳值l = None,函數體裏面if判斷若是l == None,就會變成l = [],每一次調用都會生成一個)
def info(username,hobby,l=None): if l == None: l = [] l.append(hobby) print('%s 的愛好是 %s'%(username,l)) info('jason','study') info('tank','生蠔') info('kevin','喝腰子湯') info('egon','女教練') #結果 #jason 的愛好是 ['study'] #tank 的愛好是 ['生蠔'] #kevin 的愛好是 ['喝腰子湯'] #egon 的愛好是 ['女教練']
總結:函數不管在什麼地方被調用,都會到函數定義階段去執行代碼,所須要值都是往函數定義階段上面找。
函數在定義階段,內部所使用的的變量都已經所有初始化完畢了,不會由於後面調用位置的改變而影響到內部的值
4.可變長參數:在調用的時候,實參傳遞的個數不固定,可能會傳遞多了,也可能會傳遞少了,在定義的時候,形參也可能會這樣,咱們用*和**來接收多餘的參數
1.站在形參的角度看 *
形參中的*會將實參中的多餘位置參數統一放在元組中,而後傳遞給後面的形參名
*在形參中只能接受多餘的位置參數,其餘的類型參數不行
def func(x,y,*z): print(x,y,z) func(1,2,3,4,5,6) #1 2 (3, 4, 5, 6)
2.站在實參的角度看 *
實參中的*會將元組、列表、集合、字符串打散,而後一一傳入到形參中,打散以後的實參個數要和形參個數一致,否則就會報錯
func(*(1,2,3)) 等價於 func(1,2,3)
def func(x,y,z): print(x,y,z) func(*(1,2,3)) #1 2 3
3.站在形參角度看 **
形參中的 **會將多餘的實參統一放在一個字典中,而後傳遞給後面的形參名
**在形參中只接受多餘的關鍵字參數,其他類型參數不行
def func(x,y,**z): print(x,y,z) func(1,2,a=3,b=4) #1 2 {'a': 3, 'b': 4}
4.站在實參的角度看 ** 將實參中傳入的字典轉換成 key = value
func(**{'x':1,'y':2,'z':3}) 等價於func(x=1,y=2,z=3)
特別重要的一點:在實參中傳參的時候這個字典的key要和形參中的變量名取名一致
def func(x,y,z): print(x,y,z) func(**{'x':1,'y':2,'z':333}) #1 2 333
總結 *和**
*在形參中可以接受實參中多餘的位置參數,而且把他們統一放在一個元組中並賦值給*後面的變量名
**在形參中可以接受實參中多餘的關鍵字參數,而且把他們統一成一個字典並賦值給**後面的變量名
*在實參中可以將列表,元組,字符串,集合打散成位置參數形式傳遞給形參
**在實參中可以將字典打散成key = value 的形式 ,以關鍵字參數傳遞給形參
本節總結:
1.關鍵字參數是在實參中設定
2.默認參數是在形參中設定