1. 程式人生 > >FishC筆記—18 講 函式:靈活即強大

FishC筆記—18 講 函式:靈活即強大

本期內容詳解:
1、分清楚形參和實參
2、函式文件:是函式的一部分,於解釋不同,使用help(函式名)或者 函式名__doc__可以檢視到
3、關鍵字引數(在一個函式的引數較多的時候作用比較明顯):
給引數的名字下定義,例如:
def F(name,words)
如下兩種引用的方法是等價的
F(A,B) = F(words=B,name=A)
4、預設引數:函式定義時為形參賦初值,函式呼叫時若沒有傳遞引數,則自動使用初值
def F(name=C,words=D)
5、收集引數:
def test(*params)
test(1,’小甲魚’,3.14,7,8,9)

典型課後題
請問以下哪個是形參哪個是實參?

    def MyFun(x):  
        return x ** 3  
    y = 3  
    print(MyFun(y))  

答:x是形參,y是實參。跟絕大部分程式語言一樣,形參指的是函式建立和定義過程中小括號裡的引數,而實參指的是函式在呼叫過程中傳遞進去的引數。

函式文件和直接用“#”為函式寫註釋有什麼不同?

給函式寫文件是為了讓別人可以更好的理解你的函式,所以這是一個好習慣:

def MyFirstFunction(name):  
    '函式文件在函式定義的最開頭部分,用不記名字串表示'  
    print('I love FishC.com!'
)

我們看到在函式開頭寫下的字串Ta是不會打印出來的,但Ta會作為函式的一部分儲存起來,這個我們稱之為函式文件字串,Ta的功能跟註釋是一樣的。
函式的文件字串可以按如下方式訪問:

>>> MyFirstFunction.__doc__  
'函式文件在函式定義的最開頭部分,用不記名字串表示' 

另外,我們用help()來訪問這個函式也可以看到這個文件字串:

    >>> help(MyFirstFunction)  
    Help on function MyFirstFunction in module __main__:  
        MyFirstFunction(name)  
    函式文件在函式定義的最開頭部分,用不記名字串表示  

使用關鍵字引數,可以有效避免什麼問題的出現呢?
答:關鍵字引數,是指函式在呼叫的時候,帶上引數的名字去指定具體呼叫的是哪個引數,從而可以不用按照引數的順序呼叫函式,例如:

    >>> def SaySome(name, words):  
            print(name + '->' + words)  
    >>> SaySome(words='讓程式設計改變世界!', name='小甲魚')  

使用help(print)檢視print()這個BIF有哪些預設引數?分別起到什麼作用?

    >>> help(print)  
    Help on built-in function print in module builtins:  
    print(...)  
        print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=False)  

        Prints the values to a stream, or to sys.stdout by default.  
        Optional keyword arguments:  
        file:  a file-like object (stream); defaults to the current sys.stdout.  
        # 檔案型別物件,預設是sys.stdout(標準輸出流)  
        sep:   string inserted between values, default a space.  
        # 第一個引數如果有多個值(第一個引數是收集引數),各個值之間預設用空格(space)隔開  
        end:   string appended after the last value, default a newline.  
        # 列印最後一個值之後預設引數一個新行識別符號(‘\n’)  
        flush: whether to forcibly flush the stream.  
        # 是否強制重新整理流  

預設引數和關鍵字引數表面最大的區別是什麼?

答:預設引數是賦予形式引數預設值,關鍵字引數是使得實際引數與形參相對應而避免順序錯誤引發的系統報錯。
關鍵字引數是在函式呼叫的時候,通過引數名制定需要賦值的引數,這樣做就不怕因為搞不清引數的順序而導致函式調用出錯。而預設引數是在引數定義的過程中,為形參賦初值,當函式呼叫的時候,不傳遞實參,則預設使用形參的初始值代替。

編寫一個符合以下要求的函式:
a) 計算列印所有引數的和乘以基數(base=3)的結果
b) 如果引數中最後一個引數為(base=5),則設定基數為5,基數不參與求和計算。

    def Sum(*params,base=3):  
        result = 0  
        for i in params:  
            result += i  
        return result*base  

尋找水仙花數
題目要求:如果一個3位數等於其各位數字的立方和,則稱這個數為水仙花數。例如153 = 1^3+5^3+3^3,因此153是一個水仙花數。編寫一個程式,找出所有的水仙花數。

    def Daffodils():  
        print('所有的水仙花數為:',end='')  
        temp = 100  
        while temp < 1000:  
            if temp == (temp//100)**3 + ((temp%100)//10)**3 + (temp%10)**3:  
                print(temp,end=' ')  
                temp += 1  
            else:  
                temp += 1  

編寫一個函式findstr(),該函式統計一個長度為2的子字串在另一個字串中出現的次數。例如:假定輸入的字串為”You cannot improve your past, but you can improve your future. Once time is wasted, life is wasted.”,子字串為”im”,函式執行後列印“子字母串在目標字串中共出現3次”。
程式執行效果:

    def findstr():  
        print('請輸入目標字串:',end='')  
        temp = input()  
        print('請輸入子字串(兩個字元):',end='')  
        comp = input()  
        count = 0  
        i = 0  
        for i in range(len(temp)):  
            if temp[i] == comp[0] and temp[i+1] == comp[1]:  
                count += 1  
                i += 1  
            else:  
                i += 1  
        count = int(count)  
        print('子字串在目標字串中總共出現 %d 次'%count)  
    findstr()  

參考答案:

    def findStr(desStr, subStr):  
        count = 0  
        length = len(desStr)  
        if subStr not in desStr:  
            print('在目標字串中未找到字串!')  
        else:  
            for each1 in range(length):        
                if desStr[each1] == subStr[0]:  
                    if desStr[each1+1] == subStr[1]:  
                        count += 1  

            print('子字串在目標字串中共出現 %d 次' % count)  

    desStr = input('請輸入目標字串:')  
    subStr = input('請輸入子字串(兩個字元):')  
    findStr(desStr, subStr)