函式式程式設計:允許把函式本身作為引數傳入另乙個函式,還允許返回乙個函式!
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 而且 演算的函式可以接受函式當...