慕课网视频总结:
(1)高阶函数:就是函数可以作为变量,传给另一个函数使用。如:
import math
def add(x, y, f):
return f(x) + f(y)
print add(25, 9, math.sqrt)
def format_name(s):
x1=s[0]
x2=s[1:]
return x1.upper()+x2.lower()
print map(format_name, ['adam', 'LISA', 'barT'])
def prod(x, y):
return x*y
print reduce(prod, [2, 4, 5, 7, 12])
import math
def is_sqr(x):
r=int(math.sqrt(x))
return r*r==x
print filter(is_sqr, range(1, 101))
def cmp_ignore_case(s1, s2):
if s1.lower()s2.lower():
return 1
return 0
print sorted(['bob', 'about', 'Zoo', 'Credit'], cmp_ignore_case)
def calc_prod(lst):
def prod():
s=1
for x in lst:
s=s*x
return s
return prod
f = calc_prod([1, 2, 3, 4])
print f()
(7)闭包。如(6)所示,内层函数引用了外层函数的局部变量,并且返回内层函数的情况,叫闭包。闭包需要注意的是,引用的局部变量最好在返回内层函数后不要改变,因为这个时候只要内层函数没有使用括号()来调用,他们里面保存的都不是具体的值,而是包含局部变量的计算公式等。所以如果改变了局部变量,那么最终结果会有变化,所以,闭包情况下,for循环里面的i就不使用作为局部变量给内层函数进行计算。因为i最终变成了最后的那个值。
def count():
fs = []
for i in range(1, 4):
def f(j):
def g():
return j*j
return g
r=f(i)
fs.append(r)
return fs
f1, f2, f3 = count()
print f1(), f2(), f3()
def is_not_empty(s):
return s and len(s.strip()) > 0
filter(is_not_empty, ['test', None, '', 'str', ' ', 'END'])
print filter(lambda s:s and len(s.strip())>0, ['test', None, '', 'str', ' ', 'END'])
import time
def performance(f):
def fn(*args,**kw):
t1=time.time()
r=f(*args,**kw)
t2=time.time()
print 'call %s() in %f'%(f.__name__,t2-t1)
return r
return fn
@performance
def factorial(n):
return reduce(lambda x,y: x*y, range(1, n+1))
print factorial(10)
(10)可以传递参数的装饰器,就是再外包一层。
import time
def performance(unit):
def deco(f):
def wrapper(*args,**kw):
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 wrapper
return deco
@performance('ms')
def factorial(n):
return reduce(lambda x,y: x*y, range(1, n+1))
print factorial(10)
import time, functools
def performance(unit):
def deco(f):
@functools.wraps(f)
def wrapper(*args,**kw):
print 'call'
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'%(f.__name__,t)
return r
return wrapper
return deco
@performance('ms')
def factorial(n):
return reduce(lambda x,y: x*y, range(1, n+1))
print factorial.__name__
import functools
sorted_ignore_case = functools.partial(sorted,cmp=lambda s1,s2 : cmp(s1.upper(),s2.upper()))
print sorted_ignore_case(['bob', 'about', 'Zoo', 'Credit'])
函数这一块,最核心的概念是闭包/装饰器。其实说白了就是高阶函数的应用。而高阶函数,其实就是函数套函数的概念。