python高階一 高階函式

2021-07-03 16:42:21 字數 3390 閱讀 9257

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 的函式作為引數。高階函式還可以是返回乙個函式作為...