第5章:函式和程式碼複用
阿新 • • 發佈:2018-11-30
註明:本系列課程專為全國計算機等級考試二級 Python 語言程式設計考試服務
目錄
考綱考點
- 函式的定義和使用
- 函式的引數傳遞: 可選引數傳遞、引數名稱傳遞、函式的返回值
- 變數的作用域: 區域性變數和全域性變數
知識導圖
1、函式的基本使用
函式的定義
- 函式是一段具有特定功能的、可重用的語句組,通過函式名來表示和呼叫。經過定義,一組語句等價於一個函式,在需要使用這組語句的地方,直接呼叫函式名稱即可。
- 因此,函式的使用包括兩部分:函式的定義和函式的使用。
- 函式是一種功能抽象。
- Python定義一個函式使用def保留字,語法形式如下:
def <函式名>(<引數列表>):
<函式體>
return <返回值列表>
- 函式名可以是任何有效的Python識別符號
- 引數列表是呼叫該函式時傳遞給它的值,可以有零個、一個或多個,當傳遞多個引數時各引數由逗號分隔,當沒有引數時也要保留圓括號。
- 函式體是函式每次被呼叫時執行的程式碼,由一行或多行語句組成。
# 定義一個對整數n求階乘的函式
def fact(n):
s = 1
for i in range(1, n+1):
s *= i
return s
- 如果需要返回值,使用保留字return和返回值列表。函式可以沒有return語句,函式體結束後會將控制權返回給呼叫者。
函式的使用
- 定義後的函式不能直接執行,需要經過“呼叫”才能執行。呼叫函式的基本方法如下:
<函式名>(<實際賦值引數列表>)
#定義一個對整數n求階乘的函式 def fact(n): s = 1 for i in range(1, n+1): s *= i return s # 呼叫整數階乘的函式 print(fact(100))
- 具體來說,函式的使用一共分為四個步驟:
1. 函式定義
使用def保留字將一段程式碼定義為函式,需要確定函式的名字、引數的名字、引數的個數,使用引數名稱作為形式引數(佔位符)編寫函式內部的功能程式碼。
2. 函式呼叫
通過函式名呼叫函式功能,對函式的各個引數賦予實際值,實際值可以是實際資料,也可以是在呼叫函式前已經定義過的變數。
3.函式執行
函式被呼叫後,使用實際引數(賦予形式引數的實際值)參與函式內部程式碼的執行,如果有結果則進行輸出。
4.函式返回
函式執行結束後,根據return保留字的指示決定是否返回結果,如果返回結果,則結果將被放置到函式被呼叫的位置,函式使用完畢,程式繼續執行。
2、函式的引數傳遞
可選引數傳遞
- 函式的引數在定義時可以指定預設值,當函式被呼叫時,如果沒有傳入對應的引數值,則使用函式定義時的預設值替代,函式定義時的語法形式如下:
def <函式名>(<非可選引數列表>, <可選引數> = <預設值>):
<函式體>
return <返回值列表>
- 需要注意,可選引數一般都放置在非可選引數的後面,即定義函式時,先給出所有非可選引數,然後再分別列出每個可選引數及對應的預設值。
>>>def multiply(x, y = 10):
print(x*y)
>>>multiply(99)
990
>>>multiply(99, 2)
198
引數名稱傳遞
- Python語言同時支援函式按照引數名稱方式傳遞引數,語法形式如下:
<函式名>(<引數名> = <實際值>)
>>>def multiply(x, y = 10):
print(x*y)
>>>multiply(x = 99)
990
>>>multiply(y = 2, x = 99)
198
函式的返回值
- return語句用來結束函式並將程式返回到函式被呼叫的位置繼續執行。
- return語句可以出現在函式中的任何部分,同時可以將0個、1個或多個函式運算的結果返回給函式被呼叫處的變數。
>>>def multiply(x, y = 10):
return x*y
>>>s = multiply(99, 2)
>>>print(s)
198
- 函式可以沒有return,此時函式並不返回值。當函式使用return返回多個值,可以使用一個變數或多個變數儲存結果。
>>>def multiply(x, y = 10):
return x*y, x+y
>>>s = multiply(99, 2)
>>>print(s)
(198, 101)
>>>a,b = multiply(99, 2)
>>>print(a)
198
>>>print(b)
101
3、變數的作用域
- 根據程式中變數所在的位置和作用範圍,變數分為區域性變數和全域性變數。
- 區域性變數僅在函式內部,且作用域也在函式內部,全域性變數的作用域跨越多個函式。
區域性變數
- 區域性變數指在函式內部使用的變數,僅在函式內部有效,當函式退出時變數將不再存在。
>>>def multiply(x, y = 10):
z = x*y # z是函式內部的區域性變數
return z
>>>s = multiply(99, 2)
>>>print(s)
198
>>>print(z)
Traceback (most recent call last):
File "<pyshell#11>", line 1, in <module>
print(z)
NameError: name 'z' is not defined
- 變數z是函式multiple()內部使用的變數,當函式呼叫後,變數z將不存在。
全域性變數
- 全域性變數指在函式之外定義的變數,在程式執行全過程有效。全部變數在函式內部使用時,需要提前使用保留字global宣告,語法形式如下:
global <全域性變數>
>>>n = 2 #n是全域性變數
>>>def multiply(x, y = 10):
global n
return x*y*n # 使用全域性變數n
>>>s = multiply(99, 2)
>>>print(s)
396
- 上例中,變數n是全域性變數,在函式multiply()中使用時需要在函式內部使用global宣告,定義後即可使用。
- 如果未使用保留字global宣告,即使名稱相同,也不是全域性變數。
>>>n = 2 #n是全域性變數
>>>def multiply(x, y = 10):
n = x*y
return n # 此處的n不是全域性變數
>>>s = multiply(99, 2)
>>>print(s)
198
>>>print(n) #不改變外部全域性變數的值
2
4、程式碼複用
- 函式是程式的一種基本抽象方式,它將一系列程式碼組織起來通過命名供其他程式使用。
- 函式封裝的直接好處是程式碼複用,任何其他程式碼只要輸入引數即可呼叫函式,從而避免相同功能程式碼在被呼叫處重複編寫。程式碼複用產生了另一個好處,當更新函式功能時,所有被呼叫處的功能都被更新。
- 模組化設計指通過函式的封裝功能將程式劃分成主程式、子程式和子程式間關係的表達。模組化設計是使用函式設計程式的思考方法,以功能塊為基本單位,一般有兩個基本要求:
緊耦合:儘可能合理劃分功能塊,功能塊內部耦合緊密;
鬆耦合:模組間關係儘可能簡單,功能塊之間耦合度低。
- 耦合性指程式結構中各模組之間相互關聯的程度,它取決於各模組間介面的複雜程度和呼叫方式。
- 緊耦合指模組或系統間關係緊密,存在較多或複雜的相互呼叫。緊耦合的缺點在於更新一個模組可能導致其它模組變化,複用較困難。
- 鬆耦合一般基於訊息或協議實現,系統間互動簡單。
- 使用函式只是模組化設計的必要非充分條件,根據計算需求合理劃分函式十分重要。一般來說,完成特定功能或被經常複用的一組語句應該採用函式來封裝,並儘可能減少函式間引數和返回值的數量。
5、例項解析:軟文的詩詞風
- 軟文的詩詞風將原有文章根據標點符號重新切分成短句並居中排版,對小螢幕閱讀十分有利。使用程式將普通文章變成軟文的詩詞風十分有趣
txt = '''
人生得意須盡歡,莫使金樽空對月。
天生我材必有用,千金散盡還復來。
'''
linewidth = 30 # 預定的輸出寬度
def lineSplit(line):
plist = [',', '!', '?', ',', '。', '!', '?']
for p in plist:
line = line.replace(p, '\n')
return line.split('\n')
def linePrint(line):
global linewidth
print(line.center(linewidth, chr(12288)))
newlines = lineSplit(txt)
for newline in newlines:
linePrint(newline)
- 原始文字使用變數txt儲存,程式執行效果如下。
>>>
人生得意須盡歡
莫使金樽空對月
天生我材必有用
千金散盡還復來
原始文字使用變數txt儲存,程式執行效果如下。
txt = '''
三國演義 上卷
羅貫中
滾滾長江東逝水,浪花淘盡英雄。是非成敗轉頭空。青山依舊在,幾度夕陽紅。
白髮漁樵江渚上,慣看秋月春風。一壺濁酒喜相逢。古今多少事,都付笑談中。
--調寄《臨江仙》
第一回 宴桃園豪傑三結義 斬黃巾英雄首立功
話說天下大勢,分久必合,合久必分。週末七國分爭,併入於秦。及秦滅之後,
楚、漢分爭,又併入於漢。漢朝自高祖斬白蛇而起義,一統天下,後來光武中興,
傳至獻帝,遂分為三國。
'''
>>>
三國演義 上卷
羅貫中
滾滾長江東逝水
浪花淘盡英雄
是非成敗轉頭空
青山依舊在
幾度夕陽紅
白髮漁樵江渚上
慣看秋月春風
一壺濁酒喜相逢
古今多少事
都付笑談中
--調寄《臨江仙》
第一回 宴桃園豪傑三結義 斬黃巾英雄首立功
話說天下大勢
分久必合
合久必分
週末七國分爭
併入於秦
及秦滅之後
楚、漢分爭
又併入於漢
漢朝自高祖斬白蛇而起義
一統天下
後來光武中興
傳至獻帝
遂分為三國
- 當每句長度超過變數linewdith後,顯示效果並不好。這需要修改函式linePrint(),當一個短句行數超過限制時,分行居中顯示。
def linePrint(line):
global linewidth
while len(line) > linewidth:
print(line[0:linewidth])
line = line[linewidth:]
print(line.center(linewidth, chr(12288)))
本章小結
本章講解了函式的基本使用方法,包括函式的定義和呼叫。進一步具體講解了函式的引數傳遞方法和變數的作用域,包括可選引數傳遞、引數名稱傳遞和函式的返回值,初步介紹了函式的作用和程式碼複用。通過軟文的詩詞風例項幫助讀者理解函式的定義和使用。
古代的詩詞歌賦是填詞怡情,當代的詩詞歌賦則是風格怡情,快來造個自己風格吧?!