参考:
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的类型。
原文地址:http://blog.51cto.com/linzb/2089324