iT邦幫忙

2019 iT 邦幫忙鐵人賽

DAY 14
0

昨天都沒有好好講講函式參數的部分,所以今天就比較專注在這方面上囉~

參數

函式定義時的參數稱為「形式參數(parameter、formal argument)」,函式呼叫時的參數稱為「實際參數(argument、actual argument)」。實際參數是呼叫時從外界真正傳入的物件,形式參數則是定義時指定的名稱,定義時尚未指向某物件,呼叫時才會進行綁定動作、指向傳入的物件,此時在涵式內才能以形式參數的名稱來存取。所以呼叫會建立形式參數與實際參數之見的綁定關係,這動作就如同指派述句,把某物件指派給某名稱,如以下例子說明(在此會多做參數的註解):

def num(x,y):            #定義函式,x,y為形式參數
    return x**2+y**2

>>>num(1,2)              #呼叫函式,傳入字面值建立物件
5
>>>a,b = 3,4
>>>num(a+b,a-b)          #呼叫函式,傳入運算式
50
>>>l = [0,1,2]
>>>num(len(li),sum(range(3)))  #函式呼叫也是運算式,也可當實際參數
18

那麼有個問題點是,你在呼叫時多給參數或少給參數,均會呼叫失敗,如下所示:

def Area(width,height):    
    a = width*height
    return a

>>> Area(1,2,3)
Traceback (most recent call last):
  File "<pyshell#10>", line 1, in <module>
    Area(1,2,3)
TypeError: Area() takes 2 positional arguments but 3 were given     #說明多個參數的錯誤訊息
>>> Area(1)
Traceback (most recent call last):
  File "<pyshell#11>", line 1, in <module>
    Area(1)
TypeError: Area() missing 1 required positional argument: 'height'  #說明少個參數的錯誤訊息

所以有一種特殊情況是,Python允許在定義函式時提供預設值,即在函式定義時使用。格式為def 函式名稱(參數1, 參數2=值...),我們拿之前印星星的例子來看看:

def star(s=3):         #預設3
    for n in range(s):
        for m in range(n+1):
            print('*',end='')
        print()
        
>>> star()            #輸出預設值
*
**
***
>>> star(5)
*
**
***
****
*****

此外,除了上述提的位置參數外,還有一種是關鍵字參數,也就是在呼叫時明確寫上形式參數的名稱。通常是在參數很多個的時候,避免設計者混淆,例如:

def color(red, green, blue, alpha = 1.0):     #alpha來代表透明度,1.0為完全不透明
    pass
    
>>> color(red=0, green=0.5, blue=0.4)         #alpha使用預設值1.0
>>> color(red=0, green=0.5, blue=0.4, alpha = 0.5)   #為半透明
>>> color(0, 0.5,0.4, 0.5)                    #若用位置參數確實很難分辨哪個顏色
>>> color(blue=4, green=9, red=6)             #位置換掉,但名稱仍有對應也是可以的
>>> color(9, red=6, blue=4)                   #其中有少的話就會錯誤喔
Traceback (most recent call last):
  File "<pyshell#16>", line 1, in <module>
    color(9, red=6, blue=4)
TypeError: color() got multiple values for argument 'red'

最後一個要提的是不定數目的參數函式,如果想要有很多參數進行運算,Python函式建立接受沒有預先設定的參數個數,方法是在參數名稱前加星號就行了,語法為:

def 函式名稱(*參數):
    ...
    
def func(*arg):
    ...

實際例子

def calsum(*params):
    total = 0
    for p in params:
        total += p
    return total
    
print('3個參數總和:%d'%calsum(4,5,9))
print('4個參數總和:%d'%calsum(4,5,9,15))   

補充

弱弱的補一下,有預設值的參數必須放在一般參數後面,因為呼叫傳入資料時,都會先給一般參數值,再依照先後順序分配,預設值就是拿來補足空缺的拉~那如果程式內有兩個相同名稱的函式,後面建立的函式則會覆蓋掉前面得喔!

參考資料

  • 書名-Python程式設計入門 /葉難-編著
  • 書名-Python初學特訓班 /文淵閣工作室-編著
  • 書名-大數據起步從Python開始 /吳萍-編著
  • 書名-輕鬆學Python3 /孫宏明-編著

上一篇
Day13-函式
下一篇
Day15-函式間的資料聯繫
系列文
Python 30天學習日誌30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言