一、前言
在慕课网完成了廖雪峰老师的《Python入门》与《Python进阶》两门基础课程。在此做一下简单的知识点小结。
二、函数式编程
Python
特点:
不是纯函数式编程(允许变量存在);
支持高阶函数(可以传入函数作为变量);
支持闭包(可以返回函数);
有限度的支持匿名函数;
高阶函数:
变量可以指向函数;
函数的参数可以接收变量;
一个函数可以接收另一个函数作为参数;
def add(x,y,f):
return f(x)+f(y)
#14
add(-5,9,abs)
复制代码
三、内置高阶函数 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
fs.append(f(i))
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'])
复制代码
九、装饰器
给函数添加新功能,并简化该函数调用;
9.1 无参数装饰器
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))
#call factorial()...
#3628800
print factorial(10)
复制代码
9.2 带参数装饰器
def log(prefix):
def log_decorator(f):
def wrapper(*args, **kw):
print '[%s] %s()...' % (prefix, f.__name__)
return f(*args, **kw)
return wrapper
return log_decorator
@log('DEBUG') #DEBUG为给装饰器传入的参数
def test():
pass
#[DEBUG] test()...
#None
print test()
复制代码
利用 functool.wraps 作用在返回的新函数上,使得调用装饰器以后不改变原函数的信息
import time, functools
def performance(unit):
def perf_decorator(f):
@functools.wraps(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 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
复制代码
评论