你可以已經知道(了解),Python有類似於 printf()等許多內建函式。但你也可以建立自己的函式。 這些函式被稱為:使用者自定義函式。
可以定義函式,以提供所需的功能。 下面是一些簡單的規則用來定義 Python 中的函式。
函式模組使用 def 關鍵字開頭,後跟函式名以及括號( ( ) ).
任何輸入引數或引數都應該放在這些括號內。 還可以定義這些括號內的引數。
語句返回[expression]存在於函式中,一個表示式可選地傳遞給呼叫者。不帶引數的return語句返回None。
def functionname( parameters ): "function_docstring" function_suite return [expression]
def printme( str ): "This prints a passed string into this function" print (str) return
當函式的基本結構完成,可以通過從其它函式或直接從Python提示符呼叫它執行它。下面是一個呼叫 print()函式的例子 -
#!/usr/bin/python3 # Function definition is here def printme( str ): "This prints a passed string into this function" print (str) return # Now you can call printme function printme("I'm first call to user defined function!") printme("Again second call to the same function")
I'm first call to user defined function! Again second call to the same function
所有引數(引數)在Python語言中是通過參照傳遞。這意味著,如果在函式中你改變引數的值, 引數的值變動也會反映回撥用函式。例如 -
#!/usr/bin/python3 # Function definition is here def changeme( mylist ): "This changes a passed list into this function" print ("Values inside the function before change: ", mylist) mylist[2]=50 print ("Values inside the function after change: ", mylist) return # Now you can call changeme function mylist = [10,20,30] changeme( mylist ) print ("Values outside the function: ", mylist)
在這裡,我們維持傳遞的物件參考,並在同一個物件追加值。因此,這將產生以下結果 -
Values inside the function before change: [10, 20, 30] Values inside the function after change: [10, 20, 50] Values outside the function: [10, 20, 50]
#!/usr/bin/python3 # Function definition is here def changeme( mylist ): "This changes a passed list into this function" mylist = [1,2,3,4] # This would assi new reference in mylist print ("Values inside the function: ", mylist) return # Now you can call changeme function mylist = [10,20,30] changeme( mylist ) print ("Values outside the function: ", mylist)
引數 mylist 是區域性在函式 changeme。在函式中更改mylist 不影響 mylist 的值。函式不會起任何作用,最終這將產生以下結果:
Values inside the function: [1, 2, 3, 4] Values outside the function: [10, 20, 30]
必需的引數是傳遞到到一個函式正確的位置順序的引數。這裡,在函式呼叫的引數數目應當與函式定義完全匹配。
#!/usr/bin/python3 # Function definition is here def printme( str ): "This prints a passed string into this function" print (str) return # Now you can call printme function printme()
Traceback (most recent call last): File "test.py", line 11, in <module> printme(); TypeError: printme() takes exactly 1 argument (0 given)
關鍵字引數會關係到函式的呼叫。當你在一個函式呼叫中使用關鍵字引數,呼叫者是由引數名稱標識的引數。
這使您可以跳過引數或順序,因為Python直譯器能夠使用提供帶引數的值相匹配關鍵字。您也可以使用關鍵字呼叫print()函式在以下幾個方面-
#!/usr/bin/python3 # Function definition is here def printme( str ): "This prints a passed string into this function" print (str) return # Now you can call printme function printme( str = "My string")
My string
#!/usr/bin/python3 # Function definition is here def printinfo( name, age ): "This prints a passed info into this function" print ("Name: ", name) print ("Age ", age) return # Now you can call printinfo function printinfo( age=50, name="miki" )
Name: miki Age 50
預設引數是,如果引數不提供一個值,那麼函式就會呼叫這個預設引數。下面的例子給出了預設引數範例,如果沒有傳遞它,它將列印預設的 age 值 -
#!/usr/bin/python3 # Function definition is here def printinfo( name, age = 35 ): "This prints a passed info into this function" print ("Name: ", name) print ("Age ", age) return # Now you can call printinfo function printinfo( age=50, name="miki" ) printinfo( name="miki" )
Name: miki Age 50 Name: miki Age 35
您可能需要處理常式在定義函式時指定時更多的引數。 這些引數稱為可變長度引數在函式定義時不會被命名,不像必需引數和預設引數。
def functionname([formal_args,] *var_args_tuple ): "function_docstring" function_suite return [expression]
星號(*)放在持有的所有非關鍵字變數引數值的變數名之前。如果函式呼叫期間沒有指定任何其他引數此元組是空的。下面是一個簡單的例子 -
#!/usr/bin/python3 # Function definition is here def printinfo( arg1, *vartuple ): "This prints a variable passed arguments" print ("Output is: ") print (arg1) for var in vartuple: print (var) return # Now you can call printinfo function printinfo( 10 ) printinfo( 70, 60, 50 )
Output is: 10 Output is: 70 60 50
這些函式被稱為匿名,因為它們不是通過使用def關鍵字標準方式的宣告。您可以使用lambda關鍵字建立小的匿名函式。
lambda形式可以使用任何數量的引數,但在表現形式上只返回一個值。 它們不能包含命令或多個表示式。
儘管似乎 lambda 是一個函式的單行版,它們不等同於C或C++的內聯宣告,它的目的是呼叫出於效能考慮,在傳遞函式由堆疊分配。
lambda [arg1 [,arg2,.....argn]]:expression
#!/usr/bin/python3 # Function definition is here sum = lambda arg1, arg2: arg1 + arg2 # Now you can call sum as a function print ("Value of total : ", sum( 10, 20 )) print ("Value of total : ", sum( 20, 20 ))
Value of total : 30 Value of total : 40
該語句返回[expression] 存在一個函式,一個表示式可選地傳遞給呼叫者。不帶引數的return語句一樣返回None。
#!/usr/bin/python3 # Function definition is here def sum( arg1, arg2 ): # Add both the parameters and return them." total = arg1 + arg2 print ("Inside the function : ", total) return total # Now you can call sum function total = sum( 10, 20 ) print ("Outside the function : ", total )
Inside the function : 30 Outside the function : 30
程式中的所有變數可能不會在該程式中的所有位置都可以進行存取。這取決於這個變數在哪裡宣告。
變數的作用域確定了程式,可以存取特定標識的部分。有很多的 Python 變數兩種基本範圍 -
這意味著,區域性變數只能在宣告它們的函式內部存取,而全域性變數在整個程式中通過函式體內進行存取。當你呼叫一個函式,其內部宣告的變數也有一個作用域。下面是一個簡單的例子 -
#!/usr/bin/python3 total = 0 # This is global variable. # Function definition is here def sum( arg1, arg2 ): # Add both the parameters and return them." total = arg1 + arg2; # Here total is local variable. print ("Inside the function local total : ", total) return total # Now you can call sum function sum( 10, 20 ) print ("Outside the function global total : ", total )
Inside the function local total : 30 Outside the function global total : 0