1,什麼是裝飾器app
裝飾器遵循開放封閉原則,對修改封閉,對擴展開放函數
裝飾器器自己是可任意調用的對象,被裝飾者也是任意可調用對象.工具
裝飾器的原則 1, 不修改被裝飾對象的源代碼, 2, 不修改被裝飾對象的調用方式對象
被裝飾函數的正上方,單獨一行索引
@deco1字符串
@deco2it
@deco3io
def foo():import
pass
原理
foo=deco(deco2(deco3(foo)))
裝飾器wraps
from functools import wraps
def deco (func):
@wraps(func):
def wraps(*args,**kwargs)
return func(*args,**kwargs)
return wrapper
@deco
def index():
'''hahhahahah'''
print('from index)
print(index.--doc--)
2, 迭代
迭代器即迭代的工具,什麼是迭代?
迭代是一個重複的過程,每一次重複即一次迭代,而且每次迭代的結果都是下一次迭代的初始值,只是單純的重複並非迭代
l=[1,2,3]
count=0
while count<len(l)
print(l[count])
count+=1
(1)
爲什麼要有迭代器
對於序列類型:字符串,元組,列表,咱們能夠使用索引的方式迭代取出其包含的元素.但對以字典,集合,文件類型是沒有索引的,
若還想取出其內部包含的元素,則必須找到一種不依賴於索引的迭代方式,這就是迭代器
什麼是可迭代對象
可迭代對象指的是內置有__iter__方法的對象,即obj.__iter__,以下
'hello' .__iter__
(1,2,3).__iter__
[1,2,3].__iter__
{'a':1}.__iter__
{'a','b'}.__iter__
open('a.txt').iter__
3,什麼是迭代器對象?
可迭代對象執行obj.__iter__()獲得的結果就是迭代器對象
而迭代器對象指的是即內置有__iter__又內置有__next__方法的對象
文件類型是迭代器對象
open('a.txt').__iter__()
open('a.txt).__iter__()
-----------注意,迭代器對象必定是可迭代對象,而可迭代對象不必定是迭代器對象
dic={'a':1,'b:2,'c':3}
iter__dic=idc.__iter__() #獲得迭代器對象,迭代器對象即有__iter__又有__next__,可是:迭代器.__iter__()得
到的仍然是迭代器自己
iter__dic.__iter__() is iter__dic
print(iter__dic.__next__())#等同於next(iter__dic)
print(iter__dic.__next__())#等同於next(iter__dic)
print(iter__dic.__next__())#等同於next(iter__dic)
#print(iter__dic.__next__()) #拋出異常stopiteration,或者說結束標誌
#有了迭代器,咱們就能夠不依賴索引迭代取值了
iter__dic=dic.__iter__()
while 1:
try :
k=next(iter__dic)
print(dic[k])
except stopiteration
break\
4,for 循環
基於for 循環,咱們能夠徹底不去依賴索引去 取值
dic={'a':1,'b':2,'c':3}
for k in dic:
print(dic[k])
for 的工做原理
1,執行in 後對象的dic.__iter__()方法,獲得一個迭代器對象iter_dic
2,執行next(iter__dic),將獲得的值賦值給k,而後執行循環體代碼
3,重複過程2,直到捕捉到異常stop iteration,結束循環
迭代器的優缺點:
優勢:
提供一種統一的,不依賴索引的迭代方式
惰性計算,節省空間
缺點:
沒法獲取長度(只有在next完畢才知道到底有幾個值)
一次性的,只能日後走,不能往前退