標籤:資料結構 put 指定 ase 使用 相加 user number 功能
一、定義函數
定義一個函數實現某個功能,以後要使用的時候來調用既可以,提高代碼的複用性; 定義函數使用def關鍵字,後面是函數名,函數名不能重複:
def fun(): #定義一個函數,後面是函數名
print("Hello World")#函數體
二、入參
函數在調用的時候,可以傳入參數,有形參和實參
1、形參:
形參變數只有在被調用時才分配記憶體單元,在調用結束時,即刻釋放所分配的記憶體單元。因此,形參只在函數內部有效。
2、實參:
實參可以是常量、變數、運算式、函數等,無論實參是何種類型的量,在進行函數調用時,它們都必須有確定的值,以便把這些值傳送給形參。函數調用結束返回主調用函數 後則不能再使用該形參變數。
def calc(x,y): #定義一個函數,參數有x和y,x和y就是形參
print(x*y) #輸出x乘以y的值
calc(5,2) #調用上面定義的函數,5和2就是實參;必填參數
** 形參就是函數接收的參數,而實參就是你實際傳入的參數。
補充:函數即變數
def showName():
print(‘value‘)
myfun=showName
myfun()
3、函數的四種形參類型:
1) 位置參數:
位置參數,就是按照參數的位置來進行傳參,比如說上面的calc函數,x和y就是位置參數,位置參數是必傳的,
有幾個位置參數在調用的時候就要傳幾個,否則就會報錯,那如果有多個位置參數的話,記不住哪個位置傳哪個了怎麼辦,可以使用位置參數的名字來指定調用
比如說上面的那個calc函數也可以使用calc(y=1,x=2)這樣來調用,這種調用方式叫做關鍵字傳參
2) 預設參數:
預設參數就是在定義形參的時候,給函數預設賦一個值,比如說資料庫的連接埠這樣的,預設給它一個值,這樣就算你在調用的時候沒傳入這個參數,它也是有值的
預設參數不是必填的,如果給預設參數傳值的話,它就會使用你傳入的值。如果使用預設值參數的話,必須放在位置參數(必填參數)後面定義。
def conn_mysql(user,passwd,port=3306):#port就是一個預設值參數
print(user,passwd,port)
coon_mysql(‘root‘,‘123456‘)#沒指定預設值
coon_mysql(‘root‘,‘123456‘,port=3307)#指定預設值參數的值
3)非固定參數:
上面的兩種位置參數和預設參數都是參數個數是固定的,如果一個函數,參數不是固定的,不知道以後這個函數會擴充成啥樣,可能參數越來越多,這個時候如果再用固定的參數,那後面程式就不好擴充了,這時候就需要用非固定參數了,非固定參數有兩種,一種是可變參數,一種是關鍵字參數。
可變參數:
可變參數用*來接收,後面想傳多少個參數就傳多少個,如果位置參數、預設值參數、可變參數一起使用的的話,位置參數必須放在前面,一般寫法:必填參數,預設參數、可變參數。可變參數也是非必傳的,不傳的話返回 空
def myfun(*args):#定義可變參數
print(args)
def myfun(host,port=3306,*arg):#一般順序是位置參數、預設參數、可變參數
print(host)
print(port)
print(arg)#可以無限傳參,接收到的是一個元祖,取值根據索引來取
myfun(‘host‘,‘lsl‘)
關鍵字參數:
關鍵字參數使用**來接收,後面的參數也是不固定的,想寫多少個寫多少個,當然也可以和上面的幾種一起來使用,如果要一起使用的話,關鍵字參數必須在最後面。
使用關鍵字參數的話,調用的時候必須使用關鍵字傳參。關鍵字參數也是非必傳的。
def myfun(name,**args):#位置參數、關鍵字參數,調用的時候會把傳入的關鍵字參數放到kwargs這個字典中 print(name,kwargs) myfun(‘sriba‘,sex=‘男‘,age=18)#調用,sex和age就是關鍵字調用
products={
‘手機‘:3000,
‘pad‘:6000,
‘電腦‘:10000
}
def myfun2(**args):
print(args)
myfun2(**products)
註:混合用的話,順序是:位置參數,預設參數,*arg,**args
三、函數的傳回值
每個函數都有傳回值,如果沒有在函數裡面指定傳回值的話,在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 = ‘my‘#字串全域變數 print(name) def myname(): global name #global修改全域變數name的值 name = ‘hh‘ myname()#調用函數 print(‘修改後‘,name)
五、遞迴調用
在函數內部,可以調用其他函數。如果一個函數在內部調用自身本身,這個函數就是遞迴函式。
遞迴調用的意思就是,在這個函數內部自己調用自己,就有點迴圈的意思,寫個遞迴,如下:
def test1(): num = int(input(‘please enter a number:‘)) if num%2==0:#判斷輸入的數字是不是偶數 return True #如果是偶數的話,程式就退出了,返回true else:
test1()#如果不是偶數的話繼續調用自己,輸入值print(test1())#調用test1
遞迴調用的特性:
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的值,再把上面的那個定義好的函數傳進去
python基礎3-函數