一.函數概念python
函數一詞來源於數學,但編程中的「函數」概念,與數學中的函數是有很大不一樣的,編程中的函數在英文中也有不少不一樣的叫法。在BASIC中叫作subroutine(子過程或子程序),在Pascal中叫作procedure(過程)和function,在C中只有function,在Java裏面叫作method。mysql
定義: 函數是指將一組語句的集合經過一個名字(函數名)封裝起來,要想執行這個函數,只需調用其函數名便可。sql
二.使用函數的好處數據庫
1.簡化代碼編程
2.提升代碼的複用性數據結構
3.代碼可擴展app
三.python中函數的定義函數
定義函數使用def關鍵字,後面是函數名,函數名不能重複spa
def sayhi(): # 函數名 遞歸
print("Hello, World") #函數體
sayhi() # 調用函數
四.函數的參數
1.函數在調用的時候,能夠傳入參數,有形參和實參
形參:形參變量只有在被調用時才分配內存單元,在調用結束時,即刻釋放所分配的內存單元。所以,形參只在函數內部有效。
實參:實參能夠是常量、變量、表達式、函數等,不管實參是何種類型的量,在進行函數調用時,它們都必須有肯定的值,以便把這些值傳送給形參。函數調用結束返回主調用函數後則不能再使用該形參變量。
def calc(x,y): #定義一個函數,參數有x和y,x和y就是形參
print(x*y) #輸出x乘以y的值
calc(5,2) #調用上面定義的函數,5和2就是實參
簡單點說,形參就是函數接收的參數,而實參就是你實際傳入的參數
2.函數的四種形參類型
位置參數:按照參數的位置來進行傳參,好比說上面的calc函數,x和y就是位置參數,位置參數是必傳的,
有幾個位置參數在調用的時候就要傳幾個,不然就會報錯了,那若是有多個位置參數的話,記不住哪一個位置傳哪一個了怎麼辦,可使用位置參數的名字來指定調用
好比說上面的那個calc函數也可使用calc(y=1,x=2)這樣來調用,這種調用方式叫作關鍵字傳參
默認參數:默認參數就是在定義形參的時候,給函數默認賦一個值,好比說數據庫的端口這樣的,默認給它一個值,這樣就算你在調用的時候沒傳入這個參數,它也是有值的
so,默認參數不是必填的,若是給默認參數傳值的話,它就會使用你傳入的值。若是使用默認值參數的話,必須放在位置參數後面定義。
def conn_mysql(user,passwd,port=3306): #定義一個鏈接mysql的方法,雖然這個方法並無鏈接mysql,port就是一個默認值參數
print(user,passwd,port)
conn_mysql('root','123456') #沒指定默認值
conn_mysql('root','123456',port=3307) #指定默認值參數的值
非固定參數:上面的兩種位置參數和默認參數都是參數個數是固定的,若是說我一個函數,參數不是固定的,我也不知道之後這個函數會擴展成啥樣,可能參數愈來愈多,這個時候若是再用固定的參數,那後面程序就很差擴展了,這時候就能夠用非固定參數了,非固定參數有兩種,一種是可變參數,一種是關鍵字參數。
可變參數:可變參數用*來接收,後面想傳多少個參數就傳多少個,若是位置參數、默認值參數、可變參數一塊兒使用的的話,可變參數必須在位置參數和默認值參數後面。可變參數也是非必傳的。
def more_arg(name,age,sex='nan',*agrs): #位置參數,默認值參數,可變參數,可變參數會把後面多傳的參數都放到args這個元組中
#固然args名字是隨便寫的,不過通常咱們都寫args
print(name,age,agrs)
more_arg('marry'18,'nv','python','china') #調用
關鍵字參數:關鍵字參數使用**來接收,後面的參數也是不固定的,想寫多少個寫多少個,固然也能夠和上面的幾種一塊兒來使用,若是要一塊兒使用的話,關鍵字參數必須在最後面。
使用關鍵字參數的話,調用的時候必須使用關鍵字傳參。關鍵字參數也是非必傳的。
def kw_arg(name,**kwargs): #位置參數,關鍵字參數,調用的時候會把傳入的關鍵字參數放到kwargs這個字典中
print(name,kwargs)
kw_arg('sriba',sex='男',age=18) #調用,sex和age就是關鍵字調用
五.函數的返回值
每一個函數都有返回值,若是沒有在函數裏面指定返回值的話,在python裏面函數執行完以後,默認會返回一個None,函數也能夠有多個返回值,若是有多個返回值的話,會把返回值都放到一個元組中,返回的是一個元組。
爲何要有返回值呢,是由於在這個函數操做完以後,它的結果在後面的程序裏面須要用到。
函數中的返回值使用return,函數在遇到return就當即結束。
def calc(x,y): #這個就是定義一個有返回值的函數
c = x*y
return c,x,y
res = calc(5,6) #把函數的返回結果賦值給res
print(res)
六.局部變量和全局變量
局部變量意思就是在局部生效的,出了這個變量的做用域,這個變量就失效了,好比上面的c就是一個局部變量,出了這個函數以後,就沒有c這個值了。
全局變量的意思就是在整個程序裏面都生效的,在程序最前面定義的都是全局變量,全局變量若是要在函數中修改的話,須要加global關鍵字聲明,若是是list、字典和集合的話,則不須要加global關鍵字,直接就能夠修改。
name = 'marry' #字符串全局變量
names = [] #list全局變量
print(name)
print(names)
def test():
global name #修改name的值就須要用global關鍵字
name = 'lily'
names.append(name) #修改全局變量names的值
return names
test() #調用函數
print('修改後',name)
print('修改後names',names)
七.遞歸調用
在函數內部,能夠調用其它函數,若是一個函數在內部調用自身自己,這個函數就是遞歸函數。
遞歸調用的意思是,在這個函數內部本身調用本身,就喲點循環的意思,寫個遞歸,以下:
def test1():
num = int(input('please enter a number:'))
if num%2 == 0: #判斷輸入的數字是否是偶數
return Ture #若是是偶數的話,程序就退出了,返回true
print('不是偶數從新輸入')
return test1() #若是不是偶數的話繼續調用本身,輸入值
print(test1()) #調用test
遞歸調用的特性:
1. 必須有一個明確的結束條件
2. 每次進入更深一層遞歸時,問題規模相比上次遞歸都應有所減小
3. 遞歸效率不高,遞歸層次過多會致使棧溢出(在計算機中,函數調用是經過棧(stack)這種數據結構實現的,每當進入一個函數調用,棧就會加一層棧幀,每當函數返回,棧就會減一層棧幀。因爲棧的大小不是無限的,因此,遞歸調用的次數過多,會致使棧溢出)
八.高階函數
什麼是高階函數,若是一個函數的參數是一個函數的話,那麼這個函數就是一個高階函數。
def s_int(n): #這個函數的做用是把傳入的參數類型轉換成int類型
return int(n)
def add(x,y,z): #這個函數的意思,接收3個參數,x,y,z, z是一個函數
print(z(x)+z(y)) #這個執行過程是這樣的,z是一個函數,把x和y的值傳給z,而後用z函數的返回值把兩個值相加
add('8','9',s_int) #調用,傳入x和y的值,再把上面的那個定義好的函數傳進去