python作用域是乙個容易掉坑的地方,python 的作用域一共有 4 中,分別是:
1.l 區域性作用域
2. e閉包函式,外的函式中
3. g 全域性作用域
4. b 內建作用域
以 l –> e –> g –>b 的規則查詢,即:在區域性找不到,便會去區域性外的區域性找(例如閉包),再找不到就會
去全域性找,再者去內建中找
注意:python 除 了 calss 、def、lambad ,之外,其他 if/elif/else,try/except for /while 定義在他們內部的變數,外部還是可以訪問的,但是並不能改變作用域
if
true
: a=
10000
#定義在if 內的變數,在外部還是可以訪問的但是如果 if 被 class和def 包裹,那就按照區域性變數來處理了
print
(a)```
如果在class 和 def 內部賦值,就是區域性作者用域,區域性作用域的變數可以覆蓋全域性作用域的變數,但是 不能改變全域性作用域的變數
```python
g=1000
#全域性變數
defa()
: g=
2return g
print
( a())
#這個是列印出 區域性變數g 結果為1000
print
(g)#列印的是全域性變數g1,結果為2
**
**閉包的定義 : 如果在乙個內部函式裡 , 對在外部函式內 ( 但 不是在全域性作用域 ) 的變數進行引用 , 那麼內
部函式就被認為是閉包
def
func
(name)
:def
inner_func
(age)
:print
('name:'
, name,
'age:'
, age)
return inner_func
bb = func(
'nathaniel'
)bb(26)
# name: nathaniel age: 26
這裡面呼叫 c func 的時候就產生了乙個
這裡面呼叫 c func 的時候就產生了乙個閉包 —— inner_func, 並且該閉包持有自由變數 —— name ,因此這
也意味著,當函式 c func 的生命週期結束之後,e name 這個變數依然存在,因為它被閉包引用了,所以不會被
** ,閉包延長了區域性變數的生命週期
1、函式名可作為引數傳遞
2、函式名可以賦值給其他變數
3、函式名可以作為返回值
def foo1
**裝飾器其實也是簡單的函式,是在不改變原有的函式**的情況下,增加新的功能
看如下**乙個簡單的裝飾器例子show_time 是func1 的裝飾器
import time
defshow_time
(func)
:#裝飾器函式呼叫原來函式並返回乙個新的函式
definner()
: start=time.time(
) func(
) end=time.time(
)print
('函式執行時間為:%s'
%(end-start)
)return inner(
)@show_time
deffunc1()
:print
('func1'
) time.sleep(5)
print
('func1 again'
)
帶參函式的裝飾,見下面的**:
import time
defshow_time2
(func)
:def
inner
(value)
: start=time.time(
) func(value)
end=time.time(
)print
('總歸花費時間 %s'
%(end-start)
)return inner
@show_time2
deffunc2
(value)
:print
(value)
time.sleep(3)
print
('%s again'
% value)
print
(type
(value)
)func2(
123)
多引數的情況:
import time
defshow_time
(func)
:def
inner
(*args)
: start=time.time(
) func(
*args)
time.sleep(1)
end=time.time(
)print(%
(end-start)
)return inner
@show_time
defadd
(*args)
:sum=0
print
('運算前的值sum:'
,sum
)for i in args:
sum+=i
time.sleep(1)
print
('運算後的:'
,sum
)add(1,
2,3,
4)
裝飾器其實也是乙個函式, , 如果難以理解, , 可以將其記為一種特定的格式 like
裝飾器將需要修飾的功能函式作為引數傳入 ==> 意味著裝飾器需要接受乙個引數, , 我們將需要修飾的函式作為
引數傳入
裝飾器內建乙個函式並返回這個內建函式
在內建函式中呼叫需要修飾的功能函式( ( 這裡用到了引數, ), 並增加新功能
@show_time 相當於 add = = show_time(add)
得益於 於 python 強大的功能 ,python 的函式可以像普通物件一樣存在, , 可以作為引數傳遞給另乙個函式也可以被
重新賦值
Python基礎 裝飾器簡述
作用 向原本的函式新增功能,但是不改變原函式的內部結構 在 執行期間,可以動態增加函式功能的方式,被稱為裝飾器 decorator 也就是說,在不修改原函式的基礎上,給原函式增加功能 好處 在團隊開發中,如果兩個或者兩個以上的程式設計師會用到相同的功能,但是功能又有細微的差別,採用裝飾器 相互不影響...
python裝飾器 Python 裝飾器
簡言之,python裝飾器就是用於拓展原來函式功能的一種函式,這個函式的特殊之處在於它的返回值也是乙個函式,使用python裝飾器的好處就是在不用更改原函式的 前提下給函式增加新的功能。一般而言,我們要想拓展原來函式 最直接的辦法就是侵入 裡面修改,例如 這是我們最原始的的乙個函式,然後我們試圖記錄...
python裝飾器 裝飾器
由於函式也是乙個物件,而且函式物件可以被賦值給變數,所以,通過變數也能呼叫該函式。def now print 2015 3 25 f now f 2015 3 25 函式物件有乙個 name 屬性,可以拿到函式的名字 now.name now f.name now 現在,假設我們要增強now 函式的...