通俗的定義:如果在乙個內部函式裡,對在外部作用域(但不是在全域性作用域)的變數進行引用,那麼內部函式就被認為是閉包(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
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()
"used:
", end -start
return
@timeit
deffoo():
"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...