Python3函數
函數是用於執行一個單一的,相關動作的組織的,可重複使用的代碼塊。 函數爲您的應用和高度代碼重用提供一個更好的代碼模塊。
你可以已經知道(瞭解),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]
函數參數
可以通過使用以下類型的形式參數來調用一個函數:
必需參數
關鍵字參數
默認參數
可變長度參數
必需的參數
必需的參數是傳遞到到一個函數正確的位置順序的參數。這裏,在函數調用的參數數目應當與函數定義完全匹配。
在調用函數 printme(),肯定需要傳遞一個參數,否則它給出了一個語法錯誤如下 -
#!/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
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函數的語法只包含一個聲明,如下 -
lambda [arg1 [,arg2,.....argn]]:expression
以下是顯示 lambda形式函數如何工作的例子-
#!/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