python閉包以及裝飾器

2021-09-22 22:06:36 字數 2242 閱讀 4624

通俗的定義:如果在乙個內部函式裡,對在外部作用域(但不是在全域性作用域)的變數進行引用,那麼內部函式就被認為是閉包(closure)。它只不過是個「內層」的函式,由乙個名字(變數)來指代,而這個名字(變數)對於「外層」包含它的函式而言,是本地變數;

1

#示例一:2#

!/usr/bin/python 3#

encoding=utf-8 45

defadd_a(num1):

6print

"num1:%d

" %num1

7def

add_b(num2):

8print

"num2: %d

" %num2

9return num1 +num2

10return

add_b#返回的是函式名

1112 v = add_a(100)

1314

print

v 15

print v(20)16#

執行結果:

17 root@u163:~/cp163/python#

python bibao2.py

18 num1:100

1920 num2: 20

21 120

2223

#示例二24#

!/usr/bin/python 25#

encoding=utf-8

2627

defmakecounter(name):

28 count =[0]

29def

counter():

30 count[0] += 1

31print

"hello

",name,'

:', str(count[0])+"

access!"32

return

counter

3334 test = makecounter("

world")

35print test #

36test()

37test()

38test()

3940

#執行結果:

41 root@u163:~/cp/python#

python close_pkg_demo.py

4243 hello world : 1access!

44 hello world : 2access!

45 hello world : 3 access!

裝飾器:

#

!/usr/bin/python

#encoding=utf-8

"""def foo():

print 'in foo()'

# 定義乙個計時器,傳入乙個,並返回另乙個附加了計時功能的方法'

def timeit(func):

# 定義乙個內嵌的包裝函式,給傳入的函式加上計時功能的包裝

start = time.clock()

func()

end = time.clock()

print 'used: ', end -start

#將包裝後的函式返回

#將源函式修飾之後返回

foo = timeit(foo)

foo()

"""#

python中內建的裝飾器有三個: staticmethod、classmethod 和property

#"""使用語法糖來精簡**

import

time

deftimeit(func):

def start =time.clock()

func()

end =time.clock()

print

"used:

", end -start

return

@timeit

deffoo():

print

"in foo()

"foo()

#相當於1、先修飾函式(foo = timeit(foo) ), 2、再執行修飾之後的函式

#"""

#執行結果:

root@u163:~/cp/python#

python deco_demo.py

infoo()

used: 7.4e-05

python閉包以及裝飾器

閉包 簡單理解 所謂閉包簡單點說就是定義乙個函式,這個函式裡面還有乙個函式,此時裡面的函式和外面函式中的變數之間就產生了閉包關係。理解 def test num 裡面還有乙個函式 def test inner num inner 這個函式和外面函式的變數num之間就產生了閉包 print num n...

python閉包以及裝飾器

所謂閉包簡單點說就是定義乙個函式,這個函式裡面還有乙個函式,此時裡面的函式和外面函式中的變數之間就產生了閉包關係。定義乙個函式 def test num 裡面還有乙個函式 def test inner num inner 這個函式和外面函式的變數num之間就產生了閉包 print num num i...

Python 裝飾器 ,閉包

1 裝飾器 不改變被裝飾的函式情況下附加一些功能 本質是函式,用於裝飾其他函式,附加一些本身所沒有的功能 實質 是乙個函式 引數 是你要裝飾的函式名 並非函式呼叫 返回 是裝飾完的函式名 也非函式呼叫 作用 為已經存在的物件新增額外的功能 特點 不需要對物件做任何的 上的變動 例1 計算執行時長 i...