python之有參裝飾器和迭代器用法

2021-08-20 16:30:37 字數 4220 閱讀 9063

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 ...