一、高階函式
將函式作為引數使用的函式。
func(n, funca)
1、map()
map(function, , iterable, …) literable乙個或多個序列
原意就是對映,即把集合或者列表的元素,每乙個元素都按照一定規則進行操作,生成乙個新的列表或者集合
map函式是系統提供的具有對映功能的函式,返回值是乙個迭代物件(iterators迭代器)
示例:利用map()計算乙個序列的的平方根。
>>>def square(x) : # 計算平方數
... return x ** 2
...
>>> map(square, [1,2,3,4,5]) # 計算列表各個元素的平方
[1, 4, 9, 16, 25]
>>> map(lambda x: x ** 2, [1, 2, 3, 4, 5]) # 使用 lambda 匿名函式
[1, 4, 9, 16, 25]
# 提供了兩個列表,對相同位置的列表資料進行相加
>>> map(lambda x, y: x + y, [1, 3, 5, 7, 9], [2, 4, 6, 8, 10])
[3, 7, 11, 15, 19]
2、reduce()
reduce(function, iterable [, initializer])
function – 函式,有兩個引數
iterable – 可迭代物件
initializer – 可選,初始引數
reduce() 函式會對引數序列中元素進行累積。
函式將乙個資料集合(鍊錶,元組等)中的所有資料進行下列操作:用傳給 reduce 中的函式 function(有兩個引數)先對集合中的第 1、2 個元素進行操作,得到的結果再與第三個資料用 function 函式運算,最後得到乙個結果。
>>>import functools
>>>def add(x, y) : # 兩數相加
... return x + y
...
>>> reduce(add, [1,2,3,4,5]) # 計算列表和:1+2+3+4+5
15>>> reduce(lambda x, y: x+y, [1,2,3,4,5]) # 使用 lambda 匿名函式
15
3、filter()
filter(function, iterable)
function – 判斷函式,返回值是布林值。
iterable – 可迭代物件。
過濾函式: 對一組資料進行過濾,符合條件的資料會生成乙個新的列表並返回,返回型別「filter」,可用set()將結果轉為集合進行列印。
-相同:都對列表的每乙個元素逐一進行操作
-不同:
map會生成乙個跟原來資料想對應的新佇列
filter不一定,只要符合條件的才會進入新的資料集合
def iseven(a):
return a % 2 == 0
list = [3,4,56,3,2,3,4556,67,4,4,3,23455,43]
rst = filter(iseven, list)
print(set(rst))
利用filter(),可以完成很多有用的功能,例如,刪除 none 或者空字串:
def is_not_empty(s):
return s and len(s.strip()) > 0
filter(is_not_empty, ['test', none, '', 'str', ' ', 'end'])
結果:['test', 'str', 'end']
4、sorted()
排序演算法函式
a = [234,22312,123,45,43,2,3,66723,34]
al = sorted(a, reverse=true) #對列表進行倒序排列
print(al)
a = [-43,23,45,6,-23,2,-4345]
# 按照絕對值進行排序
# abs是求絕對值的意思
# 即按照絕對值的倒序排列
al = sorted(a, key=abs, reverse=true)
print(al)
sorted(['bob', 'about', 'zoo', 'credit'], key=str.lower) #忽略大小寫排序
['about', 'bob', 'credit', 'zoo']
二、返回函式
高階函式除了可以接受函式作為引數外,還可以把函式作為結果值返回。
def lazy_sum(*args):
def sum():
ax = 0
for n in args:
ax = ax + n
return ax
return sum
當我們呼叫lazy_sum()時,返回的並不是求和結果,而是求和函式:
>>> f = lazy_sum(1, 3, 5, 7, 9)
>>> f
.sum at 0x101c6ed90>
呼叫函式f時,才真正計算求和的結果:
>>> f()
25
返回的函式並沒有立刻執行,而是直到呼叫了f()才執行。我們來看乙個例子:
def count():
fs =
for i in range(1, 4):
def f():
return i*i
return fs
f1, f2, f3 = count()
def count():
def f(j):
def g():
return j*j
return g
fs =
for i in range(1, 4):
return fs
三、裝飾器(decrator)
在不改動函式**的基礎上無限制擴充套件函式功能的一種機制,本質上講,裝飾器是乙個返回函式的高階函式
裝飾器的使用: 使用@語法, 即在每次要擴充套件到函式定義前使用@+函式名
# 任務:
# 對hello函式進行功能擴充套件,每次執行hello萬列印當前時間
import time
# 高階函式,以函式作為引數
def printtime(f):
print("time: ", time.ctime())
return f(*args, **kwargs)
上面**中,內部函式要寫*args, **kwargs引數,代表原傳入引數不變
# 上面定義了裝飾器,使用的時候需要用到@, 此符號是python的語法糖
@printtime
def hello():
print("hello world")
hello()
# 上面對函式的裝飾使用了系統定義的語法糖
# 下面開始手動執行下裝飾器
# 先定義函式
def hello3():
print("我是手動執行的")
hello3()
hello3 = printtime(hello3)
hello3()
f = printtime(hello3)
f()# 作業:
# 解釋下面的執行結果
四、偏函式
def int16(x, base=16):
return int(x, base)
int16("12345")
import functools
#實現上面int16的功能
int16 = functools.partial(int, base=16)
int16("12345")
函式式程式語言python 函式式程式設計
函式是python內建支援的一種封裝,我們通過把大段 拆成函式,通過一層一層的函式呼叫,就可以把複雜任務分解成簡單的任務,這種分解可以稱之為面向過程的程式設計。函式就是面向過程的程式設計的基本單元。而函式式程式設計 請注意多了乙個 式 字 functional programming,雖然也可以歸結...
函式式程式設計
最近在看一些關於js方面的東東,除了些ajax的基本應用,還了解了些函式式程式設計 fp 的東東。雖然以前也玩過幾天lisp的,不過因為當時完全對fp的東西沒有概念,壓根就不知道原來這是list那一族最大的特性之一 另外我知道的還有個是gc,orz.光注意那些詭異的 表 去了。總結一下,傳統上認為f...
函式式程式設計
維基百科 函式式程式設計 英語 functional programming 或者函式程式設計,又稱泛函程式設計,是一種程式設計范型,它將計算機運算視為數學上的函式計算,並且避免使用程式狀態以及易變物件。函式程式語言最重要的基礎是 演算 lambda calculus 而且 演算的函式可以接受函式當...