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)

引數mylistchangeme()函式的區域性變數。在函式中更改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是一個單行版本的函式,但它們並不等同於CC++中的內聯語句,其目的是通過傳遞函式來進行堆疊分配。

語法

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