1. 程式人生 > >第5章:函式和程式碼複用

第5章:函式和程式碼複用

註明:本系列課程專為全國計算機等級考試二級 Python 語言程式設計考試服務

目錄

考綱考點

知識導圖

1、函式的基本使用

函式的定義

函式的使用

2、函式的引數傳遞

可選引數傳遞

引數名稱傳遞

函式的返回值

3、變數的作用域

區域性變數

全域性變數

4、程式碼複用

5、例項解析:軟文的詩詞風

本章小結


考綱考點

  • 函式的定義和使用
  • 函式的引數傳遞: 可選引數傳遞、引數名稱傳遞、函式的返回值
  • 變數的作用域: 區域性變數和全域性變數

知識導圖

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)))

本章小結

本章講解了函式的基本使用方法,包括函式的定義和呼叫。進一步具體講解了函式的引數傳遞方法和變數的作用域,包括可選引數傳遞、引數名稱傳遞和函式的返回值,初步介紹了函式的作用和程式碼複用。通過軟文的詩詞風例項幫助讀者理解函式的定義和使用。

古代的詩詞歌賦是填詞怡情,當代的詩詞歌賦則是風格怡情,快來造個自己風格吧?!