函數是有組織的,可重複使用的代碼,用於執行一個單一的,相關的動作的塊。函數為應用程式和代碼重用的高度提供了更好的模組。
正如我們知道的,Python的print()等許多內建函數,但也可以建立自己的函數。這些函數稱為使用者定義函數。
定義一個函數
可以定義函數,以提供所需的功能。下面是簡單的規則來定義Python函數。
- 函數塊以開始關鍵字def後跟函數名和括弧中(())。
- 任何輸入參數或參數應該放在這些括弧內。還可以定義這些括弧內的參數。
- 函數的第一個語句可以是??一個可選的聲明 - 該函數或文檔字串的文檔字串。
- 每個函數中的代碼塊以冒號(:)開頭並縮排。
- 該語句返回[運算式]退出功能,可選地傳遞迴一個運算式給調用者。不帶參數return語句返回None。
文法:
def functionname( parameters ): "function_docstring" function_suite return [expression]
預設情況下,參數具有一個位置的行為和需要,它們被定義為通知他們以相同的順序。
例子:
這是最簡單的Python函數形式。這個函數接受一個字串作為輸入參數,並列印標準的螢幕上。
def printme( str ): "This prints a passed string into this function" print str return
調用函數
定義一個函數只給出它的名稱,指定要被包括在功能和結構的代碼塊的參數。
一旦函數的基本結構確定後,可以通過從其他函數或直接從Python提示符調用它執行它。以下是樣本調用printme()函數:
#!/usr/bin/python# Function definition is heredef printme( str ): "This prints a passed string into this function" print str; return;# Now you can call printme functionprintme("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/python# Function definition is heredef changeme( mylist ): "This changes a passed list into this function" mylist.append([1,2,3,4]); print "Values inside the function: ", mylist return# Now you can call changeme functionmylist = [10,20,30];changeme( mylist );print "Values outside the function: ", mylist
這裡,我們保持傳遞的對象的參考,並在同一個對象附加的值。這樣,這將產生以下結果:
Values inside the function: [10, 20, 30, [1, 2, 3, 4]]Values outside the function: [10, 20, 30, [1, 2, 3, 4]]
還有就是參數通過引用傳遞和引用被覆蓋在被調用的函數裡面一個例子。
#!/usr/bin/python# Function definition is heredef changeme( mylist ): "This changes a passed list into this function" mylist = [1,2,3,4]; # This would assig new reference in mylist print "Values inside the function: ", mylist return# Now you can call changeme functionmylist = [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/python# Function definition is heredef printme( str ): "This prints a passed string into this function" print str; return;# Now you can call printme functionprintme();
當執行上面的代碼,產生以下結果:
Traceback (most recent call last): File "test.py", line 11, in printme();TypeError: printme() takes exactly 1 argument (0 given)
關鍵字參數:
關鍵字參數是關係到函數調用。當在一個函數調用中使用關鍵字參數,調用者通過參數名稱標識的參數。
這可以跳過參數或脫離順序,因為Python解譯器能夠使用提供的參數使用匹配的值的關鍵字。還可以使關鍵字調用在以下方面printme()函數:
#!/usr/bin/python# Function definition is heredef printme( str ): "This prints a passed string into this function" print str; return;# Now you can call printme functionprintme( str = "My string");
當執行上面的代碼中,產生以下結果:
My string
下面的例子給出了更清晰的畫面。請注意,這裡跟參數秩序沒有關係。
#!/usr/bin/python# Function definition is heredef printinfo( name, age ): "This prints a passed info into this function" print "Name: ", name; print "Age ", age; return;# Now you can call printinfo functionprintinfo( age=50, name="miki" );
當執行上面的代碼,產生以下結果:
Name: mikiAge 50
預設參數:
預設參數是,假設一個預設值,如果不提供的函數調用的參數值的參數。下面的例子給出了預設參數一個主意,它會預設列印age,如果不通過傳值:
#!/usr/bin/python# Function definition is heredef printinfo( name, age = 35 ): "This prints a passed info into this function" print "Name: ", name; print "Age ", age; return;# Now you can call printinfo functionprintinfo( age=50, name="miki" );printinfo( name="miki" );
當執行上面的代碼,產生以下結果:
Name: mikiAge 50Name: mikiAge 35
可變長度參數:
可能需要處理函數比在定義函數指定多個參數。這些參數被稱為可變長度參數,在函數定義沒有被命名,不像必需預設參數。
非關鍵字可變參數的函數的一般文法是這樣的:
def functionname([formal_args,] *var_args_tuple ): "function_docstring" function_suite return [expression]
星號(*)被放置,將持有的所有非關鍵字變數參數的值在變數名前。該元組保持為空白,如果函數調用期間沒有指定任何其他參數。下面是一個簡單的例子:
#!/usr/bin/python# Function definition is heredef 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 functionprintinfo( 10 );printinfo( 70, 60, 50 );
當執行上面的代碼,產生以下結果:
Output is:10Output is:706050
匿名函數:
可以使用lambda關鍵字來建立小的匿名函數。這些函數被稱為匿名,因為它們不是以標準方式通過使用def關鍵字聲明。
- Lambda形式可以採取任何數量的參數,但在表現形式上只返回一個值。它們不能包含命令或多個運算式。
- 匿名函數不能直接調用列印,因為需要lambda運算式。
- lambda函數都有自己的命名空間,並且不能訪問變數高於在其參數列表和那些在全域命名空間等。
- 儘管似乎lambda是一個函數的單行版本,它們不是在C或C++,其宗旨是通過調用出於效能原因在傳遞函數的堆棧分配相當於一行的聲明。
文法
lambda函數的文法僅包含單個語句,如下:
lambda [arg1 [,arg2,.....argn]]:expression
以下為例子來說明函數lambda形式是如何工作的:
#!/usr/bin/python# Function definition is heresum = lambda arg1, arg2: arg1 + arg2; # Now you can call sum as a functionprint "Value of total : ", sum( 10, 20 )print "Value of total : ", sum( 20, 20 )
當執行上面的代碼,產生以下結果:
Value of total : 30Value of total : 40
return語句:
該語句返回[運算式]退出功能,可選地傳遞迴一個運算式給調用者。不帶參數return語句返回None。
以上所有的例子都沒有返回任何值,但如果喜歡,可以從一個函數傳回值:
#!/usr/bin/python# Function definition is heredef 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 functiontotal = sum( 10, 20 );print "Outside the function : ", total
當執行上面的代碼,產生以下結果:
Inside the function : 30Outside the function : 30
變數的範圍:
程式中的所有變數可能不會在該程式中的所有位置進行訪問。這取決於所聲明的變數。
變數的範圍確定了程式,可以訪問一個特定的標識符的一部分。在Python中的變數兩個基本範疇:
全域與局部變數:
這是一個函數體內部定義的變數具有局部範圍,而那些之外定義具有全域範圍。
局部變數只能在函數內部被聲明和訪問,而全域變數可以在整個程式主體由所有函數進行訪問。當調用一個函數,它裡面聲明的變數都納入範圍。下面是一個簡單的例子:
#!/usr/bin/pythontotal = 0; # This is global variable.# Function definition is heredef 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 functionsum( 10, 20 );print "Outside the function global total : ", total
當執行上面的代碼,產生以下結果:
Inside the function local total : 30Outside the function global total : 0