zoukankan      html  css  js  c++  java
  • python闭包以及装饰器

    通俗的定义:如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure)。它只不过是个“内层”的函数,由一个名字(变量)来指代,而这个名字(变量)对于“外层”包含它的函数而言,是本地变量;

     1 #示例一:
     2 #!/usr/bin/python 
     3 #encoding=utf-8 
     4 
     5 def add_a(num1):
     6     print "num1:%d" % num1 
     7     def add_b(num2):
     8         print "num2: %d" % num2
     9         return num1 + num2 
    10     return add_b        #返回的是函数名
    11 
    12 v = add_a(100)
    13 
    14 print v 
    15 print v(20)
    16 #执行结果:
    17 root@u163:~/cp163/python# python bibao2.py 
    18 num1:100
    19 <function add_b at 0x7f67482a35f0>
    20 num2: 20
    21 120
    22 
    23 #示例二
    24 #!/usr/bin/python 
    25 #encoding=utf-8
    26 
    27 def  makecounter(name):
    28     count = [0] 
    29     def counter():
    30         count[0] += 1
    31         print "hello",name,':', str(count[0])+" access!"
    32     return  counter
    33 
    34 test = makecounter("world")
    35 print test   #<function counter at 0x7f9d2ece57d0>
    36 test()
    37 test()
    38 test()
    39 
    40 #执行结果:
    41 root@u163:~/cp/python# python close_pkg_demo.py
    42 <function counter at 0x7f102c9497d0>
    43 hello world : 1 access!
    44 hello world : 2 access!
    45 hello world : 3 access!

    装饰器:

    #!/usr/bin/python 
    #encoding=utf-8
    
    """
    def foo():
        print 'in foo()'
    
    # 定义一个计时器,传入一个,并返回另一个附加了计时功能的方法'
    def  timeit(func):
        # 定义一个内嵌的包装函数,给传入的函数加上计时功能的包装
        def  wrapper():
            start = time.clock()
            func()
            end = time.clock()
            print 'used: ', end -start
        #将包装后的函数返回
        return  wrapper
    
    #将源函数修饰之后返回
    foo = timeit(foo)
    foo()
    """
    
    #Python中内置的装饰器有三个: staticmethod、classmethod 和property
    #"""使用语法糖来精简代码
    import time 
    def timeit(func):
        def wrapper():
            start = time.clock()
            func()
            end = time.clock()
            print "used: ", end - start
        return wrapper
    
    @timeit
    def foo():
        print "in foo()"
    
    foo()   #相当于1、先修饰函数(foo = timeit(foo) ), 2、再执行修饰之后的函数 
    #"""
    #执行结果:
    root@u163:~/cp/python# python deco_demo.py 
    in foo()
    used:  7.4e-05
  • 相关阅读:
    路由控制
    NodeJS -Express 4.0 用include取代partial
    工程的结构文件
    Express 框架的安装
    iconfont阿里爸爸做的开源图库
    12.文件系统fs
    11.事件驱动events
    10.Node.js核心模块
    Apache CXF实现Web Service(2)——不借助重量级Web容器和Spring实现一个纯的JAX-RS(RESTful) web service
    Apache CXF实现Web Service(1)——不借助重量级Web容器和Spring实现一个纯的JAX-WS web service
  • 原文地址:https://www.cnblogs.com/chris-cp/p/4755321.html
Copyright © 2011-2022 走看看