1、函式式程式設計:
python特點:不是純函式式程式設計(允許變數存在);
支援高階函式(可以傳入函式作為變數);
支援閉包(可以返回函式);
有限度的支援匿名函式;
高階函式:變數可以指向函式;
函式的引數可以接收變數;
乙個函式可以接收另乙個函式作為引數;
def add(x,y,f):
return f(x)+f(y)
add(-5,9,abs)
14
內建高階函式map():map函式有兩個引數,乙個是函式,另乙個是列表,返回值為對傳入的列表每乙個元素執行傳入的函式操作得到的列表;
def format_name(s):
return s.title();
print map(format_name, ['adam', 'lisa', 'bart'])
內建高階函式reduce():reduce函式也有兩個引數,乙個是函式,另乙個是列表,返回值為對list的每乙個元素反覆呼叫函式f,得到最終結果,以下函式為連乘;
def prod(x, y):
return x*y;
print reduce(prod, [2, 4, 5, 7, 12])
內建高階函式filter():filter函式接受函式引數f和列表引數lst,f對lst元素進行判斷,返回lst的元素中呼叫f函式結果為true的元素組成的列表(將不滿足f函式條件的元素過濾掉);
import math
def is_sqr(x):
return int(math.sqrt(x))*int(math.sqrt(x))==x
print filter(is_sqr, range(1, 101))
自定義排序函式sorted():sorted函式接受乙個列表lst和乙個函式引數f,f為自定義的比較lst元素大小的函式,返回值為lst中元素按f函式排列的列表;
def cmp_ignore_case(s1, s2):
return cmp(s1.lower(),s2.lower())
print sorted(['bob', 'about', 'zoo', 'credit'], cmp_ignore_case)
返回函式:
def calc_prod(lst):
def prod(x,y):
return x*y;
def g():
return reduce(prod,lst)
return g;
f = calc_prod([1, 2, 3, 4])
print f()
閉包:內層函式使用外層函式的引數,然後返回內層函式;
def count():
fs =
for i in range(1, 4):
def f(j):
def g():
return j*j;
return g
return fs
f1, f2, f3 = count()
print f1(), f2(), f3()
匿名函式:傳入函式引數不需要顯式定義函式,可以用lambda x:statement x為引數,statement為對引數執行的語句;
def is_not_empty(s):
return s and len(s.strip()) > 0
print filter(lambda s:s and len(s.strip())>0, ['test', none, '', 'str', ' ', 'end'])
裝飾器:給函式新增新功能,並簡化該函式呼叫;
無引數裝飾器示例:
def log(f):
def fn(*args, **kw): #*args,**kw保證對任意個數引數都能正常呼叫
print 'call ' + f.__name__ + '()...'
return f(*args, **kw)
return fn
@log #呼叫日誌裝飾器
def factorial(n):
return reduce(lambda x,y: x*y, range(1, n+1))
print factorial(10)
call factorial()...
3628800
帶引數裝飾器示例:
def log(prefix):
def log_decorator(f):
print '[%s] %s()...' % (prefix, f.__name__)
return f(*args, **kw)
return log_decorator
@log('debug')#debug為給裝飾器傳入的引數
def test():
pass
print test()
執行結果
[debug] test()...
none
利用functool.wraps作用在返回的新函式上,使得呼叫裝飾器以後不改變原函式的資訊
import time, functools
def performance(unit):
def perf_decorator(f):
@functools.wraps(f)
t1 = time.time()
r = f(*args, **kw)
t2 = time.time()
t = (t2 - t1) * 1000 if unit=='ms' else (t2 - t1)
print 'call %s() in %f %s' % (f.__name__, t, unit)
return r
return perf_decorator
@performance('ms')
def factorial(n):
return reduce(lambda x,y: x*y, range(1, n+1))
print factorial.__name__
偏函式:
functools.partial(f,f的預設引數) 減少需要提供給f的引數
import functools
int2 = functools.partial(int, base=2)
int2('1000000')
64
python高階學習筆記(一) 高階函式
filter filter 函式接收乙個 函式 f 和乙個list 這個函式 f 的作用是對每個元素進行判斷,返回 true或 false,filter 根據判斷結果自動過濾掉不符合條件的元素,返回由符合條件元素組成的新list。例如,要從乙個list 1,4,6,7,9,12,17 中刪除偶數,保...
Python函式式程式設計(一) 高階函式
首先有乙個高階函式的知識。乙個函式可以接收另乙個函式作為引數,這種函式就稱之為高階函式。def add x,y,f return f x f y 當我們呼叫add 5,6,abs 時,引數x,y和f分別接收 5 6和abs,根據函式定義,我們可以推導計算過程為 等價於 x 5 y 6 f abs f...
scala學習筆記(十一) 高階函式
scala 作為函式式語言,函式自然是頭等公民 乙個接收函式作為引數的函式稱為高階函式 比如定義如下 defvalueatonequarter f double double f 0.25 這個函式接收乙個引數為 double 返回值為 double 的函式作為引數。高階函式還可以是返回乙個函式作為...