# -*- coding:gb2312 -*-#coding=utf-8
# 高階函式
import math
def is_sqr(x):
y = int(math.sqrt(x))
return x == y*y
print filter(is_sqr, range(1, 101))
# 返回函式
# 作用:延遲執行
def calc_prod(lst):
def lazy_prod():
def f(x,y):
return x*y
return reduce(f, lst)
return lazy_prod
f = calc_prod([1, 2, 3, 4])
print f()
# 匿名函式
print filter(lambda s: s and len(s.strip()) > 0, ['test', none, '', 'str', ' ', 'end'])
# 裝飾器 @decorator
print "....裝飾器...."
def log(f):
# 寫法一
# def fn(x):
# print 'call ' + f.__name__ + '()...'
# return f(x)
# return fn
# 寫法二
print 'call ' + f.__name__ + '()...'
return f
@log
def factorial(n):
return reduce(lambda x,y: x*y, range(1, n+1))
print factorial(10)
# 無引數裝飾器
print "....無引數裝飾器...."
import time
# 寫法一,接收乙個函式返回乙個新函式,但是返回的新函式必須符合原函式的呼叫規則,即引數應該一致。
# 如,log()是無參函式,則呼叫就不能傳遞引數
def performance(f):
def log(x):
print time.time()
return f(x)
return log
# 寫法二,不用函式封裝,直接新增新的操作
def performance2(f):
print time.time()
return f
# 寫法一優化,被裝飾的函式前後可以執行不同的操作,即,返回的新函式可以在任意時候呼叫被裝飾的函式
def performance3(f):
def log(x):
start_time = time.time()
r = f(x) # 在新函式的此處呼叫被裝飾函式,但是,此時被裝飾函式尚未被呼叫,因為log函式尚未被呼叫,只是返回了函式物件
time.sleep(1)
end_time = time.time()
print 'call %s() in %fs' % (f.__name__, (end_time - start_time))
return r
return log
# 寫法二優化,不用函式封裝,直接新增新的操作
def performance4(f):
start_time = time.time()
r = f # 在此處呼叫被裝飾函式
time.sleep(1)
end_time = time.time()
print 'call %s() in %fs' % (f.__name__, (end_time - start_time))
return r
@performance4
def factorial(n):
return reduce(lambda x,y: x*y, range(1, n+1))
print factorial(10)
# 帶引數裝飾器
print "....帶引數裝飾器...."
def performance_parm(unit='s'):
def performance5(f):
def log(x):
start_time = time.time()
r = f(x) # 在新函式的此處呼叫被裝飾函式,但是,此時被裝飾函式尚未被呼叫,因為log函式尚未被呼叫,只是返回了函式物件
time.sleep(1)
end_time = time.time()
print 'call %s() in %fs %s' % (f.__name__, (end_time - start_time), unit)
return r
return log
return performance5
@performance_parm('m')
def factorial(n):
return reduce(lambda x,y: x*y, range(1, n+1))
print factorial(10)
# 完善decorator
print "....完善decorator...."
print factorial.__name__
# => log
# decorator還改變了函式的__doc__等其它屬性。
# 如果要讓呼叫者看不出乙個函式經過了@decorator的「改造」,就需要把原函式的一些屬性複製到新函式中。
# python內建的functools可以用來自動化完成這個「複製」的任務
import functools
def performance5(f):
@functools.wraps(f)
def log(x):
start_time = time.time()
r = f(x) # 在新函式的此處呼叫被裝飾函式,但是,此時被裝飾函式尚未被呼叫,因為log函式尚未被呼叫,只是返回了函式物件
time.sleep(1)
end_time = time.time()
print 'call %s() in %fs %s' % (f.__name__, (end_time - start_time), unit)
return r
return log
@performance5
def factorial(n):
return reduce(lambda x,y: x*y, range(1, n+1))
print "....裝飾器修改後...."
print factorial.__name__
Python 函式式程式設計 高階函式
functional programming,函式式程式設計。python對函式式程式設計提供部分支援。對於純函式程式設計,對任一函式,只要輸入是確定的,輸出就是確定的,可稱之為無 我們知道函式的計算結果可以賦值給變數,例如x abs 5 同理,變數也可以指向函式,例如f abs。如果乙個變數指向了...
Python函式式程式設計 高階函式
高階函式 1.實參是乙個函式名 2.函式的返回值是乙個函式 函式本身也可以賦值給變數,變數也可以指向函式 f abs print f 10 傳遞的引數包括函式名 deffun x,y,f return f x f y print fun 10 23,abs map 函式接收兩個引數,乙個是函式,乙個...
python函式式程式設計 高階函式 偏函式
三大特性 immutable data不可變資料 first class functions函式像變數一樣使用 尾遞迴優化 每次遞迴都重用stack 好處 parallelization並行 lazy evaluation惰性求值 determinism 確定性 函式式程式設計 map reduce...