python函数式编程

15.函数式编程

创建函数

def function_name(arguments):
    """function documention_string"""
    function_body_suite

1、声明与定义:

 

2、前向引用

和其他高级语言类似,Python不允许在函数未声明之前对它引用或调用。

3、函数的属性

比如创建两个Py文件,test1.py;test2.py,如下:

test1.py
--------------------------
ST = 'test1'
def bar():
    '''This is bar'''
    print 'ok'
#函数必定有返回值,默认为None
test2.py
--------------------------------------
import test1
print test1.ST
print test1.bar()
#-----------输出
#test1
#ok
#None
#-----------记得过程是返回值None的函数

def foo():
    '''This is foo'''
    print 'foo'

print foo.__doc__   #This is foo
 

4、嵌套函数

>>> def foo():
        def bar():
            print 'bar() is called'
        print 'foo() is called'
        bar()   
>>> foo()
foo() is called
bar() is called
>>> bar()
Traceback (most recent call last):
  File "<pyshell#5>", line 1, in <module>
    bar()
NameError: name 'bar' is not defined

因为bar()的作用域在foo()里面,在外面不能引用bar。

5、传递函数

1、其他变量可做函数的别名,因为对象的引用

所有对象都是通过引用来传递的,函数也不例外,当对一个变量赋值时,实际上是将相同对象的引用赋值给了这个变量。如果对象是函数的话,这个对象的所有别名都是可调用的。

def foo():
    print 'foo'

bar = foo   #函数对象的引用
bar()   #函数对象的调用
#输出foo

注意:foo:函数对象的引用;foo():函数对象的调用

2、函数作为参数传入其他函数来调用

时刻要记住:函数对象、引用与调用的区别,这几个关键字眼。

def foo():
    print 'foo'

def bar(argfunc):
    print 'in bar()'
    argfunc()
    
bar(foo)    #把函数作为参数传入其他函数来调用
#输出:
#in bar()
#foo
局部变量argfunc就相当于函数对象foo的别名

在如下:

#内建函数int()/float()/long()转换、实现函数的传递与调用
def convert(argfunc,seq):
    return [argfunc(obj) for obj in seq]

lis = [123,15.23,-6.2e5,99999999L]
print convert(int, lis) #[123, 15, -620000, 99999999]
print convert(float,lis)#[123.0, 15.23, -620000.0, 99999999.0]
print convert(long, lis)#[123L, 15L, -620000L, 99999999L]
 
6、Formal Arguments

1、位置参数

以函数定义的准确顺序来传递,如果没有任何默认参数的下,传入参数个数也要一致。

常见错误如下:

takes no arguments (1 given)

takes exactly 2 arguments (1 given)等等

2、默认参数

def foo(arg,default1 = 'Python',default2 = 'Django'):
    pass

每一个默认参数后面都紧跟一个默认值的赋值语句,如果在函数调用时没有给出值,则使用默认的值。

默认参数最好写在最后

3、关键字参数

def foo(arg,obj1='good',obj2=10):
    return arg,obj1,obj2

print foo(arg='Begin')   #('Begin', 'good', 10)
print foo('Begin')       #('Begin', 'good', 10)
print foo('Begin','Python')  #('Begin', 'Python', 10)
#print foo(arg='Begin',100)    #出错
print foo(arg='Begin',obj2=100)  #('Begin', 'good', 100)
print foo(obj2=100,arg='Begin',obj1='Ok')    #('Begin', 'Ok', 100)
 

7、可变长度的参数

1、变长参数与非变长参数

"""在参数名之前使用一个星号,就是让函数接受任意多的位置参数"""
def multiply(*args):
    total = 1
    for arg in args:
        total+=arg
    return total

print multiply()        #1
print multiply(1,2)     #4
print multiply(4,5,6)   #16
"""python在参数名之前使用2个星号来支持任意多的关键字参数"""
def multiply2(**kwargs):
    for key,value in kwargs.items():
        print '%s=>%s' %(key,value)
        
multiply2()
multiply2(name='begin')                  #name=>begin
multiply2(name='begin',age='22',tel=110)
#顺序
def complex_function(a,b=None,*args,**kwarg):
    pass
#测试
def add(a,b,c):
    return a+b+c
 
print add(a=10,b=10,c=10)
args=(2,3)
print add(1,*args)  #6
kwargs={'b':100,'c':200}
print add(100,**kwargs) #400
print add(a=100,**kwargs)   #400
#print add(a=100,*args)      #TypeError: add() got multiple values for keyword argument 'a'
print add(1,2,c=3)  #6
print add(1,2,b=3)  # add() got multiple values for keyword argument 'b'

 

三元表达式
 
为真时的结果 if 判定条件 else 为假时的结果  
if 5>3 else 0

是先输出结果,再判定条件
输出1,如果5大于3,否则输出0

posted @ 2015-10-29 10:43  muzinan110  阅读(220)  评论(0编辑  收藏  举报