1.def 函數
如果我們用代碼實現了一個小功能,但想要在程序代碼中重復使用,不能在代碼中到處粘貼這些代碼,因為這樣做違反了軟件工程中 DRY原則。 Python 提供了 函數功能,可以將我們這部分功能抽象成一個函數以方便程序調用,或者提供給其他模塊使用。
def function_name(parameters):
expressions
在Python中使用 def 開始函數定義,緊接着function_name是函數名,括號內部parameters為函數的參數,expressions內部為函數的具體功能實現代碼,如果想要函數有返回值, 在 expressions 中的邏輯代碼中用 return 返回。
實例
def function():
print('This is a function')
a = 1+2
print(a)
上面我們定義了一個名字為 function 的函數,函數沒有參數,所以括號內部為空,緊接着是函數的功能代碼。如果執行該腳本,發現並沒有輸出任何輸出,因為我們只定義了函數,而並沒有執行函數。 這時我們在 Python 命令提示符中輸入函數調用 function(), 注意這里調用函數的括號不能省略。那么 函數內部的功能代碼將會執行,輸出結果:
This is a function
如果我們想要在腳本中調用的腳本,只需要在腳本中最后添加函數調用語句
function()
那么在執行腳本的時候,將會執行函數。
2.函數參數
我們在調用函數的時候,想要指定一些變量的值在函數中使用,那么這些變量就是函數的參數,函數調用的時候, 傳入即可。
def function_name(parameters):
expressions
parameters 的位置就是函數的參數,在調用的時候傳入即可。
實例
def func(a, b):
c = a+b
print('the c is ', c)
在這里定義一個函數func,其參數就是兩個數值a, b,函數的功能就是把兩個參數加起來 c = a+b。運行腳本后,在 Python 提示符內調用函數 func, 如果不指定參數 func(), 那么將會出錯; 輸出 func(1, 2),將 a=1, b=2 傳入函數,輸出 the c is 3 。所以在調用函數時候,參數個數和位置一定要按照函數定義。如果我們忘記了函數的參數的位置,只知道各個參數的名字,可以在 函數調用的過程中給指明特定的參數 func(a=1, b=2), 這樣的話,參數的位置將不受影響,所以 func(b=2,a=1)是同樣的 的效果。
3.函數默認參數
我們在定義函數時有時候有些參數在大部分情況下是相同的,只不過為了提高函數的適用性,提供了一些備選的參數, 為了方便函數調用,我們可以將這些參數設置為默認參數,那么該參數在函數調用過程中可以不需要明確給出。
def function_name(para_1,...,para_n=defau_n,..., para_m=defau_m):
expressions
函數聲明只需要在需要默認參數的地方用 = 號給定即可, 但是要注意所有的默認參數都不能出現在非默認參數的前面。
實例
def sale_car(price, color='red', brand='carmy', is_second_hand=True):
print('price', price,
'color', color,
'brand', brand,
'is_second_hand', is_second_hand,)
在這里定義了一個 sale_car 函數,參數為車的屬性,但除了 price 之外,像 color, brand 和 is_second_hand 都是有默認值的,如果我們調用函數 sale_car(1000), 那么與 sale_car(1000, 'red', 'carmy', True) 是一樣的效果。當然也可以在函數調用過程中傳入特定的參數用來修改默認參數。通過默認參數可以減輕我們函數調用的復雜度。
4.進階
4.1 自調用
如果想要在執行腳本的時候執行一些代碼,比如單元測試,可以在腳本最后加上單元測試代碼,但是該腳本作為一個模塊對外提供功能的時候單元測試代碼也會執行,這些往往我們不想要的,我們可以把這些代碼放入腳本最后:
if __name__ == '__main__':
#code_here
如果執行該腳本的時候,該 if 判斷語句將會是 True,那么內部的代碼將會執行。 如果外部調用該腳本,if 判斷語句則為 False,內部代碼將不會執行。
4.2 可變參數
顧名思義,函數的可變參數是傳入的參數可以變化的,1個,2個到任意個。當然可以將這些 參數封裝成一個 list 或者 tuple 傳入,但不夠 pythonic。使用可變參數可以很好解決該問題,注意可變參數在函數定義不能出現在特定參數和默認參數前面,因為可變參數會吞噬掉這些參數。
def report(name, *grades):
total_grade = 0
for grade in grades:
total_grade += grade
print(name, 'total grade is ', total_grade)
定義了一個函數report,傳入一個參數為 name, 后面的參數 *grades使用了 * 修飾,表明該參數是一個可變參數,這是一個可迭代的對象。該函數輸入姓名和各科的成績,輸出姓名和總共成績。所以可以這樣調用函數 report('Mike', 8, 9),輸出的結果為 Mike total grade is 17, 也可以這樣調用 report('Mike', 8, 9, 10),輸出的結果為 Mike total grade is 27
4.3 關鍵字參數
關鍵字參數可以傳入0個或者任意個含參數名的參數,這些參數名在函數定義中並沒有出現,這些參數在函數內部自動封裝成一個字典(dict).
def portrait(name, **kw):
print('name is', name)
for k,v in kw.items():
print(k, v)
定義了一個函數portrait,傳入一個參數 name, 和關鍵字參數 **kw,使用了 ** 修飾。表明該參數是關鍵字參數,通常來講關鍵字參數是放在函數參數列表的最后。如果調用參數 portrait('Mike', age=24, country='China', education='bachelor') 輸出:
name is Mike
age 24
country China
education bachelor
通過可變參數和關鍵字參數,任何函數都可以用 universal_func(*args, **kw) 表達。
---------------------
作者:iOSxi
來源:CSDN
原文:https://blog.csdn.net/iosxi/article/details/78663061
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!