裝飾器和迭代器

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完畢才知道到底有幾個值)

一次性的,只能日後走,不能往前退

相關文章
相關標籤/搜索