python的闭包、装饰器和lambda等(笔记)

参考:

http://blog.csdn.net/marty_fu/article/details/7679297(闭包,推荐看这个)
https://foofish.net/python-decorator.html(装饰器,推荐)
http://www.cnblogs.com/tqsummer/archive/2010/12/27/1917927.html(yield)
http://www.cnblogs.com/longdouhzt/archive/2012/05/19/2508844.html(特殊语法,lambda、map等)

1.闭包:

python中的闭包从表现形式上定义(解释)为:如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure)

例子:

In [3]: def f1(x):
   ...:     def f2(y):
   ...:         return x + y
   ...:     return f2
   ...: 

In [4]: func=f1(6)

In [5]: func(9)
Out[5]: 15

在f1内定义了f2,但f2函数引用了f1中的变量x,f1返回了f2的函数名,当对func进行赋值的时候,同时也对x赋值了,func函数调用的是f2的函数,而却能记住x的值

2.装饰器:

装饰器跟闭包的语法类似,差别在于,它必须传递一个函数,而后又在内部函数中对这个函数进行引用(因为装饰器存在的意义就是增强传递过来的函数的功能)

例子:

In [9]: def f1(func):

...: def wrapper():
...: print "now,begin your show: "
...: func()
...: print "the show is over."
...: return wrapper
...:

In [10]: @f1
    ...: def f2():
    ...:     print "haha,i am no 1"
    ...:     

In [11]: f2()
now,begin your show: 
haha,i am no 1
the show  is over.

在这里@f1的效果相当于 f2=f1(f2) ,如果这么做的话,f2要先定义

3.yield

yield用来模拟生成器的工作过程,它会在条件内生成值,遇到下一个yield就停止等待值被取走然后再生成下个值,直到条件不满足(这个我不确定,大概是这个过程,等我查资料再确定)

例子:

In [39]: def g(n):
...:     i=0
...:     while i < n : 
...:         yield i
...:         i+=1
...:         

In [40]: t=g(3)

In [41]: type(t)
Out[41]: generator

In [42]: t.next()
Out[42]: 0

In [43]: t.next()
Out[43]: 1

In [44]: t.next()
Out[44]: 2

In [45]: t.next()
---------------------------------------------------------------------------
StopIteration                             Traceback (most recent call last)
<ipython-input-45-3660e2a3d509> in <module>()
----> 1 t.next()

StopIteration: 

以下都摘抄自:http://www.cnblogs.com/longdouhzt/archive/2012/05/19/2508844.html

lambda表达式返回一个函数对象
例子:

func = lambda x,y:x+y
func相当于下面这个函数
def func(x,y):
        return x+y

注意def是语句而lambda是表达式
下面这种情况下就只能用lambda而不能用def

[(lambda x:x*x)(x) for x in range(1,11)]

map,reduce,filter中的function都可以用lambda表达式来生成!

map(function,sequence)

把sequence中的值当参数逐个传给function,返回一个包含函数执行结果的list。
如果function有两个参数,即map(function,sequence1,sequence2)。

例子:

求11,22,33,44

    map(lambda x:x*x,range(1,5))

返回值是[1,4,9,16]

reduce(function,sequence)
function接收的参数个数只能为2
先把sequence中第一个值和第二个值当参数传给function,再把function的返回值和第三个值当参数传给
function,然后只返回一个结果。

例子:
求1到10的累加

reduce(lambda x,y:x+y,range(1,11))

返回值是55。

filter(function,sequence)
function的返回值只能是True或False
把sequence中的值逐个当参数传给function,如果function(x)的返回值是True,就把x加到filter的返回值里面。一般来说filter的返回值是list,特殊情况如sequence是string或tuple,则返回值按照sequence的类型。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章