天天看點

學學python(3):函數式程式設計

1.       關鍵字參數

比如你有一個函數定義為functest(name,age),正常的調用方式為functest(‘cary‘,25),我們也可以指定參數來調用,如functest(age=25,name=’cary‘),這樣python的解釋器就可以通過關鍵字來比對參數的值了。

2.       函數裝飾器

2.1.裝飾器實際就是函數,一般裝飾器可以放一些通用功能的代碼來降低程式複雜度,比如日志功能。

@deco

def func():pass

等價于:func=deco(func)

            下面是一個例子,tsdeco是一個顯示何時調用函數的裝飾器。

from time import ctime, sleep

def tsdeco(func):

    def wrappedFunc():

        print '[%s] %s() called' % (

            ctime(), func.__name__)

        return func()

    return wrappedFunc

@tsdeco

def func():

    print "func called"

func()

sleep(4)

結果如下:

[Fri Mar 05 14:23:04 2010] func() called

func called

[Fri Mar 05 14:23:08 2010] func() called

3.       函數作為參數傳遞,下面是一個例子

def convert(func, seq):

         'conv. sequence of numbers to same type'

         return [func(eachNum) for eachNum in seq]

myseq = (123, 45.67, -6.2e8, 999999999L)

print convert(int, myseq)

print convert(long, myseq)

print convert(float, myseq)

4.       可變長度的參數

4.1.在函數的參數清單中使用*号表示将元組作為可變參數傳給函數,如下:

>>> def testfunc(arg1,*args):

...     print "arg1:",arg1

...     for item in args:

...               print item

...              

>>> testfunc('asd')

arg1: asd

>>> testfunc('asd',123,'sd',23)

123

sd

23

4.2. 在函數的參數清單中使用**号表示将字典作為可變參數傳給函數,如下:

>>> def testfunc(arg1,**args):

...     for item in args.keys():

...               print "key:%s,value:%s"%(item,str(args[item]))

...

>>> testfunc(12,c='dictest')

arg1: 12

key:c,value:dictest

5.       匿名函數與lambda

Python允許使用lambda關鍵字創造匿名函數,最簡單的為我們由一個函數

def show():

       return ‘Hello World‘

使用lambda的等價表達式為:

Lambda:‘Hello World‘

我們可以lambda指派給一個引用,如,上面的:

a= Lambda:‘Hello World‘

a()可以調用。

Python提供了apply(),filter(),map(),redule()内建函數,這些函數提供了在python中可以找到的函數式程式設計的特征。Lambda函數可以很好的和使用了這些函數的應用程式結合起來,因為他們都帶了一個可執行的函數對象,lambda表達式提供了迅速創造這些函數的機制。比如下面例子:

>>> map((lambda x:x*5),[0,1,2,3,4,5])

[0, 5, 10, 15, 20, 25]

>>> print 'total:',reduce((lambda x,y:x+2*y),range(5))

total: 20

所做運算為如下:

((((0+2*1)+2*2)+2*3)+2*4)