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
>>>




posted @ 2011-11-08 10:45  jinmengzhe  阅读(683)  评论(0编辑  收藏  举报