若是在開發程序時,須要某塊代碼屢次,可是爲了提升編寫的效率以及代碼的重用,因此把具備獨立功能的代碼塊組織爲一個小模塊,這就是函數python
函數的語法格式:express
def 函數名(): 函數的功能代碼
注意:python不像其餘編程語言使用{}控制做用域,python嚴格使用縮進控制做用域,因此在python中使用,函數要嚴格的控制縮進。編程
定義了函數以後,就至關於有了一個具備某些功能的代碼,想要讓這些代碼可以執行,須要調用它,調用函數很簡單的,編程語言
經過 函數名() 便可完成調用函數
def printMenu(): print("-----------------------------------") print(" 一、查詢 ") print(" 二、修改 ") print(" 三、增長 ") print("-----------------------------------") #函數的調用
printMenu() #函數能夠重複調用
printMenu()
運行結果爲:spa
-----------------------------------
1、查詢 2、修改 3、增長 -----------------------------------
-----------------------------------
1、查詢 2、修改 3、增長 -----------------------------------
說明:設計
參數分爲實參和形參兩種形式code
帶參數函數的定義格式:blog
def 函數名(形參1,形參2,形參3....): 要執行的代碼
舉個例子:排序
#定義一個具備兩個形式參數的函數
def sum(a,b):#a,b就是形參
result = a+b print(result) #sum()函數的調用
sum(4,5)#4,5就是真實參數
運行結果爲:9
帶參數函數的精髓就是,能夠靈活的處理數據的運算。
所謂「返回值」,就是程序中函數完成一件事情後,最後給調用者的結果,就像一個例子中,計算a+b的值是直接打印出來了,可是如今我不想在函數裏面打印出來了,我須要在函數外面使用這個結果繼續參與其餘運算該怎麼辦呢?這就須要定義帶返回值的函數了。
帶返回值的函數聲明定義格式:
def function(形參...): 函數執行的代碼 return 返回值
舉個例子:
def sum(a,b): result = a+b return result#result就是程序要返回出去的值
res = sum(4,5) print(res)
運行結果爲:9
按照格式來劃分有四種類型,具體能夠根據使用場景合理的設計函數的類型。
一個函數裏面卻可使用其餘函數,這叫作函數的嵌套調用。
def printMenu(): print("-----------------------------------") print(" 一、查詢 ") print(" 二、修改 ") print(" 三、增長 ") print("-----------------------------------") def main(): #在main()中調用printMenu()函數
printMenu() print("請輸入你的選擇:") main()
運行結果爲:
-----------------------------------
1、查詢 2、修改 3、增長 ----------------------------------- 請輸入你的選擇:
說明:上面程序中a是全局變量,b是局部變量,因此代碼在第8行出錯,錯誤提示 NameError: name ‘b’ is not defined b變量沒有定義
局部變量和全局變量重名,函數內使用的是局部變量的值,不影響外面的全局變量的值。
a = 1#全局變量
print("---1---: %d"%(a)) def test1(): b = 2#局部變量,只能在test1中使用
print("---2---: %d"%(b)) def test2(): a = 3#局部變量,只能在test2中使用
b = 4#局部變量,只能在test2中使用
print("---3---: %d"%(a)) print("---4---: %d"%(b)) test1() test2() print("---5---: %d"%(a))
運行結果爲:
---1---: 1
---2---: 2
---3---: 3
---4---: 4
---5---: 1
上面的例子能夠看出,局部變量和全局變量重名,並不會修改全局變量的值,可是當咱們在一個函數中,就須要修改全局變量的值怎麼辦呢?只須要在函數內使用global修飾全局變量便可。
a = 1#全局變量
print("---1---: %d"%(a)) def test1(): b = 2
print("---2---: %d"%(b)) def test2(): global a #在函數內部直接使用全局變量
a = 3 #修改全局變量的值
b = 4
print("---3---: %d"%(a)) print("---4---: %d"%(b)) test1() test2() print("---5---: %d"%(a))
運行結果爲:
---1---: 1
---2---: 2
---3---: 3
---4---: 4
---5---: 3
第3次和第5次同樣說明全局變量在函數內部修改爲功。
def printInfo(name,age = 18): print("name = %s,age = %d"%(name,age)) printInfo("Se7eN_HOU") printInfo("Se7eN_HOU",28)
運行結果爲:
name = Se7eN_HOU,age = 18 name = Se7eN_HOU,age = 28
第一次age未傳值的時候,打印出來的是默認值18,第二次打印的是傳進來的值28.
使用場景:例如定義一個求兩個數之和的函數,而後在編寫一個求三個數之和的函數,也就是說,這樣的話每多一個數就要編寫一個函數,很麻煩,這裏就須要設計成爲一個具備不定長參數的函數。
一、帶一個 「*」 的參數
用一個星號 「 * 」修飾的參數是元組類型,在使用的時候能夠將傳遞多來的實際有多少個參數都放在元組裏面。
def sum(*agrs): result = 0 for x in agrs: result += x print(result) sum(1) sum(1,2) sum(1,2,3)
運行結果爲:一、三、6
二、帶兩個「**」的不定長參數
用兩個星號「**」修飾的參數是字典類型,在使用的時候能夠以字典的形式傳遞多個值給到函數參與運算
運行結果爲:
用lambda關鍵詞能建立小型匿名函數。這種函數得名於省略了用def聲明函數的標準步驟。lambda函數的語法只包含一個語句,以下:
lambda [arg1 [,arg2,...,agrn]]:expression
實例以下:
sum = lambda arg1,agr2:arg1+agr2 #調用sum函數
print("sum :%d"%sum(10,20))
運行結果爲:30
使用場景
一、函數做爲參數傳遞
def fun(a,b,opt): print("a=%s"%(a)) print("b=%s"%(b)) print("result = %s"%opt(a,b)) fun(1,2,lambda x,y:x+y)
運行結果爲:
a=1 b=2 result = 3
二、做爲內置函數的參數
stus = [{"name":"zhangsan","age":18},{"name":"lis","age":19},{"name":"wangwu","age":17}]
按name排序
stus.sort(key = lambda x:x["name"]) print(stus)
運行結果爲:[{'name': 'lis', 'age': 19}, {'name': 'wangwu', 'age': 17}, {'name': 'zhangsan', 'age': 18}]
按age排序
stus.sort(key =lambda x:x["age"]) print(stus)
運行結果爲:[{'name': 'wangwu', 'age': 17}, {'name': 'zhangsan', 'age': 18}, {'name': 'lis', 'age': 19}]