你可以已經知道(瞭解),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
通過引用 VS 值傳遞
所有參數(參數)在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需要運算式。
-
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
return語句
該語句返回[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