|
Size: 255
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: |
| == 小结 == | lambda ========== |
| Line 17: | Line 23: |
| == 练习.进阶导读 == | 闭包 ========== |
| Line 19: | Line 26: |
| = 反馈 = [[PageComment2]] |
装饰器 ========== :: @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)]]