python 函式處理
當有一段程式碼需要重覆執行時,我們可以將此段程式碼定義成一個函式(function),以利作為後續呼叫使用。
- 函式的定義
我們可以透過def 的方式來定義函式名稱
def <name>(arg1,arg2,.....,argN):
<statements>
若有回傳值,可定義為
def <name>(arg1,arg2,.....,argN):
<statements>
return <vaule1,value2,.....,valueN)
如:
def plusAndMulti(x,y):
intPlus=x+y
intMulti=x*y
print 'x+y=%s'%intPlus
print 'x*y=%s'%intMulti
>>> plusAndMulti(10,20)
x+y=30
x*y=200
>>>
def getPlusResult(x,y):
return x+y
>>> getPlusResult(10,20)
30
def getFirstAndLastElement(lst):
if not len(lst)>0: return None,None
return lst[0],lst[len(lst)-1]
>>> lst=[1,2,3,4,5]
>>> getFirstAndLastElement(lst)
(1, 5)
>>> lst=[5]
>>> getFirstAndLastElement(lst)
(5, 5)
>>> lst=[]
>>> getFirstAndLastElement(lst)
(None, None)
>>> lst=[1,2,3,4,5]
>>> b,c=getFirstAndLastElement(lst)
>>> print b,c
1 5
- 函式預設參數值
在定義函式時,我們可以設定參數的預設值,當呼叫函式時沒有帶入此參數時,系統就會以預設的參數值來替代。
def getPlusResult(x,y=5):
return x+y
>>> getPlusResult(4)
9
注意:當參數是一個複雜的資料結構時(非數字或字串),資料內容可能會因為累積效應而避開了預設值的設定。如:
def appendList(x,y=[]):
y.append(x)
return y
>>> appendList(3)
[3]
>>> appendList(4)
[3, 4]
>>> appendList(5)
[3, 4, 5]
- 使用關鍵字填入參數值
當定義函式需要傳入多個參數值時,除了可以按順序填入參數值以外,也可以使用指定參數名稱來填入參數值,如此就可以不必依照順序了。
def getGreeting(greeting,name='anonymous',postfix='.'):
return '%s, %s%s'%(greeting, name, postfix)
>>> getGreeting('Hello',postfix='?')
'Hello, anonymous?'
>>> getGreeting('Hi','Gina','~')
'Hi, Gina~'
>>> getGreeting(postfix='!',name='Tina',greeting='Yo')
'Yo, Tina!'
注意:在函數定義時,儘可能將沒有預設值的參數排在左側,以便在未指定參數名稱時,系統能對應到正確的參數。
- 不定個數參數
當你在考慮函式時,若無法確定可能帶入參數的個數時,可以在定義函式時使用 '*' 代表不定個數參數來定義函式參數。
def getMultiGreeting(greeting, *name):
multiName=','.join(name)
print '%s'%type(name)
return '%s: %s'%(greeting,multiName)
>>> getMultiGreeting('Hello','eric','Tina','Gina')
<type 'tuple'>
'Hello: eric,Tina,Gina'
>>> getMultiGreeting('Hello','eric','Tina','Gina','Tom','David')
<type 'tuple'>
'Hello: eric,Tina,Gina,Tom,David'
注意:由 '*' 所定義的參數是以tuple型態存在,因此可以把它當tuple來操作它。
- 若使用 '**' 來定義參數,則可以把它當成dict的資料型態操作它。如:
def getUsersNameEmail(name,**options):
print 'StudentName:%s'%name
if options.has_key('age'): print 'Age:%s'%options['age']
if options.has_key('email'): print 'Email:%s'%options['email']
>>> getUsersNameEmail('eric',age=17,email='laaa@hinet.net')
StudentName:eric
Age: 17
Email: laaa@hinet.net