迭代器

1.什麼是迭代器?python

迭代器即迭代取值的工具。工具

迭代:迭代是一個重複的過程,每一次重複都是基於上一次的結果而來的。spa

單純的重複並非迭代對象

while True: # 並非迭代,只是單純的在重複打印。
print('1111')

迭代:
l=['a','b','c']

def iterator(item):
i=0
while i < len(item):
print(l[i])
i+=1
iterator(l)

二、 爲何要有迭代器
基於索引的迭代取值方式只適用於列表、元組、字符串類型
而對於沒有索引的字典、集合、文件,則不在適用
因此必須找到一種通用的而且不依賴於索引的迭代取值方式=》迭代器

迭代器適用於可迭代的類型

3.如何用迭代器:
'''
一、什麼是迭代器
迭代器即迭代取值的工具
迭代:
迭代是一個重複的過程,每一次重複都是基於上一次的結果而來的

單純的重複並非迭代
while True:
print('1111')

迭代:
l=['a','b','c']

def iterator(item):
i=0
while i < len(item):
print(l[i])
i+=1


二、 爲何要有迭代器
基於索引的迭代器取值方式只適用於列表、元組、字符串類型
而對於沒有索引的字典、集合、文件,則不在適用
因此必須找到一種通用的而且不依賴於索引的迭代器取值方式=》迭代器

迭代器適用於可迭代的類型

三、如何用迭代器


'''
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')
可迭代對象通過__iter__後獲得的都是迭代器對象,自己就是迭代器對象的好比文件__iter__後仍是迭代器對象,一般用於for循環
整型,浮點型這些都是不可迭代的
下面的幾種類型都是可迭代的
print(s1.__iter__)
print(l.__iter__)
print(t.__iter__)
print(d.__iter__)
print(s2.__iter__)
print(f.__iter__)


*****
迭代器對象:指的是既內置有__iter__方法,又內置有__next__方法的對象
執行可迭代對象的__iter__方法獲得的就是內置的迭代器對象
文件對象自己就是迭代器對象

強調:
一、迭代器對象必定是可迭代的對象,反之則否則(反之就是可迭代的對象都是迭代器對象:目前只有文件符合描述)



info={'name':'egon','age':18,'is_beautiful':True,'sex':'male'}
info_iter=info.__iter__() # info_iter 是迭代器對象
# print(info_iter)

res1=info_iter.__next__() # 迭代器對象可通過__next__方法調用值。
print(res1)

res2=info_iter.__next__() # 每使用一次__next__()就得到一個值
print(res2)

res3=info_iter.__next__()
print(res3)

res4=info_iter.__next__()
print(res4) # (猜想)迭代器對象能夠理解爲可迭代對象通過__iter__()後變成了一個能夠用__next__()進行迭代的迭代器

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循環對可迭代對象進行迭代取值。
while True:
try: # try except except是當遇到中止信號時循環會結束
print(info_iter.__next__())
except StopIteration: # StopIteration並不能徹底當作報錯,也是循環結束的一種信號
break


for循環:迭代器循環
info={'name':'egon','age':18,'is_beautiful':True,'sex':'male'}
in後跟的必定要是可迭代的對象
for k in info: # info_iter=info.__iter__()
print(k)

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__())
# 最終獲得的仍是迭代器對象


總結迭代器對象的優缺點:
優勢:
一、提供了一種通用的、能夠不依賴索引的迭代取值方式
二、迭代器對象更加節省內存
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))


缺點:
一、迭代器的取值不如按照索引的方式更靈活,由於它只能向前取不能日後退 *****
二、沒法預測迭代器值的個數
可迭代對象和迭代器對象內置的__iter__() 和__next__()方法能夠寫成 iter()、next()
names=['egon','alex_SB','wxx_SB']
iter_names=iter(names) # -->> 獲得一個迭代器對象 iter(names)
print(next(iter_names)) # —>> 取迭代器對象的下一個值 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 # 報錯,in後面不是可迭代對象

list(10) # 報錯,裏面應該是可迭代對象。若是是字典,則把key循環出來放在列表裏

names=['a','b','c','d']
iter_names=iter(names)

l1=list(iter_names) # list裏面能放迭代器對象和可迭代對象,可迭代對象警告過iter方法可轉變成迭代器對象。
print(l1)

l2=list(iter_names)
print(l2) # 打印出來結果爲空列表。沒有從新生成迭代器對象

['a', 'b', 'c', 'd']
[]

f=open(r'C:\Users\LENOVO\PycharmProjects\untitled2\db.txt','rt',encoding='utf-8')

print(list(f)) # 第一個會打印出txt裏內容,後面幾個都是空列表。
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))
print(list(diedaiqi))
print(list(diedaiqi))
diedaiqi=l1.__iter__() # 須要從新生成迭代器對象
print(list(diedaiqi))
相關文章
相關標籤/搜索