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

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