python 闭包和装饰器详解_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)

in ()

----> 1 t.next()

StopIteration:

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的类型。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值