10、函數
阿新 • • 發佈:2017-05-20
foo 保持 value color insert == int wrap 關鍵字
一 為何使用函數
沒有函數會有什麽問題?
1.無組織無結構,代碼冗余
2.可讀性差
3.無法統一管理且維護成本高
總結使用函數的好處:
1.代碼重用
2.保持一致性,易維護
3.可擴展性
二 函數的分類
在python中函數分兩類:內置函數,自定義函數
1 #內置函數 2 # sum 3 # max 4 # min 5 # 6 # a=len(‘hello‘) 7 # print(a) 8 # 9 # b=max([1,2,3]) 10 # print(b)
1 #自定義函數 2 3 # # ****** 4 # # ****** 5 # # ****** 6# # hello world 7 # # ****** 8 # # ****** 9 # # ****** 10 # 11 def print_star(): 12 print(‘#‘*6) 13 14 def print_msg(): 15 print(‘hello world‘) 16 17 print_star() 18 print_star() 19 print_star() 20 print_msg() 21 print_star() 22 print_star() 23 print_star()
三 函數的返回值
3.1 返回值的定義
1 def foo():2 print(‘from foo‘) 3 return None 4 res=foo() 5 print(res)
PS‘‘‘
以三種情況返回值都為None:
沒有return
return 什麽都不寫
return None
‘‘‘
1 def foo(): 2 print(‘from foo‘) 3 x=1 4 return x 5 res=foo() 6 print(res)
3.2 return 一個值 函數調用返回的結果就是這個值
1 def foo(): 2 print(‘from foo‘) 3 x=1 4 return1,[2,3],(4,5),{} 5 res=foo() 6 print(res) #打印結果:(1,[2,3],(4,5),{}) 7 a,b,c,d=foo() 8 print(d)
3.3 return 值1,值2,值3,... 返回結果:(值1,值2,值3,...)
1 t=(1,2,3) 2 a,_,_=t 3 print(a) 4 5 t=(1,2,3,4,5,6,7,8,9) 6 a,*_,c=t 7 print(a) 8 print(c)
四 自定義函數詳解
4.1 為什麽要定義函數?:先定義後使用,如果沒有定義而直接使用,就相當於引用了一個不存在的變量名
1 foo() 2 def foo(): 3 print(‘from foo‘) 4 print(foo) 5 6 #錯誤的方式
4.2 函數的使用包含兩個階段:定義階段和使用階段
1 # 語法 2 # def 函數名(參數1,參數2,...): 3 # """文檔註釋""" 4 # 函數體 5 # return 值 6 7 # x=len(‘hello‘) 8 # print(x)
4.3 定義函數的三種形式
1、無參數函數:如果函數的功能僅僅只是執行一些操作而已,就定義成無參函數,無參函數通常都有返回值
1 def print_star(): 2 print(‘#‘*6)
2、定義有參函數:函數的功能的執行依賴於外部傳入的參數,有參函數通常都有返回值
1 def my_max(x,y): 2 res=x if x >y else y 3 return res
1 # 三元表達式 2 x=10 3 y=2 4 # if x > y: 5 # print(x) 6 # else: 7 # print(y) 8 # 9 # res=x if x > y else y 10 # print(res)
3、空函數
1 # def auth(): 2 # """認證功能""" 3 # pass 4 # auth() 5 def insert(): 6 """插入功能""" 7 pass 8 def select(): 9 """查詢功能""" 10 pass 11 def delete(): 12 """刪除功能""" 13 pass 14 def update(): 15 """更新功能""" 16 pass
五 調用函數
1 def foo(): 2 print(‘from foo‘) 3 4 def bar(name): 5 print(‘bar===>‘,name) 6 7 #按照有參和無參可以將函數調用分兩種 8 foo() #定義時無參,調用時也無需傳入參數 9 bar(‘egon‘) #定義時有參,調用時也必須有參數 10 11 12 #按照函數的調用形式和出現的位置,分三種 13 14 foo() #調用函數的語句形式 15 16 def my_max(x,y): 17 res=x if x >y else y 18 return res 19 20 # res=my_max(1,2)*10000000 #調用函數的表達式形式 21 # print(res) 22 23 24 res=my_max(my_max(10,20),30) #把函數調用當中另外一個函數的參數 25 print(res)
六 函數參數
6.1 從大的角度去看,函數的參數分兩種:形參(變量名),實參(值)
1 #定義階段 2 # def foo(x,y): #x=1,y=2 3 # print(x) 4 # print(y) 5 6 #調用階段 7 # foo(1,2)
6.2 詳細的區分函數的參數分為五種:
# 位置參數,關鍵字參數,默認參數,可變長參數(*args,**kwargs),命名關鍵字參數
1)位置參數
1 # def foo(x,y,z):#位置形參:必須被傳值的參數 2 # print(x,y,z) 3 # 4 # # foo(1,2,3) 5 # foo(1,2,3) #位置實參數:與形參一一對應
2)關鍵字參數:key=value
1 def foo(x,y,z): 2 print(x,y,z) 3 4 # foo(z=3,x=1,y=2) 5 6 #關鍵字參數需要註意的問題: 7 # 1:關鍵字實參必須在位置實參後面 8 # 2: 不能重復對一個形參數傳值 9 # foo(1,z=3,y=2) #正確 10 # foo(x=1,2,z=3) #錯誤 11 12 # foo(1,x=1,y=2,z=3)
3)默認參數
1 # def register(name,age,sex=‘male‘): #形參:默認參數 2 # print(name,age,sex) 3 # 4 # register(‘asb‘,age=40) 5 # register(‘a1sb‘,39) 6 # register(‘a2sb‘,30) 7 # register(‘a3sb‘,29) 8 # 9 # register(‘鋼蛋‘,20,‘female‘) 10 # register(‘鋼蛋‘,sex=‘female‘,age=19) 11 12 #默認參數需要註意的問題: 13 #一:默認參數必須跟在非默認參數後 14 # def register(sex=‘male‘,name,age): #在定義階段就會報錯 15 # print(name,age,sex) 16 17 #(了解)二:默認參數在定義階段就已經賦值了,而且只在定義階段賦值一次 18 # a=100000000 19 # def foo(x,y=a): 20 # print(x,y) 21 # a=0 22 # foo(1) 23 24 #三:默認參數的值通常定義成不可變類型
4)可變長參數
1 def foo(x,y,*args): #*會把溢出的按位置定義的實參都接收,以元組的形式賦值給args 2 print(x,y) 3 print(args) 4 # 5 # foo(1,2,3,4,5) 6 7 8 # def add(*args): 9 # res=0 10 # for i in args: 11 # res+=i 12 # return res 13 # print(add(1,2,3,4)) 14 # print(add(1,2)) 15 16 17 18 # def foo(x, y, **kwargs): # **會把溢出的按關鍵字定義的實參都接收,以字典的形式賦值給kwargs 19 # print(x, y) 20 # print(kwargs) 21 # foo(1,2,a=1,name=‘egon‘,age=18)
示例:
1 def foo(name,age,**kwargs): 2 print(name,age) 3 if ‘sex‘ in kwargs: 4 print(kwargs[‘sex‘]) 5 if ‘height‘ in kwargs: 6 print(kwargs[‘height‘]) 7 8 foo(‘egon‘,18,sex=‘male‘,height=‘185‘) 9 foo(‘egon‘,18,sex=‘male‘) 10 11 12 命名關鍵字參數(了解) 13 14 def foo(name,age,*,sex=‘male‘,height): 15 print(name,age) 16 print(sex) 17 print(height) 18 #*後定義的參數為命名關鍵字參數,這類參數,必須被傳值,而且必須以關鍵字實參的形式去傳值 19 foo(‘egon‘,17,height=‘185‘) 20 21 22 23 def foo(name,age=10,*args,sex=‘male‘,height,**kwargs): 24 def foo(name,age=10,*args,sex=‘male‘,height,**kwargs): 25 print(name) 26 print(age) 27 print(args) 28 print(sex) 29 print(height) 30 print(kwargs) 31 32 foo(‘alex‘,1,2,3,4,5,sex=‘female‘,height=‘150‘,a=1,b=2,c=3) 33 34 35 def foo(*args): 36 print(args) 37 38 foo(1,2,3,4) # 1,2,3,4 <=====>*(1,2,3,4) 39 40 *[‘A‘,‘B‘,‘C‘,‘D‘],=====>‘A‘,‘B‘,‘C‘,‘D‘ 41 foo(*[‘A‘,‘B‘,‘C‘,‘D‘]) #foo(‘A‘,‘B‘,‘C‘,‘D‘) 42 foo([‘A‘,‘B‘,‘C‘,‘D‘]) # 43 44 def foo(x,y,z): 45 print(x,y,z) 46 47 # foo(*[1,2,3]) #foo(1,2,3) 48 foo(*[1,2]) #foo(1,2) 49 50 51 def foo(**kwargs): 52 print(kwargs) 53 54 #x=1,y=2 <====>**{‘y‘: 2, ‘x‘: 1} 55 # foo(x=1,y=2) 56 57 foo(**{‘y‘: 2, ‘x‘: 1,‘a‘:1}) #foo(a=1,y=2,x=1) 58 59 def foo(x,y,z): 60 print(x,y,z) 61 62 # foo(**{‘z‘:3,‘x‘:1,‘y‘:2}) #foo(x=1,z=3,y=2) 63 foo(**{‘z‘:3,‘x‘:1}) #foo(x=1,z=3) 64 65 66 def foo(x,y,z): 67 print(‘from foo‘,x,y,z) 68 69 def wrapper(*args,**kwargs): 70 print(args) 71 print(kwargs) 72 73 74 wrapper(1,2,3,a=1,b=2) 75 76 77 78 def foo(x,y,z): 79 print(‘from foo‘,x,y,z) 80 def wrapper(*args,**kwargs): 81 print(args) #args=(1,2,3) 82 print(kwargs) #kwargs={‘a‘:1,‘b‘:2} 83 foo(*args,**kwargs) #foo(*(1,2,3),**{‘a‘:1,‘b‘:2}) #foo(1,2,3,b=2,a=1) 84 # wrapper(1,2,3,a=1,b=2) 85 wrapper(1,z=2,y=3) 86 87 88 89 def foo(x,y,z): 90 print(‘from foo‘,x,y,z) 91 def wrapper(*args,**kwargs): 92 # print(args) #args=(1,) 93 # print(kwargs) #kwargs={‘y‘:3,‘z‘:2} 94 foo(*args,**kwargs) #foo(*(1,),**{‘y‘:3,‘z‘:2}) #foo(1,z=2,y=3) 95 # wrapper(1,2,3,a=1,b=2) 96 wrapper(1,z=2,y=3)
PS:註意
1 #補充:函數定義階段到底幹了什麽事情:只檢測函數體的語法,並不會執行 2 # def bar(): 3 # x 4 # if 1 >2: 5 # print(‘====>‘) 6 # 7 # bar()
10、函數