新手学Python 第十一篇 函数(一)

内部/内嵌函数
在函数体内创建另外一个函数,这种函数叫做内部/内嵌函数。
如:
def foo():
    def bar():
        print 'bar() called'
    print 'foo() called'
    bar()
内部函数的整个函数体都在外部函数的作用域内。如果没有任何对
bar()的外部引用,那么除了在函数体内,任何地方都不能对其进行
调用


函数与装饰器
装饰器背后的主要动机源自python面向对象编程。装饰器是在函数
调用之上的修饰。这些修饰仅是当声明一个函数或者方法的时候,才
会应用的额外调用。


装饰器的语法以@开头,接着是装饰器函数的名字和可选的参数。
紧跟着装饰器声明的是被修饰的函数,和装饰函数的可选参数。如:
@decorator(dec_opt_args)
def func2Bdecorated(func_opt_args):
:
使用装饰器声明类的静态方法
class MyClass(object):
@staticmethod
def staticFoo():
:     
装饰器可以如函数调用一样"堆叠"起来,如:
@deco2
@deco1
def func(...):pass
带参装饰器和无参数装饰器,
@deco
def foo: pass 可写为
foo = deco(foo)


@decomaker(deco_args)
def foo:pass   可写为
foo = decomaker(deco_args)(foo)


装饰器实际上就是函数,接受函数对象作为参数,可以用装饰器
引入日志、增加计时逻辑来检测性能、给函数加入事务的能力


显示何时调用函数的函数装饰器:


from time import ctime,sleep
def tsfunc(func):
    def wrappedFunc():
        print '[%s]%s()called'%(ctime(),func.__name__)
        return func()
    return wrappedFunc()
@tsfunc
def foo():
    pass


foo()
sleep(4)
for i in range(2):
    sleep(1)
    foo() 


其中的foo()调用的首先是tsfunc(foo),因为foo = tsfunc(foo)
在tsfunc中执行的是wrappedFunc()---> 打印时间--> 执行foo
--> 层层返回


从上面也可看出Python中函数的一个特点:可以作为参数传递到
另一个函数中。此处形参与实参的函数的参数列表要精确的配合


非关键字可变长参数(元组)
def function_name([formal_args,]*vargs_tuple):
    "function_documentation_string"
    function_body_suite
星号操作符之后的形参将作为元组传递给函数,元组保存了所有传递
给函数的未匹配的参数,元组也可以为空。所有的形式参数必须先于
非正式的参数之前出现。
例如:
def tupleVarArgs(arg1,arg2='defaultB',*theRest):
    'display regular args and non-keyword variable args'
    print 'formal arg 1:',arg1 
    print 'formal arg 2:',arg2 
    for eachXtrArg in the Rest:
        print 'another arg:',eachXtrArg


关键字变量参数
使用了变量参数字典来应对额外关键字参数的函数定义的语法:
def function_name([formal_args,][*vargst,]**vargsd):
    function_documentation_string function_body_suite


为了区分关键字参数和非关键字参数,使用了双星号。**是被重载了
不会和幂运算发生混淆。关键字参数必须放在函数参数表的末尾。
如:
def dictVarArgs(arg1,arg2='default',**theRest):
    'display 2 regular args and keyword variable args'
    print 'formal arg1:',arg1
    print 'formal arg2:',arg2
    for eachXtrArg in theRest.key():
        print 'Xtra_arg %s:%s%(eachXtrArg,str(theRest[eachXtrArg]))
   
关键字和非关键字可变长参数都有可能用在同意函数中,只要关键字字典
是最后一个参数并且非关键字元组先于它之前出现。
def newfoo(arg1,arg2,*nkw,**kw):
    'display regular args and all variable args'
    for eachNKW in nkw:
        print 'additional non-keyword arg:',eachNKW
    for eachKW in kw.keys():
        print "additional keyword arg '%s':%s"%(eachKW,kw[eachKW])
newfoo('wolf',3,'projects',freud = 90,gamble = 96)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值