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 <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函式的語法只包含一個宣告,如下 -
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