1. 程式人生 > >Python 叠代器協議以及可叠代對象、叠代器對象

Python 叠代器協議以及可叠代對象、叠代器對象

統一 for循環 無法 缺點 import ins 一個 需要 實現

一、叠代器協議定義:

  叠代:是一個重復的過程,每一次重復,都是基於上一次的結果而來

while True: #單純的重復
    print(你瞅啥)

l=[a,b,c,d]
count=0
while count < len(l):
    print(l[count])
    count+=1

  叠代器協議是指:對象必須提供一個next方法,執行該方法要麽返回叠代中的下一項,要麽就引起一個StopIteration異常,以終止叠代 (只能往後走不能往前退)

二、可叠代對象定義:

  實現了叠代器協議的對象(如何實現:對象內部定義一個__iter__()方法)是對象下有__iter__方法:對象.__iter__,該對象就是可叠代對象

s=hello
l=[a,b,c,d]
t=(a,b,c,d)
dic={name:egon,sex:m,"age":18}
set1={1,2,3}
f=open(db.txt)

s.__iter__()
l.__iter__()
t.__iter__()
dic.__iter__()
set1.__iter__()
f.__iter__()

以上都是可叠代對象

三、叠代器對象定義:

  可叠代對象執行內置的__iter__方法,得到的結果就是叠代器對象

  1、有__iter__,執行得到仍然是叠代本身
  2、有__next__
  3、不依賴於索引的取值方式

dic={name:egon,sex:m,"age":18}

i=dic.__iter__()
# print(i) #iterator叠代器

# i.__next__() #next(i)
print(next(i))
print(next(i))
print(next(i))
print(next(i)) #StopIteration

l=[a,b,c,d]

i=l.__iter__()
print(next(i))
print(next(i))
print(next(i))
print(next(i))
print(next(i)) #StopIteration

四、叠代器對象的優點

1:提供了一種統一的(不依賴於索引的)叠代方式
2:叠代器本身,比起其他數據類型更省內存

l=[a,b,c,d]
i=iter(l)

dic={a:1,b:2}
x=dic.keys()
print(x)
i=x.__iter__()

with open(a.txt) as f:
    # print(next(f))
    # print(next(f))
    # print(next(f))
    f.read()

五、叠代器對象的缺點

1:一次性,只能往後走,不能回退,不如索引取值靈活
2:無法預知什麽時候取值結束,即無法預知長度

l=[a,b,c,d]
i=iter(l)
print(next(i))
print(next(i))
print(next(i))

六, for循環與可叠代對象

  凡是可for循環的都是可叠代的對象

l=[a,b,c,d]
for item in l: #iter_l=l.__iter__()
    print(item)


for item in {1,2,3,4}:
    print(item)

七、判斷可叠代對象與叠代器對象

需要from collections import Iterable,Iterator

用其中的isinstance()來判斷是否是可叠代對象與叠代器對象

from collections import Iterable,Iterator
s=hello
l=[a,b,c,d]
t=(a,b,c,d)
dic={name:egon,sex:m,"age":18}
set1={1,2,3}
f=open(a.txt)

#判斷可叠代對象
print(isinstance(s,Iterable))
print(isinstance(l,Iterable))
print(isinstance(t,Iterable))
print(isinstance(dic,Iterable))
print(isinstance(set1,Iterable))
print(isinstance(f,Iterable))
#判斷叠代器對象
print(isinstance(s,Iterator))
print(isinstance(l,Iterator))
print(isinstance(t,Iterator))
print(isinstance(dic,Iterator))
print(isinstance(set1,Iterator))
print(isinstance(f,Iterator))

Python 叠代器協議以及可叠代對象、叠代器對象