Python 定義函數使用 def 關鍵字,通常格式以下:python
def function_name(parameter_list): pass
默認狀況下,參數值和參數名稱按函數聲明中定義的順序進行匹配。
函數代碼塊以 def 關鍵詞開頭,後接函數標識符名稱和圓括號 ()。
任何傳入參數和自變量必須放在圓括號中間,圓括號之間能夠用於定義參數。
函數的第一行語句能夠選擇性地使用文檔字符串描述函數說明。
函數內容以冒號起始,而且進行縮進。
函數的定義示例以下:express
def add(x, y): result = x + y return result
函數使用return [表達式] 結束函數,返回一個或多個值給調用方。不帶表達式的return至關於返回 None。app
def get_fruits(): apple = "Apple" banana = "Banana" orange = "Orange" return apple, banana, orange a,b,c = get_fruits() print(a, b, c)
函數定義只給了函數一個名稱,指定了函數裏包含的參數和代碼塊結構。
函數調用直接使用定義的函數名稱以及傳遞相應的參數進行調用。ide
Python默認設置了函數的最大遞歸調用次數,開發者能夠直接進行設置。設置方法以下:函數
#!/usr/bin/python3 import sys sys.setrecursionlimit(100) # 設置最大遞歸次數爲100
必須參數是函數調用時必須傳遞的參數。ui
#!/usr/bin/python3 def add(x, y): result = x + y return result add(3, 2)
關鍵字參數用於函數調用時,使用形式參數關鍵字將實際參數賦值給函數的相應形式參數,函數調用過程當中傳遞實際參數順序能夠與形式參數順序不匹配,但全部的必須參數必須被賦值。code
#!/usr/bin/python3 def add(x, y): result = x + y return result add(y=2, x=3)
上述代碼中,add函數的調用傳遞的實際參數經過指定關鍵字參數實際指定相應的形式參數,沒必要按照形式參數順序匹配,但必須參數都必須被傳遞。遞歸
函數在定義過程當中能夠爲指定參數默認的值,而且必須參數必須放在默認參數的左側。內存
#!/usr/bin/python3 def print_student(name, gender="男", age=28): print(name) print(gender) print(age) print_student("Bauer", "男", 30) print_student("Lee") print_student("Lisa","女") print_student(age=30, name="Bob")
函數調用時,可使用關鍵字參數對形式參數進行賦值,默認參數能夠缺省,但必須參數必須被賦值,必須參數可使用關鍵字參數賦值。若是必須參數不使用關鍵字參數,則必須參數必須嚴格按照函數定義的順序傳遞,其默認參數可使用關鍵字參數選擇性賦值,沒有使用關鍵字參數傳遞的默認參數將使用默認值。utf-8
可變參數經過使用*
修飾形式參數定義可變參數。
函數定義時,能夠定義可變參數,在函數調用時傳遞可變的多個實際參數。
#!/usr/bin/python3 def add(*args): result = 0; for x in args: result += x return result c = add(1, 2, 3, 4) print(c) c = add(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) print(c) tup1 = 1, 2, 3, 4 c = add(*tup1) # 傳入序列 print(c) list1 = [1, 2, 3] c = add(*list1) print(c)
對應定義了可變參數的的函數,若是須要傳入序列做爲實際參數,須要在序列前加*
。
若是函數定義時有可變參數和默認參數,函數調用時可使用關鍵字參數用於指定默認參數。
#!/usr/bin/python3 def add(x, *args, y=100): result = x + y; for i in args: result += i return result c = add(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) # 155 print(c) c = add(1, 2, 3, 4, 5, 6, 7, 8, 9, y=10) # 55 print(c)
Python中,若是函數定義時可變參數放在默認參數的左側,則默認參數須要使用關鍵字參數顯式指定。
關鍵字可變參數經過使用**
修飾形式參數定義,關鍵字可變參數爲字典類型,關鍵字可變參數屬於可選參數。
#!/usr/bin/python3 def average_score(**args): result = 0; for key, value in args.items(): result += value print(key + ": ", value) result = result / len(args) print("Average score is ", result) return result book = {"Bauer": 90, "Bob": 100, "Lisa": 70, "Lee": 100} average_score(**book) average_score(Bauer=100, Lisa=70, Lee=100)
函數調用時,關鍵字可變參數能夠傳遞多個鍵值對,頁能夠直接傳遞dictionary類型變量,此時須要使用**
修飾字典變量。
python 使用 lambda表達式來建立匿名函數,函數定義以下:lambda [arg1 [,arg2,.....argn]]:expression
Lambda表達式定義的匿名函數的函數體不是一個代碼塊,所以,僅能在lambda表達式中封裝有限的邏輯。
Lambda表達式擁有本身的命名空間,且不能訪問自有參數列表外或全局命名空間裏的參數。
雖然lambda函數看起來只能寫一行,卻不等同於C或C++的內聯函數,後者的目的是調用小函數時不佔用棧內存從而增長運行效率。
#!/usr/bin/python3 # -*- coding:utf-8 -*- sum = lambda arg1, arg2: arg1 + arg2; # 調用sum函數 print(sum(10, 20)) print(sum(20, 20))
程序的全部的變量並非在任何位置均可以訪問的,訪問權限決定於變量是在哪裏賦值的。變量的做用域決定了在哪一部分程序能夠訪問哪一個特定的變量名稱。
定義在函數內部的變量擁有局部做用域,定義在函數外的擁有全局做用域,代碼塊內部局部變量會覆蓋全局變量,在局部做用域內修改全局變量的值時,須要使用global關鍵字對相應全局變量進行聲明,代表本做用域內使用的是全局變量。
局部變量只能在其被聲明的函數內部訪問,而全局變量能夠在整個程序範圍內訪問。調用函數時,全部在函數內聲明的變量名稱都將被加入到做用域中。
#!/usr/bin/python3 # -*- coding:utf-8 -*- base = 100 def sum(*args): global base base = 0 result = 0; for i in args: result += i return result + base; c = sum(1,2,3,4,5,6,7,8,9,10) print(c) # 55 print(base) # 0