迭代器

一.什么是迭代器

迭代器即迭代取值的工具

迭代:

迭代是一个重复的过程,每一次的重复都是基于上一次的结果来的.

单纯的重复并不是迭代:

while True:
    print('1111')

迭代:

1 l=['a','b','c']
2 
3     def iterator(item):
4         i=0
5         while i < len(item):
6             print(l[i])
7             i+=1

二.为什么要有迭代器

基于索引的迭代器取值方式只适用于列表,元组,字符串类型

而对于没有索引的字典,集合,文件则不适用

所以必须找到一种通用的并且不依赖于索引的迭代器取值方式==>迭代器

迭代器适用于可迭代类型

三.如何使用迭代器

 1 l=['a','b','c']
 2 i=0
 3 while i < len(l):
 4     print(l[i])
 5     i+=1
 6 
 7 l = ['a', 'b', 'c']
 8 s='hello'
 9 
10 def iterator(item): #item='hello'
11     i = 0
12     while i < len(item):
13         print(item[i])
14         i += 1
15 # iterator(l)
16 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)

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.迭代器的取值不如按照索引的方式更灵活,因为它只能往后取而不能往前退

2.无法预测迭代器值的个数

原文地址:https://www.cnblogs.com/chillwave/p/9173637.html