1.閉包:
函式內部的子函式返回,在外部呼叫子函式時,其實函式已經結束,但是在呼叫子函式時,函式內部的區域性變數任然有效。
1 def fun():2.裝飾器:2 n = 10
3 def fun1():
4 print('n為:', n)
5 return fun1
6 7 f = fun()
8 print(f)
9 f()
10 11 .fun1 at 0x000001df0e6dfa60>
12 n為: 10
參考:軟體開發的乙個原則:開放-封閉 原則
開放:對現有功能的擴充套件開放
封閉:已實現的功能**塊不應該被修改
# 對河南和歐美專區認證,若是已經登入過,就不需要在登入。
# 2.1.語法糖 裝飾器
user_state = false
def login(func):
def inner():
_username = 'alice'
_password = '123'
global user_state
if user_state == false:
username = input('username:').strip()
password = input('password:').strip()
if username == _username and password == _password:
print('welcome to login...')
user_state = true
else:
print('wrong username or password')
else:
print('使用者已經登入,認證通過')
if user_state == true:
func()
return inner
def home():
print('-----首頁-----')
@login # america=login(america)
def america():
print('-----歐美專區-----')
def japan():
print('-----日韓專區-----')
@login # henan=login(henan)
def henan():
print('-----河南專區-----')
home()
henan()
america()
-----首頁-----
username:alice
password:123
welcome to login...
-----河南專區-----
使用者已經登入,認證通過
-----歐美專區-----
語法糖 裝飾器
# 2.2.帶引數的裝飾器
user_state = false
def login(func):
def inner(*args, **kwargs):
_username = 'alice'
_password = '123'
global user_state
if user_state == false:
username = input('username:').strip()
password = input('password:').strip()
if username == _username and password == _password:
print('welcome to login...')
user_state = true
else:
print('wrong username or password')
else:
print('使用者已經登入,認證通過')
if user_state == true:
func(*args, **kwargs)
return inner
def home():
print('-----首頁-----')
@login
def america():
print('-----歐美專區-----')
@login
def japan(x, y, z=5):
print('-----日韓專區-----', x, y, z)
@login
def henan(x):
print('-----河南專區-----', x)
home()
henan('haha')
america()
japan('japan', 1, z=7)
-----首頁-----
username:alice
password:123
welcome to login...
-----河南專區----- haha
使用者已經登入,認證通過
-----歐美專區-----
使用者已經登入,認證通過
-----日韓專區----- japan 1 7
帶引數的裝飾器
# 2.3.帶引數2的裝飾器
user_state = false
def login(auth_type):
def outer(func):
def inner(*args, **kwargs):
_username = 'alice'
_password = '123'
global user_state
if user_state == false:
username = input('username:').strip()
password = input('password:').strip()
if username == _username and password == _password:
print('welcome to login...')
user_state = true
else:
print('wrong username or password')
else:
print('使用者已經登入,認證通過')
if user_state == true:
func(*args, **kwargs)
return inner
return outer
def home():
print('-----首頁-----')
@login('wx')
def america():
print('-----歐美專區-----')
@login('wb')
def japan(x, y, z=5):
print('-----日韓專區-----', x, y, z)
@login('qq') #henan = login('qq')(henan) =inner
def henan(x):
print('-----河南專區-----', x)
home()
# xx = login('qq')
# henan = xx(henan)
henan('haha')
america()
japan('japan', 1, z=7)
-----首頁-----
username:alice
password:123
welcome to login...
-----河南專區----- haha
使用者已經登入,認證通過
-----歐美專區-----
使用者已經登入,認證通過
-----日韓專區----- japan 1 7
帶引數2的裝飾器
閉包 裝飾器
外部函式返回內部函式的引用 內部函式可以直接使用外部函式的環境變數 語法 外部函式通過返回內部函式的引用 內部函式可以直接使用外部函式的 環境變數 自由變數 函式執行時間統計 執行函式前預備處理 執行函式後清理功能 許可權校驗等場景 快取有且只有乙個引數 指向了被裝飾的函式的引用 使用裝飾器 裝飾器...
閉包,裝飾器
多層函式巢狀,函式裡面還有定義函式,一般是兩個 往往內層函式會用到外層函式的變數,把內層函式以及外部函式的變數當成乙個特殊的物件,這就是閉包。閉包比物件導向更純淨 更輕量,既有資料又有執行資料的 比普通函式功能更強大,不僅有 還有資料 利用閉包的基本原理,對乙個目標函式進行裝飾,即在執行乙個目標函式...
閉包 裝飾器
定義乙個函式 def test number 在函式內部再定義乙個函式,並且這個函式用到了外邊函式的變數,那麼將這個函式及用到的一些變數稱之為閉包 def test in number in print in text in 函式,number in is d number in return nu...