python 函式式程式設計

2022-09-02 04:18:10 字數 4365 閱讀 4040

1高階函式

1.1 變數可以指向函式,可以把乙個函式賦值給變數

如下**

>>> f = abs

>>> f(10)

10

1.2 變數可以指向函式,函式的形參也能夠接收函式,這就是高階函式

>>> def add(x, y, f):

...     return f(x) + f(y)

...

>>> add(-5, -5, abs)

10

2 map

map()函式接收兩個引數,乙個是函式,乙個是序列,map將傳入的函式依次作用到序列的每個元素,並把結果作為新的list返回。

例項**如下:

>>> def f(x):

...     return x*x

...

>>> map(f, [1, 2, 3, 4])

[1, 4, 9, 16]

>>>

裝換為字元

>>> map(str, [1, 2, 3])

['1', '2', '3']

2.1 reduce

reduce把乙個函式作用在乙個序列[x1, x2, x3...]上,這個函式必須接收兩個引數,reduce把結果繼續和序列的下乙個元素做累加計算,reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)

如下例項將12345序列裝換為12345數字

>>> def fn(x, y):

...     return x * 10 + y

...

>>> reduce(fn,  [1, 2, 3, 4, 5])

12345

3 filter

和map不同的是,filter呼叫的函式返回true才會保留,否則刪除。如下示例可以刪除乙個list中的空格

>>> def not_empty(s):

...     return s and s.strip() //刪除s中的空格

...

>>> filter(not_empty, ['a', '', 'b', none, 'c', ''])

['a', 'b', 'c']

4 sorted 可以對序列進行排序,通常規定,對於兩個元素x和y,如果認為x < y,則返回-1,如果認為x == y,則返回0,如果認為x > y,則返回1。如下示例演示了從小到大的排序

>>> sorted([36, 5, 12, 9, 21])

[5, 9, 12, 21, 36]

5 閉包

>>> def lazy_sum(*args):

...     def sum():

...             ax = 0

...             for n in args:

...                     ax = ax + n

...             return ax

...     return sum

...

>>> f = lazy_sum(1, 3, 5, 7, 9)

>>> f

>>> f()

25

>>>

可以看到,呼叫lazy_sum 返回的是乙個sum函式,在此呼叫f()可以計算出求和結果

在這個例子中,我們在函式lazy_sum中又定義了函式sum,並且,內部函式sum可以引用外部函式lazy_sum的引數和區域性變數,當lazy_sum返回函式sum時,相關引數和變數都儲存在返回的函式f()中,這種稱為「閉包(closure)」的程式結構擁有極大的威力。每次呼叫閉包函式時,即使形參相同,返回的函式都是乙個不同的函式。

6 匿名函式

>>> map(lambda x: x * x, [1,2, 3, 4, 5, 6, 7, 8, 9])

[1, 4, 9, 16, 25, 36, 49, 64, 81]

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

可以將乙個匿名函式賦值給變數:如下所示

>>> f = lambda x: x * x

>>> f(5)

25

7 裝飾器

每乙個函式物件都有乙個__name__屬性

如下示例:

>>> now.__name__

'now'

>>> f.__name__

'now'

現在,假設我們要增強now()函式的功能,比如,在函式呼叫前後自動列印日誌,但又不希望修改now()函式的定義,這種在**執行期間動態增加功能的方式,稱之為「裝飾器」(decorator)。

本質上,decorator就是乙個返回函式的高階函式。所以,我們要定義乙個能列印日誌的decorator,可以定義如下:

#!/usr/bin/env python

# -*- coding: utf8 -*-

def log(func):

print 'call %s():' % func.__name__

return func(*args, **kw)

@log

def now():

print 'hello world'

if __name__ == '__main__':

now()

通過@符號為now()函式內建乙個裝飾器,呼叫now()函式時會自動生成日誌

函式式程式語言python 函式式程式設計

函式是python內建支援的一種封裝,我們通過把大段 拆成函式,通過一層一層的函式呼叫,就可以把複雜任務分解成簡單的任務,這種分解可以稱之為面向過程的程式設計。函式就是面向過程的程式設計的基本單元。而函式式程式設計 請注意多了乙個 式 字 functional programming,雖然也可以歸結...

Python函式式程式設計

python函式式程式設計的核心思想是 把函式當資料.所以,函式可以用作函式引數,函式返回值,元組或字典成員等 閉包閉包是實現 復用的一種途徑,與類不同的是它基於函式實現.函式與它的環境變數一起就構成了閉包,閉包只有乙個返回值,那就是閉包中的函式 def line conf a,b def line...

python函式式程式設計

一 lambda 主要用來自定義行內函式 二 map 首先定義乙個函式,再用map 命令將函式逐一應用到map列表中的每個元素,最後返回乙個陣列 例如 map lambda x,y x y,a,b 表明將a,b兩個列表的元素對應相乘,把結果返回到新列表。三 reduce 用於遞迴運算 例如 redu...