Python函數
函數是一個有組織,可重複使用的代碼塊,用於執行單個相關操作。 函數爲應用程序提供更好的模塊化和高度的代碼重用。
我們知道,Python中也有給很多內置的函數,如print()
等,但用戶也可以創建自己的函數。這樣的函數稱爲用戶定義函數。
1.定義函數
可以定義提供所需函數的功能。 以下是在Python中定義函數的簡單規則。
- 函數塊以關鍵字
def
開頭,後跟函數名和小括號(()
)。 - 任何輸入參數或參數應放置在這些小括號中。也可以在這些小括號內定義參數。
- 每個函數中的代碼塊以冒號(
:
)開始,並縮進。 - 函數內的第一個語句可以是可選語句 - 函數的文檔或
docstring
字符串。 - 語句
return [expression]
用於退出一個函數,可選地將一個表達式傳回給調用者。如果沒有使用參數的return
語句,則它與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
2.調用函數
定義一個函數需要爲它起一個名字,指定要包括在函數中的參數並構造代碼塊。
當函數的基本結構完成,可以通過從另一個函數調用它或直接從Python提示符執行它。 以下是一個調用print_str()
函數的例子 -
#!/usr/bin/python3
# Function definition is here
def print_str( str ):
"This prints a passed string into this function"
print (str)
return
# Now you can call print_str function
print_str("This is first call to the user defined function!")
print_str("Again second call to the same function")
當執行上述代碼時,會產生以下結果 -
This is first call to the user defined function!
Again second call to the same function
3.通過引用與通過值傳遞
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]
在上面的輸出結果中,可以清楚地看到,mylist[2]
的值原來只在函數內賦了一個值:50
,但在函數外部的最後一個語句打出來的值是:50
,這說明更改也會反映在調用函數的外部。
還有一個例子:參數通過引用傳遞,引用在被調用函數內被覆蓋。
#!/usr/bin/python3
#coding=utf-8
# 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]
4.函數參數
可以使用以下類型的形式參數來調用函數 -
- 必需參數
- 關鍵字參數
- 默認參數
- 可變長度參數
4.1.必需參數
必需參數是以正確的位置順序傳遞給函數的參數。這裏,函數調用中的參數數量應與函數定義完全一致。
如下示例中,要調用printme()
函數,則必需要傳遞一個參數,否則會出現如下語法錯誤 -
#!/usr/bin/python3
# Function definition is here
def printme( str ):
"This prints a passed string into this function"
print (str)
return
# 現在要調用函數,但不提供參數
printme()
當執行上述代碼時,會產生以下結果 -
Traceback (most recent call last):
File "test.py", line 11, in <module>
printme();
TypeError: printme() takes exactly 1 argument (0 given)
提示:在調用
printme()
函數時,提供一個參數就可以了。如:printme('Maxsu')
。
4.2.關鍵字參數
關鍵字參數與函數調用有關。 在函數調用中使用關鍵字參數時,調用者通過參數名稱來標識參數。
這允許跳過參數或將其置於無序狀態,因爲Python解釋器能夠使用提供的關鍵字將值與參數進行匹配。還可以通過以下方式對printme()
函數進行關鍵字調用 -
#!/usr/bin/python3
#coding=utf-8
# 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
#coding=utf-8
# Function definition is here
def printinfo( name, age ):
"This prints a passed info into this function"
print ("Name: ", name, "Age: ", age)
return
# Now you can call printinfo function
printinfo( age = 25, name = "Maxsu" )
printinfo(name = "Minsu", age = 26 )
當執行上述代碼時,會產生以下結果 -
Name: Maxsu Age: 25
Name: Minsu Age: 26
4.3.默認參數
如果在該參數的函數調用中沒有提供值,則默認參數是一個假設爲默認值的參數。 以下示例給出了默認參數的想法,如果未通過,則打印默認年齡(age
) -
#!/usr/bin/python3
#coding=utf-8
# Function definition is here
def printinfo( name, age = 25 ):
"This prints a passed info into this function"
print ("Name: ", name, "Age ", age)
return
# Now you can call printinfo function
printinfo( age = 22, name = "Maxsu" )
printinfo( name = "Minsu" )
當執行上述代碼時,會產生以下結果 -
Name: Maxsu Age 22
Name: Minsu Age 25
4.4.可變長度參數
在定義函數時,可能需要處理更多參數的函數。這些參數被稱爲可變長度參數,並且不像要求的和默認的參數那樣在函數定義中命名。
具有非關鍵字變量參數的函數的語法如下:
def functionname([formal_args,] *var_args_tuple ):
"function_docstring"
function_suite
return [expression]
星號(*
)放在保存所有非關鍵字變量參數值的變量名之前。 如果在函數調用期間沒有指定額外的參數,則此元組保持爲空。以下是一個簡單的例子 -
#!/usr/bin/python3
#coding=utf-8
# Function definition is here
def printinfo( arg1, *vartuple ):
"This prints a variable passed arguments"
print ("Output is: ", 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
5.匿名函數
這些函數被稱爲匿名的,因爲它們沒有使用def
關鍵字以標準方式聲明。可以使用lambda
關鍵字創建小型匿名函數。
-
Lambda
表單可以接受任意數量的參數,但只能以表達式的形式返回一個值。它們不能包含命令或多個表達式。 - 匿名函數不能直接調用打印,因爲
lambda
需要一個表達式。 -
Lambda
函數有自己的本地命名空間,不能訪問其參數列表和全局命名空間中的變量。 - 雖然
lambdas
是一個單行版本的函數,但它們並不等同於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
6.return語句
return [expression]
語句退出一個函數,可選地將一個表達式傳回給調用者。沒有參數的return
語句與return None
相同。
下面給出的所有例子都沒有返回任何值。可以從函數返回值,如下所示:
#!/usr/bin/python3
#coding=utf-8
# 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
7.變量範圍
程序中的所有變量在該程序的所有位置可能無法訪問。這取決於在哪裏聲明一個變量。變量的範圍決定了可以訪問特定標識符的程序部分。Python中有兩個變量的基本範圍 -
- 全局變量
- 局部變量
8.全局與局部變量
在函數體內定義的變量具有局部作用域,外部定義的變量具有全局作用域。
局部變量只能在它們聲明的函數內部訪問,而全局變量可以通過所有函數在整個程序體中訪問。 當調用一個函數時,它內部聲明的變量被帶入範圍。 以下是一個簡單的例子 -
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