大爽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 場景示例
函式常用來解決一類事。
舉例如下,以下是四個同學A
、B
、C
、D
,
三門課程英語(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