高階函式
高階函式(higher-order function)可接受函式作為引數,也可以把函式作為返回值。
map/reduce:
map(): 接受兩個引數, 乙個是函式, 乙個是數列。map將傳入的函式一次作用在數列的每個元素上,將結果作為新的list返回。
>>> def f(x):
return x*x
>>> map(f, [1, 2, 3, 4])
[1, 4, 9, 16]
reduce(): 接受兩個引數,乙個是函式, 乙個是數列。 reduce將本次的函式結果與下乙個數列元素作為函式的引數傳入。因此函式必須有兩個引數。
>>> def add(x, y):
return x+y
>>> reduce(add, [1, 2, 3, 4])
10
使用map/reduce可寫出將str轉換成int的函式:
>>> def str2int(s):
def fn(x,y):
return x*10+y
return reduce(fn, map(int, s))
>>> str2int('4321')
4321
>>>
sort:
內建排序演算法,預設按照從下到大排。
可以定義乙個倒排方法,傳進sored方法中:
>>> def reversed_cmp(x, y):
if x > y:
return -1
if x == y:
return 0
if x < y:
return 1
>>> sorted([36, 5, 46, 4, 23],reversed_cmp)
[46, 36, 23, 5, 4]
使用sort 對字串排序,由於內建函式按照ascii排序,使得小寫z在大寫a前面,改進:
>>> def cmp_ignore_case(s1, s2):
u1 = s1.lower()
u2 = s2.lower()
if u1 < u2:
return -1
if u1 > u2:
return 1
return 0
>>> sorted(['abc', 'resa', 'gdew', 'sgrr'], cmp_ignore_case)
['abc', 'gdew', 'resa', 'sgrr']
簡單介紹匿名函式:
匿名函式lambda,冒號前面是傳入的引數,冒號後面是僅有的乙個表示式,返回值就是該表示式的結果。
>>> map(lambda x: x*x, [1, 2, 3, 4, 5, 6])
[1, 4, 9, 16, 25, 36]
函式作為返回值:
以乙個可變引數求和為例子:
>>> def lazy_sum(*args):
def sum():
ax=0
for n in args:
ax = ax + n
return ax
return sum
>>> f = lazy_sum(1, 2, 3, 4, 5)
>>> f
>>> f()
15
在函式lazy_sum中定義了函式sum,當呼叫lazy_sum時,返回的並不是求和結果,而是求和函式,這稱為「閉包」,想要得到結果時,需呼叫f()
裝飾器 decorator
要增強某函式功能,但又不想修改函式定義,在**執行期間動態增加函式功能的方式就是decorator。
本質上,decorator是乙個返回函式的高階函式。
>>> def log(func):
print 'call %s():' %func.__name__
return func(*args, **kw)
>>> @log
def now():
print '2014-3-10'
>>> now()
call now():
2014-3-10
其中,log是乙個decorator函式,使用@log放在函式定義前,相當於後面呼叫now()時執行語句now = log(now)。
如果decorator本身需要傳引數,那麼就需要再定義乙個返回decorator的高階函式:
>>> def log(text):
def decorator(func):
print '%s %s():' % (text, func.__name__)
return func(*args, **kw)
return decorator
>>> @log('execute')
def now():
print '2014-3-10'
>>> now()
execute now():
2014-3-10
@log('execute')相當於now = log('execute')(now)
但現在的函式名為:
>>> now.__name__
例如:
>>> import functools>>> def log(func):
@functools.wraps(func)
print 'call %s():' %func.__name__
return func(*args, **kw)
偏函式
偏函式是functools模組提供的乙個功能,主要作用於函式呼叫時的引數上面。
之前有說過,為了方便使用,函式可以存在乙個或多個預設引數。在python自帶的的函式的預設引數是已經制定好的,偏函式的使用就可以區域性改變函式的預設值。
如 int() 可以將字串變為整形,但該函式有乙個預設引數base =10 意思是預設字串為10進製
>>> int('1234', base = 8)668
如果有大量的需轉為整形的2進製數,這樣呼叫比較麻煩,這時可以改為:
>>> def int2(x, base = 2):
return int(x, base)
>>> int2('10000')
16
使用偏函式可以簡化為:
>>> import functools
>>> int2 = functools.partial(int, base = 2)
>>> int2('10000')
16
python學習筆記之五 抽象
本文會介紹如何將語句組織成函式,還會詳細介紹引數和作用域的概念,以及遞迴的概念及其在程式中的用途。一.建立函式 函式是可以呼叫,它執行某種行為並且返回乙個值。用def語句即可定義乙個函式 並非所有的函式都會返回一些東西 def fibs num result 0,1 for i in range n...
python學習筆記(五)
python裡的流程控制語句 if expression statements s else statements s identationerror 縮排錯誤,縮排4個空格 true 非空的值 string,tuple,list,set,dict false 0,null,其他空值 需要多次判斷使...
python 學習筆記 (五)
遞迴函式,如果乙個函式在內部呼叫自身本身,這個函式就是遞迴函式。該包下的iterable方法是用來判斷物件是否可以迭代 from collections import iterable 遞迴算階乘 def fact n if n 1 return 1 return n fact n 1 print ...