1.有參裝飾器:是無參裝飾器的加強版
在無參裝飾器上面再包個函式(相當於多增加乙個值)
無參裝飾器函例圖:
def check(func): # index()執行的先執行@check=check(index)把index記憶體位址賦值給func 得到check_user記憶體位址返回值並賦值新的index變數名
def check_user(*args, **kwargs):
while true:
user_info = input("請輸入使用者名稱:").strip()
pwd_info = input('請輸入密碼:').strip()
if user_info == name and pwd_info == pwd:
print("loging successfull")
else:
print('使用者名稱和密碼錯誤')
continue
res = func(*args, **kwargs)
return res
return check_user
@check
def index(): # 執行@check(index) func記憶體位址=index賦值 返回check_user記憶體位址 在重新賦值乙個新的index=check_info實際上記憶體位址已經更換了
# 最後直接呼叫index()指向的是check_info()的記憶體位址
print('welcome to index')
time.sleep(2)
return 123
import time
current_user=
def deco(func):
if current_user['user']:
#已經登陸過
res = func(*args, **kwargs)
return res
user=input('username>>: ').strip()
pwd=input('password>>: ').strip()
if user == 'egon' and pwd == '123':
print('login successful')
# 記錄使用者登陸狀態
current_user['user']=user
res=func(*args,**kwargs)
return res
else:
print('user or password error')
@deco
def index():
print('welcome to index page')
time.sleep(1)
@deco
def home(name):
print('welecome %s to home page' %name)
time.sleep(0.5)
index()
home('egon')
'''
有參可以增加認證**的判斷,根據傳入的引數進行多種分模擬如如下多種登入認證
import time
current_user=
def auth(engine='file'):
def deco(func):
if current_user['user']:
#已經登陸過
res = func(*args, **kwargs)
return res
user=input('username>>: ').strip()
pwd=input('password>>: ').strip()
if engine == 'file':
# 基於檔案的認證
if user == 'egon' and pwd == '123':
print('login successful')
# 記錄使用者登陸狀態
current_user['user']=user
res=func(*args,**kwargs)
return res
else:
print('user or password error')
elif engine == 'mysql':
print('基於mysql的認證')
elif engine == 'ldap':
print('基於ldap的認證')
else:
print('無法識別認證**')
return deco
def index():
print('welcome to index page')
time.sleep(1)
@auth(engine='mysql')
def home(name):
print('welecome %s to home page' %name)
time.sleep(0.5)
index()
2.什麼是迭代器
1.迭代器即迭代取值的工具
2.迭代就是乙個重複的過程,每一次都要重複是基於上次的結果而來
單純的重複並不是迭代
迭代:l=['a','b','c']
def iterator(item):
i=0while i print(l[i])
i+=1
2.為什麼要有迭代器
基於索引的迭代器取值方式只適用於列表、元組、字串
對於沒有索引的字典、集合、檔案、則不適合
所以必須找到一種通用的並且不依賴索引的迭代器取值方式=》迭代器
迭代器適用於可迭代的型別
3.如何用迭代器
s='hello'
def iterator(item):
i=0while i print (item[i])
i+=1
iterator(s)
可迭代物件:在python中但凡內建有—iter—方法的物件都是可迭代物件
(字串,列表,元組,字典,集合,檔案都是可迭代的物件)
迭代器物件=可迭代的物件——iter——()
迭代器物件:即內建有——iter——方法,有內建有—next——方法的物件
迭代器物件本身=迭代器物件——iter——()
拿到的是下乙個值=迭代器物件——next——()
##執行可迭代物件的——iter——方法得到的就是內建的迭代器物件
###檔案物件本身就是迭代器物件
強調:
迭代器物件一定是可迭代的物件,反之則不讓
一旦迭代器取取值乾淨,在繼續取就會丟擲stopiteration
迭代器物件:指的是既內建有——iter——方法,又內建有——next——方法的物件
執行迭代器物件的——next——得到的是迭代器下乙個值
執行迭代器物件的——iter——得到的仍然是迭代器本身
例項:
for迴圈:迭代器迴圈
info=
#in後面跟的一定要是可迭代的物件
for k in info: #info_iter=info._iter_() for迴圈底層原理就是用迭代器方式定義 (檢測執行完畢後自動結束)
print(k)
while迴圈需要定義乙個檢測機制,執行完畢後才不會報錯
總結迭代器物件的優缺點:
指的是既內建有——iter方法:
優點:提供一種通用的、可以不依賴索引的迭代取值方式
2.迭代器物件更加節省記憶體 (比如讀取大檔案時候,讀一行就取一行)
缺點:1.迭代器的取值不按照索引的方式更靈活,因為他只能往後不能往前退
2.無法**迭代器值的個數
比如:
python之有參裝飾器
由於語法糖 的限制,outter函式只能有乙個引數,並且該引數只用來接收被裝飾物件的記憶體位址 def outter func func 函式的記憶體位址 res func args,kwargs return res outter outter outter index def index x,y...
python函式之有參裝飾器
一 為什麼要有有參裝飾器?來看之前的無參裝飾器 無參裝飾器 defoutter func start time.time res func args,kwargs 我們需要乙個變數接受函式的返回值 end time.time print run time is s end start return ...
python中裝飾器之有參裝飾器(三)
在呼叫無參裝飾器時,不需要在外層傳遞引數。適用於例如 為某個函式增加統計執行時間功能 為某個函式執行前增加登入認證功能 在呼叫有參裝飾器時,對其傳入乙個或多個引數。適用於例如 驗證使用者型別 def user auth user group def def inner args,kwargs if ...