1. 程式人生 > >Python之函數式編程

Python之函數式編程

函數式編程 turn 排序 如果 冒泡 range tool 由於 對象

一、高階函數

1.map:

用法:map(函數對象,序列)

作用:將序列內每一個對象作用與函數的參數並生成一個新的序列返回

例子:將列表中的名字首字母大寫 其余字母小寫放入列表中

def OrderName(name):
    g = lambda Newname:Newname[0].upper() + Newname[1:].lower()
    return g(name)

lst = [adam, LISA, barT]
print map(OrderName, lst)

2.reduce:

用法:reduce(函數對象,序列)

作用:reduce把一個函數作用在一個序列[x1, x2, x3...]上,這個函數必須接收兩個參數,reduce把結果繼續和序列的下一個元素做累積計算,其效果就是:

reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)

例子:Python提供的sum()函數可以接受一個list並求和,編寫一個prod()函數,可以接受一個list並利用reduce()求積。

def prod(lst):
    return reduce(lambda x, y: x*y, lst)


lst = [1,2,3,4,5,6]
print prod(lst)

3.filter

用法:filter(函數對象,序列)

作用:filter()把傳入的函數依次作用於每個元素,然後根據返回值是True(保留)還是False

決定保留還是丟棄該元素。相當於一個篩選。

例子:使用filter()篩除 1~100 的素數

def mDel(num):
    if num == 1:
        return True
    for i in range(2, num):
        if num % i == 0:
            return True
    return False


print filter(mDel, range(1, 101))

## 考慮 1 不是 素數 也不是合數 所以應該保留 1 ##

4.sorted

排序也是在程序中經常用到的算法。無論使用冒泡排序還是快速排序,排序的核心是比較兩個元素的大小。如果是數字,我們可以直接比較,但如果是字符串或者兩個dict呢?直接比較數學上的大小是沒有意義的,因此,比較的過程必須通過函數抽象出來。通常規定,對於兩個元素x

y,如果認為x < y,則返回-1,如果認為x == y,則返回0,如果認為x > y,則返回1,這樣,排序算法就不用關心具體的比較過程,而是根據比較結果直接排序。

也可以在 使用 sorted(序列,自定義比較函數) 來擬定自己的規則進行比較並得出比較結果。

例子:不分大小寫比較一組姓名(由於直接比較會導致ASCII碼在後的小寫字母判斷比大寫字母值小)

def myCmp(s1, s2):
    u1 = s1.upper()
    u2 = s2.upper()
    if u1 > u2:
        return 1
    elif u1 == u2:
        return 0
    elif u1 < u2:
        return -1


lst = [bob, about, Zoo, Credit]
print sorted(lst, myCmp)

二、返回函數

高階函數除了可以接受函數作為參數外,還可以把函數作為結果值返回。

def lazy_sum(*args):
    def sum():
        ax = 0
        for n in args:
            ax = ax + n
        return ax
    return sum

調用lazy_sum不會立即返回計算的值,而是返回sum函數對象

>>> f = lazy_sum(1, 3, 5, 7, 9)
>>> f
<function sum at 0x10452f668>

再次調用 f 才會真正返回求和的值

>>> f()
25

在這個例子中,我們在函數lazy_sum中又定義了函數sum,並且,內部函數sum可以引用外部函數lazy_sum的參數和局部變量,當lazy_sum返回函數sum時,相關參數和變量都保存在返回的函數中,這種稱為“閉包(Closure)”的程序結構擁有極大的威力。

返回閉包時牢記的一點就是:返回函數不要引用任何循環變量,或者後續會發生變化的變量。

三、匿名函數

匿名函數lambda x: x * x實際上就是:

def f(x):
    return x * x

關鍵字lambda表示匿名函數,冒號前面的x表示函數參數。

匿名函數有個限制,就是只能有一個表達式,不用寫return,返回值就是該表達式的結果。

四、裝飾器

https://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/001386819879946007bbf6ad052463ab18034f0254bf355000

五、偏函數

使用functools裏的partial建立偏函數

>>> import functools
>>> int2 = functools.partial(int, base=2)
>>> int2(1000000)
64
>>> int2(1010101)
85

functools.partial的作用就是,把一個函數的某些參數給固定住(也就是設置默認值),返回一個新的函數,調用這個新函數會更簡單。

Python之函數式編程