1. 程式人生 > 其它 >大爽Python入門教程 4-1 初識函式Function

大爽Python入門教程 4-1 初識函式Function

大爽Python入門公開課教案 點選檢視教程總目錄

1 情景回顧

在之前的第一章 第三節 第三部分 第三題 有趣的極限中,

\[S = 1 - \frac{1}{2} + \frac{1}{3} - \frac{1}{4} + \frac{1}{5} - \frac{1}{6} + ... + \frac{(-1)^{n-1}}{n} \]

我們求過n在三個不同的值100,1000,10000時S的值。

當時的程式碼是這樣的:

n = 100
k = 1
s = 0
for i in range(n):
    s += k / (i + 1)
    k = -k
print("n=%s: S=%s" % (n, s))


n = 1000
k = 1
s = 0
for i in range(n):
    s += k / (i + 1)
    k = -k
print("n=%s: S=%s" % (n, s))


n = 10000
k = 1
s = 0
for i in range(n):
    s += k / (i + 1)
    k = -k
print("n=%s: S=%s" % (n, s))

其中

k = 1
s = 0
for i in range(n):
    s += k / (i + 1)
    k = -k
print("n=%s: S=%s" % (n, s))

這段程式碼重複了三遍。

如果我們要展示,n在更多不同的值時,S的值。
那麼這段程式碼還會重複更多次。

遇到這種需要重複的程式碼的時候,
我們希望有一種機制。
把這段重複的程式碼打包收納起來,
並起一個相對簡短的名字標識它。

就像給一個名字特別長的人,起一個簡短的暱稱。
以後每次叫他時就省事很多。

更準確一點,就像是把這些指令壓縮摺疊成一個小工具箱。
往箱子裡面傳入不同的n值,就會得到對應的不同的結果。

要實現這樣的機制,我們往往會使用函式。

2 使用函式

函式是一段程式碼,或者說一串程式碼塊,特點為:

  • 執行一種任務,或者說承擔一種功能
  • 只在呼叫時執行
  • 可以傳進去不同的引數,然後得到對應的結果。

現在將第一部分中重複的程式碼放入一個函式裡,
並起名為calculate_sum, 程式碼如下

def calculate_sum(n):
    k = 1
    s = 0
    for i in range(n):
        s += k / (i + 1)
        k = -k
    print("n=%s: S=%s" % (n, s))

其中

  • def為關鍵字(keyword),用於宣告這是一個函式,
  • def
    後面接一個空格,空格後為函式名calculate_sum,
  • 函式名後接(), 圓括號中定義這個函式接受的引數。
  • 圓括號後接:,然後回車並縮排,縮排中就是函式中的語句。

總的來講,
首行是函式頭(function head),寫宣告,
之後是函式體(function body),寫具體要執行的語句。

使用函式,又稱呼叫函式。
calculate_sum函式必須接受一個引數作為n, 其呼叫語句如下

n = 100
calculate_sum(n)

也可以寫為

calculate_sum(100)

此時展示n在三個不同的值100,1000,10000時,S的值。
程式碼如下

def calculate_sum(n):
    k = 1
    s = 0
    for i in range(n):
        s += k / (i + 1)
        k = -k
    print("n=%s: S=%s" % (n, s))

calculate_sum(100)
calculate_sum(1000)
calculate_sum(10000)

輸出如下

n=100: S=0.688172179310195
n=1000: S=0.6926474305598223
n=10000: S=0.6930971830599583

此時,要額外地求其他n值對應的S值,只需要使用一行程式碼即可。

比如要展示n為100000時S的值
只需在末尾新增一行

calculate_sum(100000)

3 場景示例

函式常用來解決一類事。

舉例如下,以下是四個同學ABCD
三門課程英語(music)、歷史(history)、語法(grammer)的成績。

scores = {
    "A": {"music": 80, "history": 70, "grammer": 75},
    "B": {"music": 81, "history": 78, "grammer": 83},
    "C": {"music": 85, "history": 81, "grammer": 81},
    "D": {"music": 83, "history": 90, "grammer": 82},
}

現在需要程式計算並輸出這些同學音樂的平均分。

這個時候推薦寫一個函式,函式接受學科的名字作為引數,計算這個學科的平均分。

def show_course_average(course_name):
    sum_score = 0
    for student in scores:
        student_scores = scores[student]
        course_score = student_scores[course_name]

        sum_score += course_score

    aver_score = sum_score / len(scores)

    print("Average score for %s course: %s" % (course_name, aver_score))

函式寫好後,要展示音樂的平均分。
呼叫方法如下

show_course_average("music")

最後輸出如下

Average score for music course: 82.25

編寫這樣一個函式的好處是,如果後續要輸出他們其他科目的平均分,也很容易,只需要再呼叫函式就可。

比如輸出他們歷史和語法的平均分,呼叫程式碼如下。

show_course_average("history")
show_course_average("grammer")

輸出如下

Average score for history course: 79.75
Average score for grammer course: 80.25

小結:函式讓我們寫的程式碼,可以重複的被使用,且有一定的靈活性,能夠用同一邏輯 處理不同的輸入。
讓我們不用重複寫程式碼或者做較多的修改。

4 組織程式碼

關於函式的作用:
函式不僅可以讓一段程式碼邏輯能被重複使用,
函式還可以用來去組織我們的程式碼。

這個我們具體後面再展開討論。
這裡先介紹一下空函式。

空函式

寫程式碼的時候,我們可以把要做的事情,先定義成一些對應的空函式。
就像是寫文章的時候,先列一個大綱幾個事件,
具體裡面的內容到後面再去填充。

空函式,本質就是函式體裡面什麼都不執行。
但是:後面如果什麼都不寫就退出函式(退出縮排),程式會報錯。
比如這個程式碼

def simple_func():

會報錯SyntaxError
之前的if ...:for ...:也是如此(什麼都不寫就退出會報錯)。

那麼這個時候可以使用pass

pass

DOC: The pass statement does nothing. It can be used when a statement is required syntactically but the program requires no action.

pass語句是一個空語句,它什麼都不做。
當程式不需要執行操作,但語法上需要語句時,我們可以使用它。

可以說這是一個佔位語句,保持程式語法結構的完整性。

比如,我們給上面那個函式加上pass

def simple_func():
    pass

就不會報錯了(但這個函式仍然啥都不做)

pass可以用在任何地方。
但是一般用在:後面,具體點,是用在:後面還沒有寫具體內容的場景下。

比如寫空函式時常會使用pass
等到函式可以寫具體邏輯的時候,再刪掉pass
這個具體可以通過我們後面的各種示例來理解。

5 函式註釋

DocStrings

對於函式,為了讓別人能看懂(也為了自己以後能看懂),常需要寫註釋來介紹函式功能。

這個時候推薦使用文件字串DocStrings來寫註釋。

在函式體的第一行使用一對三個單引號 '''
或者一對三個雙引號"""來定義文件字串

示例如下

def simple_func():
    """ describe the function here """
    pass

DocStrings還可以是多行的。
第一行一般簡述函式功能。
第二行空行,
第三行具體展開描述。
示例如下

def simple_func():
    """ simple function

    do nothing"""
    pass