Python編程實現(17):必須掌握的函數知識

李寧老師已經在「極客起源」 微信公衆號推出《Python編程思想》電子書,囊括了Python的核心技術,以及Python的主要函數庫的使用方法。讀者可以在「極客起源」 公衆號中輸入 160442 開始學習。

《Python編程思想》總目錄

《Python編程思想》專欄

目錄

1. 函數的定義和調用

2. 多返回值函數

3. 遞歸函數


函數就是封裝代碼的單元。如果某一段代碼要至少調用2次,通常會將這段代碼用函數封裝。使用函數的好處如下:

1. 方便重複調用同樣的代碼;

2. 避免代碼冗餘

3. 容易維護

1. 函數的定義和調用

示例代碼:func_test.py

在使用函數之前必須先定義函數,定義函數的語法格式如下:

def 函數名(形參列表)
    # 多條語句
    [return[返回值]]

Python聲明函數必須使用def關鍵字,對函數語法格式的詳細說明如下:

  • 函數名:從語法角度來看,函數名只要是一個合法的標識符即可;從程序的可讀性角度來看,函數名應該由一個或多個有意義的單詞的組合,如get_name,每個單詞的所有字母都是小寫的,多個單詞通過下劃線(_)連接;
  • 形參列表:用於定義該函數可以接收的參數。形參列表由多個形參名組成,多個形參名之間以英文逗號(,)隔開。一旦在定義函數時指定了形參列表,調用該函數時就必須傳入對應的參數值;

下面的代碼演示了函數的定義和調用:

## 定義一個函數,聲明2個形參
def max_value(x, y) :
   result = x if x > y else y
   # 返回變量z的值
   return result
# 定義一個函數,聲明1個形參
def greet(name) :
   print("正在執行greet函數")
   return f'hello {name}'
a = 3
b = 5
# 調用max_greet函數
result = max_value(a , b)
print("result:", result)
# 調用greet()函數,直接輸出函數的返回值
print(greet("李寧")) 

執行這段代碼,會輸出如下的結果:

result: 5
正在執行greet函數
hello 李寧

上面程序中定義了兩個函數:max_value與greet,並且調用了這兩個函數。其中max_value函數返回了一個變量,而greet函數返回了一個格式化的字符串,在函數體中使用 return語句可以顯式地返回一個值,return語句返回的值既可以是有值的變量,也可以是一個表達式。

2. 多返回值函數

如果函數需要有多個返回值,則既可將多個值包裝成列表之後返回,也可直接返回多個值。如果 Python函數直接返回多個值,Python會自動將多個返回值封裝成元組。演示代碼如下:

# 多返回值
def sum_and_avg(num_list):
    sum = 0
    count = 0
    for value in num_list:
        # 如果元素value是數值
        if isinstance(value, int) or isinstance(value, float):
            count += 1
            sum += value
    return sum, sum / count
num_list = [14, 145, 15.1, 'True', 3.5, 45.9, -31.8,13.4,"hello",False]
# 獲取sum_and_avg函數返回的多個值,多個返回值被封裝成元組
result = sum_and_avg(num_list)
print(result)
# 使用序列解包來獲取多個返回值
s, avg = sum_and_avg(num_list)
print(s)
print(avg)

執行這段代碼,會輸出如下的內容:

(205.1, 25.6375) 205.1 25.6375

上面代碼中的sum_and_avg函數返回了多個值,並且兩次調用了sum_and_avg函數,第1次返回了列表,第2次使用序列解包來獲取多個返回值。

3. 遞歸函數

在一個函數體內調用它自身,被稱爲遞歸函數。函數遞歸包含了一種隱式的循環,它會重複執行某段代碼,但這種重複執行無須循環控制。最典型的遞歸算法是階乘和斐波那契數列,下面就用斐波那契數列來演示遞歸函數的編寫方法。

斐波那契數列的計算規則是:f(0) =1, f(1) =3 ,f(n+2)=2*f(n+1)+f(n),其中n是大於0的整數。

現在要求f(10)的值(通用的問題就是計算第n個位置的斐波那契數列的值),遞歸算法如下:

def fn(n) :
   if n == 0 :
      return 1
   elif n == 1 :
      return 3
   else :
      # 函數中調用它自身,就是遞歸函數
      return 2 * fn(n - 1) + fn(n - 2)
# 輸出fn(10)的結果
print(f"fn(10)的結果是{fn(10)}")

執行這段代碼,會輸出如下內容:

fn(10)的結果是8119

在上面的fn函數體中再次調用了fn()函數,這就是函數遞歸。注意在fn()函數體中調用f(n)的形式:return 2*fn(n -1)+ fn(n-2)。對於fn(10)來說,也就是2*fn(9)+fn(8),其中fn(9)又等於2*fn(8)+fn(7),...,依此類推,最終會計算到fn(2)等於2*fn(1)+fn(0),而fn(2)是可計算的,這樣遞歸帶來的隱式循環就結束了(當不再調用自身時,遞歸函數結束)。然後一路反算回去,最後就可以得到fn(10)的值。

對本文感興趣的同學可以加微信unitymarvel,或掃描下面二維碼加羣,然後拖加入技術討論羣。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章