Python可以這樣玩(6):函數設計與使用
恭喜你,上完這一課之後,你就學會了 Python 的基礎程式設計技巧,如果你有把每一個習題做完,那麼你就可以告訴別人說你會 Python 了。當然,Python 的範圍非常廣,在我的玩 Python 的系列中,我會把好玩的東西帶出來,之後,才會有個別深入的探討。
基本語法
預設值參數
可變長度參數
Lambda 運算式
函數的概念來自於數學,當然,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 之中。
自行存檔
留言
張貼留言