python函数式编程
1 callable内建函数判断一个名字是否为一个可调用函数
>>> import math >>> x = 1 >>> y = math.sqrt >>> callable(x) False >>> callable(y) True
2 记录函数(文档字符串)
>>> def square(x): 'calculates the square of number x' return x * x >>> square.func_doc 'calculates the square of number x'
3 形式参数,实际参数,我能改变参数吗--字符串,数字,元组三者跟序列是有区别的
参数存储在局部作用域
4 关键字参数和默认值
>>> def say_hello(greeting = 'hello',name = 'jmz',biaodian = '!!!'): print '%s,%s%s' % (greeting,name,biaodian) #这样去调用都可以 >>> say_hello() hello,jmz!!! >>> say_hello(name = 'yyer',biaodian = '~~~') hello,yyer~~~ >>> say(name = 'yyer',greeting = 'hi,hi') >>> say_hello(name = 'yyer',greeting = 'hi,hi') hi,hi,yyer!!!
5 收集参数
1)将参数收集为元组
例子1:
>>> def print_params(*params): print params >>> print_params('param1') ('param1',) >>> print_params('param1','param2','param3') ('param1', 'param2', 'param3') >>> >>>
例子2:
>>> def print_params_2(title,*params): print title print params >>> print_params_2('title',1,2,3,4,5) title (1, 2, 3, 4, 5)
2)将参数收集为字典:
>>> def print_params_4(x,y,z = 3,*pp,**ppp): print x,y,z print pp print ppp >>> print_params_4(1,2,4,'pp1','pp2','pp3',ppp1 = 'aaa',ppp2 = 'bbb') 1 2 4 ('pp1', 'pp2', 'pp3') {'ppp1': 'aaa', 'ppp2': 'bbb'} >>>
3) 收集参数方式的函数调用
>>> def hello(**params): print params['greeting'],params['name'] >>> params = {'greeting':'Hello','name':'JMZ'} >>> hello(**params) Hello JMZ >>>
6 作用域
1)到底什么是变量,你可以把它看作是值的名字,就像字典一样,键引用值,在执行a = (1,2,3)的时候就把名字引用到元组上。事实上,这已经很接近真实情况,变量和所对应的值是个不可见的字典。
内建的vars()函数可以返回这个字典:
IDLE 2.6.5 ==== No Subprocess ====
>>> vars()
{'__builtins__': <module '__builtin__' (built-in)>, '__file__': '/usr/bin/idle-python2.6', '__package__': None, '__name__': '__main__', 'main': <function main at 0xb6cc1f44>, '__doc__': None}
>>> def printhello():
print 'hello world'
>>> x = 1
>>> a = (1,2,3)
>>> vars()
{'a': (1, 2, 3), 'printhello': <function printhello at 0x9fea6bc>, '__builtins__': <module '__builtin__' (built-in)>, '__file__': '/usr/bin/idle-python2.6', '__package__': None, 'x': 1, '__name__': '__main__', 'main': <function main at 0xb6cc1f44>, '__doc__': None}
>>> vars()['a']
(1, 2, 3)
>>>
2)局部变量与全局变量
在函数内部可以直接引用全局变量,但是要慎重,过多的使用全部变量容易出错。
名字屏蔽问题:
如果函数内部局部变量与外部的全局变量名字一样,这时引用的将是局部变量,可以用globals()函数来获取全局变量的字典,globals()返回全部变量的字典。globals()['var1']即可返回全局变量var1的值
3)嵌套作用域
在python中,可以在函数内部定义函数:
>>> def outFunction(outVar):
a = 2
def inFunction(inVar):
return outVar * inVar * a
return inFunction
>>> inFunc = outFunction(5)
>>> inFunc(4)
40
>>>
在什么地方有用:当需要用一个out函数来创建一个in函数时。
规则:out函数的返回值是一个函数,它返回了in函数这个函数本身。重要的是:返回的函数还可以访问它的定义所在的作用域,即:返回的内层函数带着它的环境+它自身的局部变量。
7 函数式编程---一些有用的函数
1)使用map函数将序列中的元素全部传递给一个函数:
map(function,序列)
2)使用filter函数可以给予一个返回布尔值的函数对元素进行过滤:
>>> def func(x):
return x.isalnum()
>>> seq = ['foo','x41','!***']
>>> filter(func,seq)
['foo', 'x41']
>>>
当然,也可以使用列表推导式:
>>> [x for x in seq if x.isalnum()]
['foo', 'x41']
3)lambda表达式特性创建短小函数:
>>> filter(lambda x:x.isalnum(),seq)
['foo', 'x41']
4)reduce函数
reduce(func,seq)将一个序列的前两个元素与给定的函数联合使用,并且将他们的返回值与第三个元素继续联合和使用,知道整个序列处理完毕:
>>> seq = [1,2,4,6,7,12,23]
>>> reduce(lambda x,y:x + y,seq)
55
>>>