python 函式處理

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