启动篇主要讲述函数、模块、面向对象、类、继承、定制类几项知识
1、函数式编程
map()是 Python 内置的高阶函数,它接收一个函数 f 和一个 list,并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回。注意:map()函数不改变原有的 list,而是返回一个新的 list。利用map()函数,可以把一个 list 转换为另一个 list,只需要传入转换函数。
reduce()函数也是Python内置的一个高阶函数。reduce()函数接收的参数和 map()类似,一个函数 f,一个list,但行为和 map()不同,reduce()传入的函数 f 必须接收两个参数,reduce()对list的每个元素反复调用函数f,并返回最终结果值。reduce()还可以接收第3个可选参数,作为计算的初始值
filter()函数是 Python 内置的另一个有用的高阶函数,filter()函数接收一个函数 f 和一个list,这个函数 f 的作用是对每个元素进行判断,返回 True或 False,filter()根据判断结果自动过滤掉不符合条件的元素,返回由符合条件元素组成的新list。
s.strip(rm) 删除 s 字符串中开头、结尾处的 rm 序列的字符。
当rm为空时,默认删除空白符(包括'\n', '\r', '\t', ' ')
sorted()也是一个高阶函数,它可以接收一个比较函数来实现自定义排序,比较函数的定义是,传入两个待比较的元素 x, y,如果 x 应该排在 y 的前面,返回 -1,如果 x 应该排在 y 的后面,返回 1。如果 x 和 y 相等,返回 0。
2、闭包
闭包的特点是返回的函数还引用了外层函数的局部变量,所以,要正确使用闭包,就要确保引用的局部变量在函数返回后不能变
当内嵌函数体内引用到体外的变量时,将会把定义时涉及到的引用环境和函数体打包成一个整体(闭包)返回
用途1,当闭包执行完后,仍然能够保持住当前的运行环境。
用途2,闭包可以根据外部作用域的局部变量来得到不同的结果,这有点像一种类似配置功能的作用,我们可以修改外部的变量,闭包根据这个变量展现出不同的功能。
3、匿名函数
关键字lambda 表示匿名函数,冒号前面的 x 表示函数参数。
匿名函数有个限制,就是只能有一个表达式,不写return,返回值就是该表达式的结果。
举栗子: sorted([1, 3, 9, 5, 0], lambda x,y: -cmp(x,y)) [9, 5, 3, 1, 0]
4、装饰器:
实现了为函数动态增加功能,却又不改变本身函数代码;使用高阶函数,通过传入一个函数,并返回需要装饰的函数,从而实现为基础函数增强功能。装饰器可以极大的简化代码,避免每个函数编写重复性代码。
无参数装饰器:定义一个@log,功能是在函数调用时打印函数名,并执行f函数,这里可以看到定义的其实是一个闭包
def log(f): def fn(*args, **kw): print 'call ' + f.__name__ + '()...' return f(*args, **kw) return fn
使用
f1 = log(f1)
print f1()
python对装饰器的支持性,可使用@log进行对函数封装
@log def add(x, y): return x + y print add(1, 2)
由于add函数被装饰,在调用add函数时会先答应call add()日志后,执行add函数
有参数装饰器:定义一个@log,在真实应用中,装饰器不仅仅需要传入函数地址,可能也需要其他的参数
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') def test(): pass print test()
我们可以看下,有参和无参的差别,def log的里层部分与无参装饰器一致,如果需要加参则再次封装一层函数
完善装饰器:
def log(f): def wrapper(*args, **kw): print 'call...' return f(*args, **kw) return wrapper @log def f2(x): pass print f2.__name__ 输出: wrapper
可以看到f2的函数名被装饰器改变为@log内部定义的'wrapper',如果想保留被装饰函数的所有属性,可通过functools函数自动化复制,在函数被装饰下面增加functools.wraps来保留原有属性
import functools def log(f): @functools.wraps(f) def wrapper(*args, **kw): print 'call...' return f(*args, **kw) return wrapper
5、偏函数
functools.partial可以把一个参数多的函数变成一个参数少的新函数,少的参数需要在创建时指定默认值,这样,新函数调用的难度就降低了
int2 = functools.partial(int, base=2)