你可以已經(jīng)知道(了解),Python有類似于 printf()等許多內(nèi)置函數(shù)。但你也可以創(chuàng)建自己的函數(shù)。 這些函數(shù)被稱為:用戶自定義函數(shù)。
可以定義函數(shù),以提供所需的功能。 下面是一些簡單的規(guī)則用來定義 Python 中的函數(shù)。
函數(shù)模塊使用 def 關(guān)鍵字開頭,后跟函數(shù)名以及括號( ( ) ).
任何輸入?yún)?shù)或參數(shù)都應(yīng)該放在這些括號內(nèi)。 還可以定義這些括號內(nèi)的參數(shù)。
語句返回[expression]存在于函數(shù)中,一個(gè)表達(dá)式可選地傳遞給調(diào)用者。不帶參數(shù)的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
當(dāng)函數(shù)的基本結(jié)構(gòu)完成,可以通過從其它函數(shù)或直接從Python提示符調(diào)用它執(zhí)行它。下面是一個(gè)調(diào)用 print()函數(shù)的例子 -
#!/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
所有參數(shù)(參數(shù))在Python語言中是通過引用傳遞。這意味著,如果在函數(shù)中你改變參數(shù)的值, 參數(shù)的值變動(dòng)也會反映回調(diào)用函數(shù)。例如 -
#!/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)
在這里,我們維持傳遞的對象參考,并在同一個(gè)對象追加值。因此,這將產(chǎn)生以下結(jié)果 -
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)
參數(shù) mylist 是局部在函數(shù) changeme。在函數(shù)中更改mylist 不影響 mylist 的值。函數(shù)不會起任何作用,最終這將產(chǎn)生以下結(jié)果:
Values inside the function: [1, 2, 3, 4] Values outside the function: [10, 20, 30]
必需的參數(shù)是傳遞到到一個(gè)函數(shù)正確的位置順序的參數(shù)。這里,在函數(shù)調(diào)用的參數(shù)數(shù)目應(yīng)當(dāng)與函數(shù)定義完全匹配。
#!/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)
關(guān)鍵字參數(shù)會關(guān)系到函數(shù)的調(diào)用。當(dāng)你在一個(gè)函數(shù)調(diào)用中使用關(guān)鍵字參數(shù),調(diào)用者是由參數(shù)名稱標(biāo)識的參數(shù)。
這使您可以跳過參數(shù)或順序,因?yàn)镻ython解釋器能夠使用提供帶參數(shù)的值相匹配關(guān)鍵字。您也可以使用關(guān)鍵字調(diào)用print()函數(shù)在以下幾個(gè)方面-
#!/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
默認(rèn)參數(shù)是,如果參數(shù)不提供一個(gè)值,那么函數(shù)就會調(diào)用這個(gè)默認(rèn)參數(shù)。下面的例子給出了默認(rèn)參數(shù)示例,如果沒有傳遞它,它將打印默認(rèn)的 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
您可能需要處理函數(shù)在定義函數(shù)時(shí)指定時(shí)更多的參數(shù)。 這些參數(shù)稱為可變長度參數(shù)在函數(shù)定義時(shí)不會被命名,不像必需參數(shù)和默認(rèn)參數(shù)。
def functionname([formal_args,] *var_args_tuple ): "function_docstring" function_suite return [expression]
星號(*)放在持有的所有非關(guān)鍵字變量參數(shù)值的變量名之前。如果函數(shù)調(diào)用期間沒有指定任何其他參數(shù)此元組是空的。下面是一個(gè)簡單的例子 -
#!/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
這些函數(shù)被稱為匿名,因?yàn)樗鼈儾皇峭ㄟ^使用def關(guān)鍵字標(biāo)準(zhǔn)方式的聲明。您可以使用lambda關(guān)鍵字創(chuàng)建小的匿名函數(shù)。
lambda形式可以使用任何數(shù)量的參數(shù),但在表現(xiàn)形式上只返回一個(gè)值。 它們不能包含命令或多個(gè)表達(dá)式。
盡管似乎 lambda 是一個(gè)函數(shù)的單行版,它們不等同于C或C++的內(nèi)聯(lián)聲明,它的目的是調(diào)用出于性能考慮,在傳遞函數(shù)由堆棧分配。
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] 存在一個(gè)函數(shù),一個(gè)表達(dá)式可選地傳遞給調(diào)用者。不帶參數(shù)的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
程序中的所有變量可能不會在該程序中的所有位置都可以進(jìn)行訪問。這取決于這個(gè)變量在哪里聲明。
變量的作用域確定了程序,可以訪問特定標(biāo)識的部分。有很多的 Python 變量兩種基本范圍 -
這意味著,局部變量只能在聲明它們的函數(shù)內(nèi)部訪問,而全局變量在整個(gè)程序中通過函數(shù)體內(nèi)進(jìn)行訪問。當(dāng)你調(diào)用一個(gè)函數(shù),其內(nèi)部聲明的變量也有一個(gè)作用域。下面是一個(gè)簡單的例子 -
#!/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