函式式程式設計python python的函式式程式設計

2021-10-11 02:19:00 字數 3120 閱讀 9927

函式式程式設計:允許把函式本身作為引數傳入另乙個函式,還允許返回乙個函式!

1.高階函式

乙個函式可以接收另乙個函式作為引數,這種函式稱之為高階函式

abs(-10) 是函式呼叫 abs是函式本身 abs函式名其實是乙個變數名

變數可以指向函式,函式名也是變數名

map()

map(func,seq)函式接收兩個引數,乙個是函式,乙個是iterable(可迭代物件,序列),map將傳入的函式func()依次作用到序列seq的每個元素,並把結果作為新的iterator(迭代器)返回,之後可轉為lis或其他型別t輸出。

複製**

1 #!/usr/bin/python3

3 def f(x):

4 return x*x

6 r = map(f, [ 1, 2, 3, 4, 5, 6 ])

7 print(list(r))

8 #由於結果r是iterator(惰性序列),因此通過list()函式計算整個序列

複製**

reduce()

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

意即一次取序列兩個元素放到函式,函式結果和下乙個函式結果(取下兩個元素放到函式得到的函式結果)相加,依次類推。

複製**

1 #!/usr/bin/python3

2 from functools import reduce

4 def f(x,y):

5 return x+y

7 r = reduce(f, [ 1, 2, 3, 4, 5, 6 ])

8 print(r)

複製**

filter()

filter(func,seq)函式用於過濾序列,呼叫乙個布林函式func()來迭代遍歷每個seq中的元素,返回乙個使func返回值為true的元素的序列

和map()類似,filter()也接收乙個函式和乙個序列。和map()不同的是,filter()把傳入的函式依次作用於每個元素,然後根據返回值是true還是false決定保留還是丟棄該元素。

篩選回文 回數是指從左向右讀和從右向左讀都是一樣的數

1 #!/usr/bin/python3

3 def is_palindrone(n):

4 return str(n) == str(n)[::-1] #[::-1]是倒切 從右往左

6 print( list( filter( is_palindrone, range(11,200) ) ) )

sorted()

排序的核心是比較兩個元素的大小。如果是數字,我們可以直接比較,但如果是字串或者兩個dict呢?直接比較數學上的大小是沒有意義的,因此,比較的過程必須通過函式抽象出來。

sorted(seq,key=func)函式也是乙個高階函式,它可以接收乙個key函式來實現自定義的排序,例如按絕對值大小排序

不是同一種型別資料相比較,key決定比較大小的標準:

匿名函式與lambda

lambda表示式返回可呼叫的函式物件

1 def add(x,y):return x+y

2 sum1 = add(2,3)

3 #等價於

4 add = lambda x,y:x+y

5 add(2,3)

python簡單的句法限制了lambda函式的定義體只能使用純表示式。即不能賦值,也不能使用while和try等python語句

除了作為引數傳給高階函式之外,python很少使用匿名函式

2.返回函式

把函式作為結果返回

複製**

1 #!/usr/bin/python3

3 def lazy_sum(*args):

4 def sum():

5 #閉包 sum可以引用外部函式lazy_sum的引數和區域性變數

6 ax = 0

7 for n in args:

8 ax = ax+n

9 return ax

10 return sum

12 f = lazy_sum(1, 3, 5, 7, 9) #不需要立即求和,而是在後面的**中根據需要計算

13 #返回的函式並沒有立刻執行,而是直到呼叫了f()才執行

14 print(f())

複製**

返回值與函式型別

返回的物件數目    python實際返回的物件型別

0            none

1            object

>1            tuple

3.裝飾器

不修改原函式的定義,在**執行期間動態增加功能的方式(如在呼叫前後自動列印日誌,但又不修改函式的定義),稱之為「裝飾器」(decorator),裝飾器就是函式,借助@呼叫。

複製**

1 #!/usr/bin/python3

3 def log(func):

4 def printinfo(arge, **kw): #不定長引數 **關鍵字引數

5 print('call %s()' % func.name) #在呼叫func之前列印一些資訊

6 return func(*arge, **kw)

7 return printinfo

9 #log是乙個裝飾器,接收函式返回函式,借助@語法把裝飾器置於函式的定義外

10 @log #相當於執行了 now = log(now)

11 def now():

12 print('2019-4-20')

14 #現在同名now()指向了新的函式,呼叫now()返log()中的printinfo()函式

15 print(now())

複製**

4.偏函式

當函式引數過多,需簡化時,使用 functools.partial() 可以建立乙個新的函式,這個函式可以固定住原函式的部分引數

1 #!/usr/bin/python3

2 import functools

4 int2 = functools.partial(int, base = 2)

5 print(int2('1000000')) #現在只需傳乙個序列, 不需傳指定的進製

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

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

函式式程式設計

最近在看一些關於js方面的東東,除了些ajax的基本應用,還了解了些函式式程式設計 fp 的東東。雖然以前也玩過幾天lisp的,不過因為當時完全對fp的東西沒有概念,壓根就不知道原來這是list那一族最大的特性之一 另外我知道的還有個是gc,orz.光注意那些詭異的 表 去了。總結一下,傳統上認為f...

函式式程式設計

維基百科 函式式程式設計 英語 functional programming 或者函式程式設計,又稱泛函程式設計,是一種程式設計范型,它將計算機運算視為數學上的函式計算,並且避免使用程式狀態以及易變物件。函式程式語言最重要的基礎是 演算 lambda calculus 而且 演算的函式可以接受函式當...