迭代器
迭代器
迭代器:迭代的工具。可以说迭代是一种重复,但这个重复是基于上一次的结果在进行的,如果上一次发生问题,就没办法进行下一次的迭代了
可迭代对象
常言道,python一切皆对象,如
x = 10
y = 12.34
name = 'hades'
lis = [1,2,'3']
tup = (1,2,'3')
dic = {'name':'hades','weight':'125'}
s = {1,2,4,6,'q'}
def f1():
print('from f1')
f = open(r'aaa.txt','r',encoding='utf-8')
上面所列的都是对象,但凡拥有__iter__方法的对象,就是可迭代对象
name = 'hades'.__iter__()
lis = [1,2,'3'].__iter__()
tup = (1,2,'3').__iter__()
dic = {'name':'hades','weight':'125'}.__iter__()
s = {1,2,4,6,'q'}.__iter__()
f = open(r'aaa.txt','r',encoding='utf-8')
f.__iter__()
f.close()
x = 10.__iter__ # 报错
def f1():
print('from f1')
f1.__iter__ # 报错
File "<ipython-input-6-6ab44815576a>", line 10
x = 10.__iter__ # 报错
^
SyntaxError: invalid syntax
所以,在python中,除了数字类型和函数,其余的都是可迭代对象
特点:
- 内置有
__iter__方法的都叫可迭代对象
迭代器对象
在上面的可迭代对象(字符串、列表、元组、字典、集合、文件)中,只有字符串/列表/元组可以通过索引取值,其他的都无法进行,因此我们就需要一个方法不依赖索引也能将里面的东西全部取出来
这个方法就是__next__方法
dic = {'name':'hades','weight':'125'}
dic_iter = {'name':'hades','weight':'125'}.__iter__()
print(dic_iter.__next__())
print(dic_iter.__next__())
print(dic_iter.__next__()) # 取不到了会报错
name
weight
---------------------------------------------------------------------------
StopIteration Traceback (most recent call last)
<ipython-input-5-5398e64fd512> in <module>
3 print(dic_iter.__next__())
4 print(dic_iter.__next__())
----> 5 print(dic_iter.__next__()) # 取不到了会报错
StopIteration:
但这样还是很麻烦,如果元素比较多,这样一个一个写非常麻烦,我们可以使用whil循环来进行,再通过try...except...方法进行异常处理
s = 'my name is hades.'
s_iter = s.__iter__()
while True:
try:
print(s_iter.__next__(),end= ' ')
except Exception as e:
break
m y n a m e i s h a d e s .
迭代器对象:执行完__iter__方法之后,拿到的返回值就是迭代器对象
特点:
- 拥有__iter__方法,可迭代对象拥有__next__方法的才是迭代器对象
- 文件本身就是迭代器对象
缺点:
- 取值比较麻烦,只可以向后取
- 无法计算长度
for循环原理
for循环称为迭代器循环,in后面必须是可迭代对象。
上面写的while循环就是for循环原理
因为迭代器使用__iter__后还是迭代器本身,所以for循环不用考虑in后面的对象是可迭代对象或者是迭代器对象

浙公网安备 33010602011771号