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

上一篇: Python3日期和時間 下一篇: Python3模組