python 函式式程式設計 高階函式 裝飾器

2022-08-10 20:54:16 字數 3382 閱讀 6298

# -*- 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...