python學習筆記之(五)

2021-06-20 19:47:14 字數 3856 閱讀 5759

高階函式

高階函式(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 ...