參考:
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的類型。