Size: 210
Comment:
|
Size: 2200
Comment:
|
Deletions are marked like this. | Additions are marked like this. |
Line 1: | Line 1: |
||'''status'''|| 草稿 || HuangYi || 10%;提纲完成|| | ##language:zh #format rst |
Line 3: | Line 4: |
[[TableOfContents]] | .. contents:: |
Line 5: | Line 6: |
= Python 函数 = | :status: 草稿 ;HuangYi; 10%; |
Line 7: | Line 8: |
== 神奇的星号 == | =================== Python函数 =================== |
Line 9: | Line 12: |
== lambda == | 在介绍 python 函数之前不得不提的一个概念就是 python 的 callable 。 |
Line 11: | Line 14: |
== 闭包 == | 函数定义 ========== |
Line 13: | Line 17: |
== 装饰器 == | 神奇的星号 ============ |
Line 15: | Line 20: |
= 讨论 = [[PageComment2]] |
lambda ========== 闭包 ========== 装饰器 ========== :: @log def test(a, b): pass 其中 ``log`` 就是个别人写好的装饰器,作用就是在调用 ``test`` 的前后分别输出个 ``enter test`` 和 ``exit test`` ,使用符号 ``@`` 来应用这个装饰器。 用最容易理解的方式来说,装饰器其实很简单,我们给您看上面这段代码的另一种写法,就很清楚了: :: def test(a, b): pass test = log(test) 是的,上面两段代码完全等价!实际上在 python2.4 加上 ``@`` 语法之前,大家实际都是用后面这种方法做的。 是不是很简单?但其实也不是那么简单。要从复杂的来讲,它和所谓 AOP 之类的许多概念都扯得上关系。但在 python 中它就是这么简单。 那么这个 ``log`` 应该如何来写呢? 其实有经验的读者从后面这段代码中应该已经能够看出端倪。 ``log`` 无非就是接受一个函数作为参数同时返回一个新函数的函数,说起来像绕口令, 不如看代码: :: def log(func): def wrapper(*args, **kw): print 'enter', func.__name__ func(*args, **kw) print 'exit', func.__name__ wrapper.__name__ = func.__name__ wrapper.__globals__ = func.__globals__ TODO: 好像还有其他的信息需要偷梁换柱,有待查资料。 return wrapper ``log`` 里面定义另一个叫 ``wrapper`` 的嵌套函数,它把所有接受到的参数简单地全部传给 ``func`` ,并在调用前后输出信息。 最后对 ``wrapper`` 的一些属性进行偷梁换柱之后,就将它返回了, 随后它就可以被当做一个如假包换的 ``func`` 来用了。 函数式编程 ============ 小结 ========== 练习 =========== .. macro:: [[PageComment2(nosmiley=1, notify=1)]] |
.. contents:: :status: 草稿 ;HuangYi; 10%; =================== Python函数 =================== 在介绍 python 函数之前不得不提的一个概念就是 python 的 callable 。 函数定义 ========== 神奇的星号 ============ lambda ========== 闭包 ========== 装饰器 ========== :: @log def test(a, b): pass 其中 ``log`` 就是个别人写好的装饰器,作用就是在调用 ``test`` 的前后分别输出个 ``enter test`` 和 ``exit test`` ,使用符号 ``@`` 来应用这个装饰器。 用最容易理解的方式来说,装饰器其实很简单,我们给您看上面这段代码的另一种写法,就很清楚了: :: def test(a, b): pass test = log(test) 是的,上面两段代码完全等价!实际上在 python2.4 加上 ``@`` 语法之前,大家实际都是用后面这种方法做的。 是不是很简单?但其实也不是那么简单。要从复杂的来讲,它和所谓 AOP 之类的许多概念都扯得上关系。但在 python 中它就是这么简单。 那么这个 ``log`` 应该如何来写呢? 其实有经验的读者从后面这段代码中应该已经能够看出端倪。 ``log`` 无非就是接受一个函数作为参数同时返回一个新函数的函数,说起来像绕口令, 不如看代码: :: def log(func): def wrapper(*args, **kw): print 'enter', func.__name__ func(*args, **kw) print 'exit', func.__name__ wrapper.__name__ = func.__name__ wrapper.__globals__ = func.__globals__ TODO: 好像还有其他的信息需要偷梁换柱,有待查资料。 return wrapper ``log`` 里面定义另一个叫 ``wrapper`` 的嵌套函数,它把所有接受到的参数简单地全部传给 ``func`` ,并在调用前后输出信息。 最后对 ``wrapper`` 的一些属性进行偷梁换柱之后,就将它返回了, 随后它就可以被当做一个如假包换的 ``func`` 来用了。 函数式编程 ============ 小结 ========== 练习 =========== .. macro:: [[PageComment2(nosmiley=1, notify=1)]]