星期日, 三月 30, 2014

python函数里面的*

1、*args **kwargs 
python中*和**的特殊含义:他们都和函数有关但是在函数调用时和函数声明时却有着不同行为。
一般来说,无论是函数调用还是声明,单个星号表示有元组(或者列表)“出现”,而两个星号表示有字典“出没”
例如:
定义一个函数
def check_web_server(host,post,path):
用 check_web_server('127.0.0.1',8000,'/admin/')即可调用函数。
如果信息在一个三元组怎么办,例如:
host_info=('www.python.org',80,'/')
这时调用会变成:
check_web_server(host_info[0],host_info[1],host_info[2])
这种写法既不可扩展,也不好看,单星号可以解决我们的问题,因为当调用函数时,表达式在计算一个带星号前缀的元组或列表时会将其打开,所以下面的例子和上面的是等价的。
check_web_server(*host_info)
双星号对字典的用法也类似。


2、以@开头的行就是一个“函数装饰器”(function decorator)。装饰器通过“包装”函数来改变他们的行为。
语法:
@deco
def foo():
    pass
deco就是“装饰”了foo函数的装饰器函数。它先把foo函数拿过来,加上额外功能后再重新赋值给foo。@deco的语法和下面的代码是等价的foo=deco(foo)
例如:
def log (func):
    def wrappedFunc():
        print "***%s() called"%func.__name__
        return func()
    return wrappedFunc

@log
def foo():
    print "inside foo()"

现在我们看执行后的情况:
>>>foo()
>>>foo() called
inside foo()
例如:
@decomaker(deco_args)
def foo():
    pass
这与下面的代码是等价的,注意这里的python表达式是如何串联在一起的:
foo=decomaker(deco_args)(foo)

一个Python入门网站:http://www.it168.com/redian/pyth/