[22] Python函數(三)

1. 概述

本章對函數的參數和返回再進行補充介紹。

  • 計算機編程的原理簡要介紹
  • 集成開發環境PyCharm
  • 變數名、數字、字元串、列表
  • 句式、注釋
  • 輸入和輸出
  • 條件判斷語句
  • 循環語句
  • 各類數據結構
  • 函數
  • 模塊和引入

2. 默認參數

默認參數,都會伴有一個預設值。其實預設這詞也好默認這詞也好,都是default這個詞的翻譯,貌似default一開始沒法翻譯成默認這意思,理解為「缺失省略條件下的某種事物」,後來才隨著計算機發展被翻譯成默認。有興趣的同學可以百度一下。

如何定義默認函數?我們來看一個例子:

def multy(start, num, mult=2): result = [start] ind = 1 while ind < num: result.append(result[ind - 1] * mult) ind += 1 return result

這個函數可以返回一個等比數列,從start這個數開始為列表第一個數,一共num個元素。這裡我們mult就是等比數列的公比,我們用mult=2來將其默認值設為2。

print(multy(7, 3)) #[7, 14, 28]print(multy(7, 3, 3)) #[7, 21, 63]

第一行print,我們只有兩個參數,7對應start,3對應num,由於沒有第三個參數,mult屬於參數缺失狀態,就會採用默認值2,而第二個print,我們有了第三個參數,mult就會用3作為公比,不採用默認值。

我們可以視默認參數為可選參數,也就是說,我們在使用這個函數時並不需要申明所有參數的值,如果我們主程序使用函數少了默認參數位置上的數據,我們就會在進入該函數時使用我們事先準備好的默認值,在這裡也就是mult為2;但如果主程序中用戶提供了默認參數的數據,我們就會取而代之使用用戶的數據,忽略事先定義的默認值。

默認參數的位置必須要在非默認參數之後,這點我們不用太糾結,畢竟我們被PyCharm嬌生慣養著,如果我們把mult=2移動到前面任何一個參數位置上,PyCharm會積極地提示錯誤。

對於多個默認參數,不用擔心,照樣和之前一樣定義並使用,稍微補充一點就行了。

def multy(start, num, mult=2, mode=0): result = [start] ind = 1 while ind < num: result.append(result[ind - 1] * mult) ind += 1 # Output format: # Default mode0 is decimal # mode1 is binary, mode2 is hex if mode == 1: for ind in range(0, len(result)): result[ind] = bin(result[ind]) elif mode == 2: for ind in range(0, len(result)): result[ind] = hex(result[ind]) return result

我們多了一個參數,mode,假設我們事先告訴用戶有三種模式,0代表十進位,1是二進位,2是十六進位,默認為十進位。比如我們設mode為2,那麼返回的列表裡每個值都是十六進位的。

print(multy(7, 3)) #[7, 14, 28]print(multy(7, 3, 3)) #[7, 21, 63]print(multy(7, 3, 3, 2)) #[0x7, 0x15, 0x3f]

我們可以看到,mult和mode在不輸入的情況下都是採用默認值,只輸入mult不輸入mode,mult採用用戶指定值,mode就用默認值0也就是十進位;都輸入的話都採取用戶指定值。但是如果我們想要用mult的默認值,但是mode用用戶輸入的值怎麼辦?

print(multy(7, 3, mode=1)) #[0b111, 0b1110, 0b11100]

由於中間跳了一個參數,我們必須聲明哪個參數為什麼值,我們只要用函數中參數名=數據或者變數,就像mode=1那樣,這樣就能告訴Python我們到底要在這一堆默認參數中到底哪個要用默認哪個不用默認。

另外這個參數名=數據的格式也適用於非默認參數。

def div(a, b): print(a / b)div(4, 2) #2.0div(a=4, b=2) #2.0div(2, 4) #0.5div(b=4, a=2) #0.5

在使用函數時添加了參數名,就能讓Python去根據參數名而不是位置來傳值,不過這個功能我也很少用,除了像上面那種多個默認參數的情況。

3. 不定量參數

我們有一堆數據,我們需要求平均數,公式是:

ar{x} = sum_{i=1}^{n}{x_{i}/n}

在不允許使用列表的情況下,我們需要借用不定量參數

def print_avg(title, *args): sum = 0 for number in args: sum += number print(title, sum/len(args))print_avg(The average is, 4, 5, 6, 7, 8, 9)#The average is 6.5

這個我們用星號+變數名,比如這裡是*args來指代從title後面開始直到用戶輸入的最後一個值為止的所有數據,這裡也就是4、5、6、7、8、9這些數。使用方法也和列表一樣,用for…in語句和len函數等等。

另外還有一個帶雙星的關鍵字參數,我們先不在入門篇里介紹。

4. 多個返回語句

在之前我也說過函數運行到return就會終止函數運行並返回到主程序中,但這並不代表我們一個程序只能有一個return語句。配合循環或者條件判斷等我們可以實現多個return共存。

def determine_grade(score): grade = F # Default grade is F, learn to be cruel if score >= 90: grade = A elif score >= 80: grade = B elif score >= 70: grade = C elif score >= 60: grade = D return grade

這個很好理解,根據分數判等第,看不懂的同學可以移步我的條件判斷語句章節。我們可以看到,有了if elif else等能夠判斷的語句,我們可以決定接下來某些代碼是否要被執行。我也在上面加粗了「運行到」仨字,意思也就是說只有夠到return才能結束程序,不然就運行到最後。

於是這段代碼也可以表達成如下:

def determine_grade(score): if score >= 90: return A if score >= 80: return B if score >= 70: return C if score >= 60: return D return F

如果90分以上,返回A,結束;如果80分以上,返回B,結束;……;如果四個都不是,則沒辦法,最後一行,返回F,給個紅燈籠。

我們可以看到我這裡就省去了grade這個變數,讓程序看著簡潔了,有了這if條件判斷,我們就能決定要不要執行某行return,不過判斷為False,我們就不執行,接著檢查之後的代碼。另外我這裡也不用elif和else了,原因是return能終結該函數,我們沒有必要再把條件判斷都連起來了,人生苦短能少打倆字是倆字,當然大家想用也可以,其實在邏輯上並沒有區別。

當然,這個用法也有很多學了n年計算機的同學不願意用的,我身邊特別是很多美國同學都特別不習慣讀或寫此風格的代碼,大家也是看心情,不過給不喜歡這麼寫的同學打個預防針,本人特喜歡寫一堆return,因為感覺真的很上癮。

關於函數所要講的其實不多,我們更需要練的是如何使用Python強大的庫,接下來我會介紹函數的最後一塊內容,也是Python入門的最後一塊,模塊和引入。


推薦閱讀:

人的平均邏輯遞歸層數是多少?
MD5是滿射嗎?
德國計算機專業對數學要求高嗎?
非計算機專業的學生怎麼系統的自學計算機的課程?

TAG:Python | 计算机科学 | 编程 |