天天看點

Python函數程式設計

函數的定義

#函數結構

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函數程式設計

要求:

●遞歸一定要有退出條件,遞歸調用一定要執行到這個退出條件。沒有退出條件的遞歸調用,就是無限調用

●遞歸調用的深度不宜過深

●Python對遞歸調用的深度做了限制,以保護解釋器

○超過遞歸深度限制,抛出RecursionError: maxinum recursion depth exceeded 超出最大深度

○sys.getrecursionlimit()

總結:

●遞歸相對運作效率低,每一次調用函數都要開辟棧幀

●遞歸有深度限制,如果遞歸層次太深,函數連續壓棧,棧記憶體很快就溢出了

●如果是有限次數的遞歸,可以使用遞歸調用,或者使用循環代替,循環代碼稍微複雜一些,但是隻要不是死循環,可以多次疊代直至算出結果

●絕大多數遞歸,都可以使用循環實作

●即使遞歸代碼很簡潔,但是能不用則不用遞歸

内置函數

Python中内置了很多函數,開發者可以直接調用。

Python函數程式設計

函數也是一個對象。