函數的定義
#函數結構
def function(param):
'''
文檔字元串
'''
#語句塊
return
●def開頭,跟着函數辨別符,後接圓括号。
●括号内是參數
●函數内的第一行可以選擇性的使用文檔字元串,存放函數說明。
●函數的内容以冒号開始,并且縮進
●return [表達式] 結束函數,選擇性的傳回一個值給調用方。不帶return相當于傳回None
函數的作用:使得代碼更加有組織性,結構性更好,并且提高代碼複用率。
函數傳參
參數作用:調用者和被調用函數之間傳遞資料
參數個數:支援0到多個
形參和實參:形參是函數定義是圓括号中的參數。實參是函數被調用時圓括号中的參數,是實際參數。
位置實參:函數在調用的時候每個參數都要能夠對應到函數定義中的一個形參。是以最簡單的方式是按照順序進行關聯,這種關聯方式被成為位置實參。
傳遞任意數量的參數:
關鍵字實參:
●是指使用形式參數的名字來确定輸入的參數值,調用函數時傳遞給函數的是名稱和值對。這種方式傳遞參數時不需要于形參的順序一一對應。
●對于關鍵字參數,函數的調用者可以傳入任意不受限制的關鍵字參數。至于到底傳入了哪些,就需要在函數内部通過kw檢查
注意:關鍵字參數必須在位置參數之後。
預設參數:
#位置參數
def add(a,b):
return a+b
c = add(1,2)
print(c)
任意數量位置參數
def add(*args):
num = 0
for i in args:
num += i
return num
print(add(1,2,3,4,5))
關鍵字參數
def add_person(name, age, **kwargs):
city = 'city' in kwargs and kwargs['city'] or ""
job = 'job' in kwargs and kwargs['job'] or ""
print({"name":name,"age":age,"city":city,"job":job})
#調用方式
add_person("bruce",25,city="hangzhou",job="Engineer")
add_person("bruce",25,city="hangzhou")
add_person("bruce",25)
'''不做校驗,有幾個就都往字典中添加'''
def add_person(name, age, **kwargs):
d = dict()
d.update({"name":name,"age":age})
for key in kwargs.keys():
d.update({key:kwargs[key]})
print(d)
#調用方式
add_person("bruce",25,city="hangzhou",job="Engineer")
add_person("bruce",25,city="hangzhou")
add_person("bruce",25)
'''預設參數必須在位置參數後面'''
def login(phone, name="bruce", pwd="12345"):
if phone=='17212345678' and name == "bruce" and pwd == "12345":
print("login success.")
else:
print('login faild.')
#調用方式
login('17212345678')
login('17212345678',"bruce","12345")
login('17212345678',name="bruce", pwd="12345")
●給形參設定預設值,防止調用時沒有傳遞實參時,函數将使用預設值,一種便利性的設計。
●預設參數放在必選參數後面。
函數傳回值
●函數的傳回值時一個表達式;
●支援傳回多個值,傳回的多個值被打包成一個元組。
def function():
a = 1
b = 2
c = 3
d = 4
return a,b,c,d
res = function()
print(type(res))
print(res)
a,b,c,d = function()
print(a,b,c,d)
結果:
<class 'tuple'>
(1, 2, 3, 4)
1 2 3 4
函數處理變量
函數是可以處理局部變量和全局變量的。
局部變量
局部變量是在函數内部定義并使用的變量;
局部變量随着函數的入棧産生,出棧銷毀,不能被外部變量通路;
函數的參數也屬于局部變量;
def function(a,b):
a = a
b = b
c = 3
d = 4
return a,b,c,d
全局變量
全局變量是定義在函數外部的變量,能夠被整個源程式通路。
n = 9
def function(a,b):
a = a
b = b
global n
n = 8
print(n)
res = function(1,2)
print("全局變量n:{}".format(n))
遞歸函數
定義:在函數内部調用自己,那麼這個函數就叫做遞歸函數。
從函數棧的角度了解:
要求:
●遞歸一定要有退出條件,遞歸調用一定要執行到這個退出條件。沒有退出條件的遞歸調用,就是無限調用
●遞歸調用的深度不宜過深
●Python對遞歸調用的深度做了限制,以保護解釋器
○超過遞歸深度限制,抛出RecursionError: maxinum recursion depth exceeded 超出最大深度
○sys.getrecursionlimit()
總結:
●遞歸相對運作效率低,每一次調用函數都要開辟棧幀
●遞歸有深度限制,如果遞歸層次太深,函數連續壓棧,棧記憶體很快就溢出了
●如果是有限次數的遞歸,可以使用遞歸調用,或者使用循環代替,循環代碼稍微複雜一些,但是隻要不是死循環,可以多次疊代直至算出結果
●絕大多數遞歸,都可以使用循環實作
●即使遞歸代碼很簡潔,但是能不用則不用遞歸
内置函數
Python中内置了很多函數,開發者可以直接調用。

函數也是一個對象。