Python可以這樣玩(6):函數設計與使用

恭喜你,上完這一課之後,你就學會了 Python 的基礎程式設計技巧,如果你有把每一個習題做完,那麼你就可以告訴別人說你會 Python 了。當然,Python 的範圍非常廣,在我的玩 Python 的系列中,我會把好玩的東西帶出來,之後,才會有個別深入的探討。


函數的概念來自於數學,當然,Python 做的一些變形,基本概念如下:

輸入 à 函數 à 輸出

這是函數的基本架構,對於輸入和輸出,是有彈性的,可以同時有輸入有輸出,可以只有輸入或只有輸出,也可以沒有輸入也沒有輸出,當然,這種函數很奇怪。更厲害的是,不但可以有多個輸入,還可以有多個輸出 (一般我們學的數學函數 y = f(a,b) 不會出現多個輸出,所以一般的程式語言也都沒有支援多個輸出)。

y = f(x)
y = f()
f(x)
y = f(a, b, c)
x, y = f(a, b, c)    

基本語法

當然,程式語言的寫法與數學不同,Python 的函數語法如下:

def 函數名稱([參數列表]):
    函數本體
    [return 變數列表]

我們用一個例子說明,如果我們要算兩場遊戲的平均分數,可以直接在主程式裡面寫 (game1 + game2) / 2,但是,如果這個算是會出現很多次,就可以考慮也成函數 y = average(a, b),如下:

>>> def average(a, b):
    avg = (a + b) / 2
    return avg

>>> game1 = 80
>>> game2 = 90
>>> game_avg = average(game1, game2)
>>> game_avg
85.0
>>> 

Python 跟其他程式語言如 C++Java 最不同的地方,就是可以傳回兩個以上的值,延續上個例子,如果我們想一次傳回兩次遊戲的總分跟平均,只要改寫程式如下:

>>> def sum_avg(a, b):
    sm = a + b
    ag = sm / 2
    return sm, ag

>>> game_sum, game_avg = sum_avg(game1, game2)
>>> game_sum
170
>>> game_avg
85.0
>>>  

預設值參數

重要的事情說三遍,如果我們要寫一個說n遍函數,可以設計如下:

>>> def say(message, times):
    for i in range(times):
         print(message, end = ' ')
    print()
   
>>> say('Hello', 3)
Hello Hello Hello
>>> 

不過,一般來說,我們通常只說一遍,說很多遍屬於特例,因此,我們可以把 times 的預設值設定成1,當只要說一遍的時候,就可以省去 times 這個參數,這樣做更有效率,程式如下:

>>> def say(message, times = 1):
    for i in range(times):
         print(message, end = ' ')
    print()
   
>>> say('特別重要', 5)
特別重要 特別重要 特別重要 特別重要 特別重要
>>> say('您好')
您好
>>>  

可變長度參數

可變長度參數在定義的時候,主要有兩種方式, “*parameter” “**parameter” ,前者用來定義多個參數,放在元組之中,後者是放在字典之中,我們這裡只談第一種。

回顧之前算兩次分數的總和與平均的函數 sum_avg(),其實功能上有很大的限制,當我們玩了三場以上的遊戲的時候,就沒有辦法使用了,因為參數寫死的就只有兩個,如果我們希望不管輸入多少個參數,都可以算出總合與平均的話,就必須利用 *parameter 來傳遞元組,再用 for I in parameter 來個別取出元組中的值,這樣就沒有個數的限制了,範例如下:

def sum_avg(*p):
    s , n = 0, 0
    for i in p:
         s += i
         n += 1
    return s, s/n

>>> x, y= sum_avg(1, 2, 3)
>>> x
6
>>> y
2.0
>>> x, y = sum_avg(2, 4, 6, 8, 10)
>>> x
30
>>> y
6.0
>>> x, y = sum_avg(80, 95, 74, 93)
>>> x
342
>>> y
85.5
>>>  

Lambda 運算式

Python 走的是極簡風,Lambda 就是極簡風的代表,它用來宣告沒有函數名稱的小函數,看下面計算平均的例子便知:

>>> lambda x, y : (x+y)/2
<function <lambda> at 0x0000018E52BE51E0>
>>> g = lambda x, y : (x+y)/2
>>> g(10,20)
15.0

如果是初學程式語言的人,建議使用一般的函數,畢竟 Lambda 的可讀性不高。

習題

一、建立一個函數,計算圓面積

>>> from math import pi
>>> pi
3.141592653589793
>>> _____ CircleArea(r):
    __________ pi * r * r

>>> CircleArea(5)
78.53981633974483
>>> 

二、建立一個函數 circle2(),傳回圓的周長與面積

>>> 
>>> 
>>> 
>>> 
>>> 

三、建立一函數 swap(a, b),將 a, b 交換

>>> 
>>> 
>>> 
>>> 
>>> 

四、建立一函數 my_sort(x, y, .....) 可以接收 n 個參數,將參數按照大小順序排列,用氣泡排序法

>>> 
>>> 
>>> 
>>> 
>>> 
>>> 
>>> 
>>> 
>>> 
>>> 
>>> 

五、將以上的函數包含在主程式 MyFunction.py 之中。

自行存檔

留言

這個網誌中的熱門文章

Python可以這樣玩(16):共陰/共陽七段顯示器

Python可以這樣玩(11):數學繪圖

Python可以這樣玩(15):蜂鳴器與音樂