函数
def
def用来创建函数,其中标题行由def关键字,函数名和参数组成,def子句剩余部分包括一个可选的文档子串和必需的函数体。
def func_name(args):
"function document"
func_body
装饰器
装饰器指函数,它们接受函数对象,具体还是看例子吧,简单明了
@decoTwo
@decoOne
def func(args1,...):
pass
#上面等价于def func(args1,...):pass
#func = decoTwo(decoOne(func))
#以下是带参数的
@deco(args) # deco()用args做了操作并返回函数对象,返回的函数对象以func作为其参数的装饰器
def func():
pass
#等价func=deco(args)(func)
参数
python支持默认参数与可变长参数,其中可变长的参数元祖要在位置和默认参数之后,带元组的函数用法如下:
def func([args,] *args_tuple):
func_body
星号操作符之后的形参作为元组传递给函数,元组保存了所有传递给函数的额外参数,如果没有则元祖为空。在正常情况下如果函数调用与函数定义的参数不匹配会产生TypeError的异常,通过末尾增加一个可变的参数列表可以处理超出数目的参数,这些超出数目的参数会被添加到参数元组,对于不定数目或者额外集合的关键字,参数被放入一个字典中,同时为了区分关键字和非关键字非正式参数,使用了(**)。
>>> def func(arg1,arg2="default",*nc,**nk):
... print("arg1:%s" %(arg1))
... print("arg2:%s" %(arg2))
... for each in nc:
... print("arg3:%s"%(each))
... for key in nk.keys():
... print("arg4:%s:%s" %(key,nk[key]))
...
>>> func("A")
arg1:A
arg2:default
>>> func("A","selfParam")
arg1:A
arg2:selfParam
>>> func("A","selfPram","B","C",name="python",study="yes")
arg1:A
arg2:selfPram
arg3:B
arg3:C
arg4:name:python
arg4:study:yes
函数式编程
lambda:用于创建匿名函数,一个完整的lambda语句代表一个表达式,这个表达式的定义体要和声明放在一行,参数是可选的,如果使用参数,则参数通常是表达式的一部分,lambda主要用于返回可调用的函数对象,这有点类似一个函数的单行版本,起初刚准备下结论与C++的内联类似,但看了书中下一句就发现自己想多了~~,lambda语句的目的是由于性能原因,在调用时绕过函数的栈分配,创建了一个框架对象。
lambda [arg1[,arg2,...argN]]:expression
例:
>>> a=lambda x,y=10:x+y
>>> a(20)
30
>>> a(20,30)
50
>>> b=lambda *z:z
>>> b(23,'adf')
(23, 'adf')
>>> b()
()
>>> b('adsf')
('adsf',)
global
将全局变量的名字声明在一个函数体内的时候,全局变量的名字会被局部变量覆盖,因此为了明确使用一个已命名的全局变量,可以在函数体内用global声明全局变量而无须建立新的局部变量。