Python開發(fā)中的函數(shù)提供了有組織的,可重用的代碼來執(zhí)行一組操作。函數(shù)簡化了編碼過程,防止冗余邏輯,并使代碼更容易遵循。
定義和調(diào)用簡單函數(shù)
使用 def 語句來定義Python中的函數(shù)最常見的方式。 這種說法是所謂的單條復合語句 的語法如下:
def function_name(parameters):
statement(s)
function_name 被稱為 標識符 的功能。 由于函數(shù)定義是一個可執(zhí)行語句其執(zhí)行 綁定 功能名稱可以在以后使用的標識符被稱為函數(shù)對象。
parameters 是一個可選的標識符列表,綁定到調(diào)用函數(shù)時作為參數(shù)提供的值。 函數(shù)可以具有任意數(shù)量的參數(shù),這些參數(shù)由逗號分隔。
statement(s) -也被稱為 函數(shù)體 -是每個函數(shù)被調(diào)用時執(zhí)行的語句的一個非空序列。 這意味著一個函數(shù)體不能為空。
這里有一個簡單的函數(shù)定義,目的是打印的一個例子 Hello 每次被稱為時間:
def greet():
print("Hello")
現(xiàn)在,讓我們把定義的 greet() 函數(shù):
greet()# Out: Hello
這是一個函數(shù)定義的另一個例子,它接受一個參數(shù),并在每次調(diào)用函數(shù)時顯示傳入的值:
def greet_two(greeting):
print(greeting)
在此之后, greet_two() 功能必須與參數(shù)調(diào)用:
greet_two("Howdy")
# Out: Howdy
也可以給該函數(shù)參數(shù)一個默認值:
def greet_two(greeting="Howdy"):
print(greeting)
現(xiàn)在可以調(diào)用該函數(shù)而不給出值:
greet_two()# Out: Howdy
您會注意到,與許多其他語言不同,您不需要顯式聲明函數(shù)的返回類型。 Python函數(shù)可以通過返回任何類型的值 return 關鍵字。 一個函數(shù)可以返回任意數(shù)量的不同類型!
def many_types(x):
if x < 0:
return "Hello!"
else:
return 0
print many_types(1)print many_types(-1)
# Output:0
Hello!
只要調(diào)用者正確地處理它,這是完全有效的Python代碼。
到達執(zhí)行結束沒有return語句的函數(shù)總是返回 None :
def do_nothing():
pass
print(do_nothing())# Out: None
如前所述,函數(shù)定義必須有一個函數(shù)體,一個非空的語句序列。 因此, pass 語句作為函數(shù)體,這是一個空操作-當執(zhí)行它,什么都不會發(fā)生。 當語句需要語句時,它作為占位符是有用的,但是不需要執(zhí)行代碼。
用任意數(shù)量的參數(shù)定義函數(shù)
位置參數(shù)的任意數(shù)量:
定義一個能夠獲取任意數(shù)量的參數(shù)的函數(shù)可以通過在參數(shù)前面加上一個參數(shù)來完成 *
def func(*args):
# args will be a tuple containing all values that are passed in
for i in args:
print(i)
func(1, 2, 3) # Calling it with 3 arguments# Out: 1# 2# 3
list_of_arg_values = [1, 2, 3]
func(*list_of_arg_values) # Calling it with list of values, * expands the list# Out: 1# 2# 3
func() # Calling it without arguments# No Output
你 不能 提供一個默認的 args ,例如 func(*args=[1, 2, 3]) 將引發(fā)一個語法錯誤(甚至不會編譯)。
你 不能 調(diào)用函數(shù)時,例如通過名稱提供這些 func(*args=[1, 2, 3]) 會提高一個TypeError。
但是,如果你已經(jīng)有了你的論點在數(shù)組(或其他 Iterable ),你 可以 調(diào)用你的功能如下: func(*my_stuff) 。
這些參數(shù)( *args )可以通過索引訪問,例如 args[0] 將返回第一個參數(shù)
關鍵字參數(shù)的任意數(shù)目
您可以通過定義在定義的參數(shù)取一個名字參數(shù)任意數(shù)量 2 * 在它的面前:
def func(**kwargs):
# kwargs will be a dictionary containing the names as keys and the values as values
for name, value in kwargs.items():
print(name, value)
func(value1=1, value2=2, value3=3) # Calling it with 3 arguments# Out: value2 2# value1 1# value3 3
func() # Calling it without arguments# No Out put
my_dict = {'foo': 1, 'bar': 2}
func(**my_dict) # Calling it with a dictionary# Out: foo 1# bar 2
你 不能 提供這些 沒有 名字,例如 func(1, 2, 3) 將引發(fā)一個 TypeError 。
kwargs 是一個普通的本地python字典。 例如, args['value1'] 將給予參數(shù)的值value1 。請務必先確認是否有這樣的說法或 KeyError 將提高。
警告
您可以將這些與其他可選和必需的參數(shù)混合,但在定義內(nèi)的順序很重要。
該 位置/關鍵字 參數(shù)放在第一位。 (必需參數(shù))。
然后是 任意 *arg 參數(shù)。 (可選的)。
那么 只有關鍵字的 論據(jù)來下一個。 (需要)。
最后, 任意關鍵字 **kwargs
來了。 (可選的)。
# |-positional-|-optional-|---keyword-only--|-optional-|def func(arg1, arg2=10 , *args, kwarg1, kwarg2=2, **kwargs):
pass
· arg1 必須給予,否則一個 TypeError 上升。 它可以給出作為位置( func(10) )或關鍵字參數(shù)( func(arg1=10) )。
· kwarg1 也必須給予,但它只能作為關鍵字參數(shù)來提供: func(kwarg1=10) 。
· arg2 和 kwarg2 是可選的。 如果該值要更改的相同的規(guī)則 arg1 (無論是位置還是關鍵字)和 kwarg1 (僅限于關鍵字)適用。
· *args 捕獲額外的位置參數(shù)。 但是注意, arg1 并 arg2 必須作為位置參數(shù)傳遞參數(shù)提供 *args : func(1, 1, 1, 1) 。
· **kwargs 捕捉所有其他關鍵字參數(shù)。 在這種情況下,即沒有任何參數(shù) arg1 ,arg2 , kwarg1 或 kwarg2 。 例如: func(kwarg3=10) 。
· 在Python 3,你可以使用 * 單獨指示所有后續(xù)參數(shù)必須指定為關鍵字。 比如math.isclose在Python 3.5的功能和更高的使用規(guī)定 def math.isclose (a, b, *, rel_tol=1e-09, abs_tol=0.0) ,這意味著前兩個參數(shù)可以在位置上提供,但可選的第三個和第四個參數(shù)只能作為關鍵字參數(shù)提供。
Python 2.x不支持僅關鍵字的參數(shù)。 這種行為可以被效仿 kwargs :
def func(arg1, arg2=10, **kwargs):
try:
kwarg1 = kwargs.pop("kwarg1")
except KeyError:
raise TypeError("missing required keyword-only argument: 'kwarg1'")
kwarg2 = kwargs.pop("kwarg2", 2)
# function body ...
有關命名的注意事項
命名可選位置參數(shù)的約定 args 和可選關鍵字參數(shù) kwargs 只是你一個約定 可以 使用任何你喜歡的名字 ,但 它是遵循慣例有用的,讓其他人知道你在做什么, 甚至自己以后 所以請不要。
注意唯一性
任何功能可以與被定義 沒有或者一個 *args 和 無或一種 **kwargs ,但不與每一個以上。 還*args 必須 是最后一個位置參數(shù),并 **kwargs 必須是最后一個參數(shù)。試圖使用的任一個以上的 將 導致一個語法錯誤異常。
有關可選參數(shù)的嵌套函數(shù)的注意事項
這是可以嵌套這樣的功能和一般的慣例是刪除代碼已處理的項目 ,但 如果你是傳承的參數(shù)需要傳遞一個可選的位置ARGS * 前綴和可選關鍵字ARGS一個 ** 前綴,否則ARGS可以作為列表或元組傳遞,并將kwargs作為單個字典傳遞。 例如:
def fn(**kwargs):
print (kwargs)
f1(**kwargs)
def f1(**kwargs):
print(len(kwargs))
fn(a=1, b=2)# Out:# {'a': 1, 'b': 2}# 2
來源:博客園