說實話,日子過的真快,不知不覺21天了,在這裏很充實,同時是真的累,但是這種知識暴漲的快感令人很舒服,風雨兼程,有你有我,希望自己能夠堅持下去,早日迴歸到10點睡6點起的幸福日子。
有參裝飾器:
裝飾器裏添加參數,然後可以在裝飾器上套一層函數,這個函數可以傳任意個數的參數,最裏層必須得傳參數(*args, **kwargs),外層傳(func),最外層任意傳參數,裏面都可以接收
import time current_user={'user':None} def deco(func): def wrapper(*args,**kwargs): 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') return wrapper @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') ''' ''' def f1(): x=1 def f2(): def f3(): print(x) return f3 return f2 f2=f1() f3=f2() f3() import time current_user={'user':None} def auth(engine='file'): def deco(func): def wrapper(*args,**kwargs): 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 wrapper return deco @auth(engine='mysql') # @deco #index=deco(index) #index=wrapper 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() home('egon')
2.迭代器
什麼是迭代器:
迭代器即取值的工具
迭代是一個重複的過程,每一次重複都是基於上一次的結果而來的。
單純的重複並不是迭代
while True: print('1111')
迭代
迭代: l=['a','b','c'] def iterator(item): i=0 while i < len(item): print(l[i]) i+=1
爲什麼要有迭代器
基於索引的迭代器取值方式只適用於列表、元組、字符串類型
而對於沒有索引的字典、集合、文件,則不再適用
所以必須找到一種通用的並且不依賴於索引的迭代器取值方式-》迭代器
迭代器適用於可迭代的類型
3.如何用迭代器
l=['a','b','c'] i=0 while i < len(l): print(l[i]) i+=1 l = ['a', 'b', 'c'] s='hello' def iterator(item): #item='hello' i = 0 while i < len(item): print(item[i]) i += 1 # iterator(l) iterator(s)
可迭代的對象
在python中但凡內置有__iter__方法的對象都是可迭代的對象
字符串、列表、元組、字典、集合、文件都是可迭代的對象
num1=10 num2=10.1 s1='hello' l=[1,2,3] t=(1,2,3) d={'x':1} s2={1,2,3} f=open('a.txt','w') s1.__iter__ l.__iter__ t.__iter__ d.__iter__ s2.__iter__ f.__iter__
迭代器對象:
指的是既內置__iter__方法,又內置__next__方法的對象
執行可迭代對象的__iter__方法得到的就是內置的迭代器對象
文件對象本身就是迭代器對象
強調:
迭代器對象一定是可迭代的對象,反之則不然
info={'name':'egon','age':18,'is_beautiful':True,'sex':'male'} info_iter=info.__iter__() # print(info_iter) res1=info_iter.__next__() print(res1) res2=info_iter.__next__() print(res2) res3=info_iter.__next__() print(res3) res4=info_iter.__next__() print(res4) info_iter.__next__()# 一旦迭代器取值取乾淨,再繼續取出就會拋出StopIteration
info={'name':'egon','age':18,'is_beautiful':True,'sex':'male'} # info=[1,2,3,4,5] info_iter=info.__iter__() while True: try: print(info_iter.__next__()) except StopIteration: break
for 循環:迭代器循環
info={'name':'egon','age':18,'is_beautiful':True,'sex':'male'} in後跟的一定要是可迭代的對象 for k in info: # info_iter=info.__iter__() print(k)
in後跟的一定要是可迭代的對象
f=open('a.txt','r') for k in f: print(k)
迭代器對象:指的是即內置又__iter__方法,又內置__next__方法的對象
執行迭代器對象的__next__得到的是迭代器的下一個值
執行迭代器對象的__iter__得到的仍然是迭代器本身
iter_info=info.__iter__() print(iter_info) print(iter_info is iter_info.__iter__() is iter_info.__iter__().__iter__().__iter__().__iter__().__iter__()
總結迭代器的缺點和優點:
優點:
1、提供了一種通用的、可以不依賴索引的迭代取值方式
2、迭代器對象更加節省內存
f=open('movie.tar.gz','rb') f.__ next__() f=open('db.txt','rt',encoding='utf-8') print(f.__next__()) print(f.__next__()) print(next(f)) #f.__next__() s='hello' print(s.__len__()) print(len(s)) s.__iter__() print(iter(s))
缺點:
1、迭代器的取值不如按照索引的方式更靈活,因爲它只能往後取不i能往前退
2、無法預測迭代器值的個數
names=['egon','alex_SB','wxx_SB'] iter_names=iter(names) print(next(iter_names)) print(next(iter_names)) iter_names=iter(names) print(next(iter_names)) print(next(iter_names)) # print(next(iter_names)) print(names[1]) print(names[1])
s=set('helllllo') print(s) for i in 10: pass list(10) names=['a','b','c','d'] iter_names=iter(names) l1=list(iter_names) print(l1) l2=list(iter_names) print(l2) f=open('db.txt','rt',encoding='utf-8') print(list(f)) print(list(f)) print(list(f)) print(list(f)) print(list(f)) l1=[1,2,3,] diedaiqi=l1.__iter__() print(list(l1)) print(list(l1)) print(list(l1)) print(list(l1)) print(list(l1)) print(list(l1))謝謝觀看!