課時17:函式:Python的樂高積木

那是個好男孩發表於2018-08-13

目錄:

  一、建立和呼叫函式

  二、函式的引數

  三、函式的返回值

  四、課時17課後習題及答案

 

為了使得程式得程式碼變得簡單,就需要把程式分解成較小得組成部分。有三種方法可以實現:函式、物件、模組。

***********************

一、建立和呼叫函式

***********************

此前接觸的BIF就是Python幫我們封裝好的函式。在Python中建立一個函式用def關鍵字。

def myFristFunction():
      print("DC love ZWW")
      print("1314520")

注意:在函式的後面要加上一對小括號哦。這小括號是必不可少的。接下來是函式的呼叫:

>>> myFristFunction()
DC love ZWW
1314520

函式的呼叫和執行機制:當函式myFristFunction()發生呼叫操作的時候,Python會自動往上找到def myFristFunction()的定義過程,倘若沒找到就會報錯。然後依此執行該函式所包含的程式碼塊部分(也就是冒號後縮排的那部分內容)。只需要一條語句,就可以實現函式內的所用功能。

假如,我想把剛才的內容列印3次,我只需要呼叫3次函式即可:

>>> for each in range(3):
    myFristFunction()

    
DC love ZWW
1314520
DC love ZWW
1314520
DC love ZWW
1314520

 

******************

二、函式的引數

******************

 括號裡放的就是函式的引數。引數就是使得函式可以實現個性化:

>>> def mySecondFunction(name):
    print(name+"愛ZWW")

    
>>> mySecondFunction("DC")
DC愛ZWW
>>> mySecondFunction("dc")
dc愛ZWW

使用多個引數的時候,只需要用逗號隔開

>>> def add(name1,name2):
    print(name1+" love "+name2)

    
>>> add("DC","ZWW")
DC love ZWW

 那究竟可以多少個引數呢?理論上想要多少個就有多少個。

 

*********************

三、函式的返回值

*********************

我們的函式要有返回值,只需要在函式中使用關鍵字return,後面就跟著要返回的值。

>>> def add(name1,name2):
    print(name1+" love "+name2)
    return "LOVE"

>>> add("DC","ZWW")
DC love ZWW
'LOVE'
>>> def add(name1,name2):
    print(name1+" love "+name2)
    return name1

>>> add("DC","ZWW")
DC love ZWW
'DC'

 

*******************************

四、課時17課後習題及答案

*******************************

測試題:

 

0. 你有聽說過DRY嗎?  

答:DRY是程式設計師們公認的指導原則:Don't Repeat Yourself. 
快快武裝你的思維吧,拿起函式,不要再去重複拷貝一段程式碼了

 

1. 都是重複一段程式碼,為什麼我要使用函式(而不使用簡單的拷貝黏貼)呢?

答:

使用函式:

0) 可以降低程式碼量(呼叫函式只需要一行,而拷貝黏貼需要N倍程式碼)
1) 可以降低維護成本(函式只需修改def部分內容,而拷貝黏貼則需要每一處出現的地方都作修改)
2) 使序更容易閱讀(沒有人會希望看到一個程式重複一萬行“I love FishC.com”)

 

2. 函式可以有多個引數嗎?     

答:可以的,理論上你想要有多少個就可以有多少個,只不過如果函式的引數過多,在呼叫的時候出錯的機率就會大大提高,因而寫這個函式的程式設計師也會被相應的問候祖宗,所以,儘量精簡吧,在Python的世界裡,精簡才是王道!

 

3. 建立函式使用什麼關鍵字,要注意什麼?    

答:使用“def”關鍵字,要注意函式名後邊要加上小括號“()”,然後小括號後邊是冒號“:”,然後縮排部分均屬於函式體的內容,例如:

def MyFun():
    # 我是函式體
    # 我也是函式體
    # 我們都屬於函式MyFun()

# 噢,我不屬於MyFun()函式的了

 

4. 請問這個函式有多少個引數?

def MyFun((x, y), (a, b)):
    return x * y - a * b

答:如果你回答兩個,那麼恭喜你錯啦,答案是0,因為類似於這樣的寫法是錯誤的!

我們分析下,函式的引數需要的是變數,而這裡你試圖用“元祖”的形式來傳遞是不可行的。
     
我想你如果這麼寫,你應該是要表達這麼個意思:

>>> def MyFun(x, y):
        return x[0] * x[1] - y[0] * y[1]

>>> MyFun((3, 4), (1, 2))
10

 

5. 請問呼叫以下這個函式會列印什麼內容?

>>> def hello():
        print('Hello World!')
        return
        print('Welcome To FishC.com!')

 答:會列印:

>>> hello()
Hello World!

因為當Python執行到return語句的時候,Python認為函式到此結束,需要返回了(儘管沒有任何返回值)。


動動手: 


0. 編寫一個函式power()模擬內建函式pow(),即power(x, y)為計算並返回x的y次冪的值。

解:

def power(x, y):
    result = 1
    
    for i in range(y):
        result *= x

    return result

print(power(2, 3))

 

1. 編寫一個函式,利用歐幾里得演算法(腦補連結)求最大公約數,例如gcd(x, y)返回值為引數x和引數y的最大公約數。

解:

def gcd(x, y):
    while y:
        t = x % y
        x = y
        y = t

    return x
    
print(gcd(4, 6))

 

2. 編寫一個將十進位制轉換為二進位制的函式,要求採用“除2取餘”(腦補連結)的方式,結果與呼叫bin()一樣返回字串形式。

解:

def Dec2Bin(dec):
    temp = []
    result = ''
    
    while dec:
        quo = dec % 2
        dec = dec // 2
        temp.append(quo)

    while temp:
        result += str(temp.pop())
    
    return result

print(Dec2Bin(62))

 

相關文章