一、什么是迭代器
迭代器即是用来迭代取值的工具,而迭代是重复反馈取值的过程,其目的通常是为了逼近所需的目标或结果,每一次对过程的重复称为一次“迭代”,而每一次迭代得到的结果会作为下一次迭代的初始值,单纯的重复并不是迭代。
例如:
while True:
msg = input("请输入内容>>>")
print(msg)
这只是一个单纯的循环,不是迭代。
如下才是迭代:
name = ['lili','小明', '小红']
index = 0
while index < len(name):
print(name[index])
index += 1
输出结果:
lili
小明
小红
这个例子,不仅满足重复,而且以每次重新赋值后的index值作为下一次循环中新的索引进行取值,反复迭代,最终可以取尽列表中的值。
1.1:可迭代对象
通过索引的方式进行取值,只适用于序列类型:字符串、元组、列表。对于没有索引的字典、集合等非序列类型,进行迭代取值,就使用到了迭代器。
什么是可迭代对象呢?
内置有__iter__()方法的对象,就是一个可迭代对象,字符串、元组、列表、字典、集合、打开的文件都是一个可迭代对象。
dic = {'a':1, 'b':2}
dic.__iter__()
可以使用isinstance()方法来判断对象是不是可迭代对象。使用方法如下,返回值为bool值。
isinstance('对象名称', Iterable)
1.2:迭代器对象
内置有__iter__()和__next__()方法的对象,就是一个迭代器对象。
打开的文件本身就是一个迭代器对象,执行迭代器对象.iter()方法得到的仍然是迭代器本身,而执行迭代器.next()方法就会计算出迭代器中的下一个值。
迭代器是Python提供的一种统一的、不依赖于索引的迭代取值方式,只要存在多个“值”,无论序列类型还是非序列类型都可以按照迭代器的方式取值。
dic = {'a':1, 'b':2} # 可迭代对象dic
s = iter(dic) # 本质就是在调用dic.__iter__(),返回dic的迭代器对象s
print(next(s)) # 输出:a
print(next(s)) # 输出:b
print(next(s)) # 抛出StopIteration的异常,代表无值可取,迭代结束
迭代器对象不一定是可迭代对象,但可迭代对象一定是迭代器对象
二、for循环原理
例如一个遍历字符串取值的过程:
for el in "abc":
print(el)
# a
# b
# c
for循坏在执行的时候,首先会在“abc”字符串对象上调用iter()方法,返回一个定义了__next__()方法的迭代器对象,然后再调用该迭代器对象的next()方法将取到的值赋给el,next()方法会逐一访问“abc”中的元素,当元素用尽的时候,next()方法会引发一个StopIteration异常来通知for循环,捕捉到异常后,终止循坏。
itor = iter("abc") # 调用iter()方法,生成迭代器对象
print(itor) # <str_iterator object at 0x100a6fcd0>
print(dir(itor)) # dir()可以显示传入对象的所有属性和方法,有__iter__和__next__
print(next(itor)) # 用python内置的next()函数来调用迭代器内部的__next__()方法
三、迭代器的优缺点
3.1:优点
1、为序列和非序列类型提供了一种统一的迭代取值方式。
2、惰性计算:迭代器对象表示的是一个数据流,可以只在需要时才去调用next来计算出一个值,就迭代器本身来说,同一时刻在内存中只有一个值,因而可以存放无限大的数据流,而对于其他容器类型,如列表,需要把所有的元素都存放于内存中,受内存大小的限制,可以存放的值的个数是有限的。
3.2:缺点
1、除非取尽,否则无法获取迭代器的长度文章来源:https://www.toymoban.com/news/detail-422048.html
2、只能取下一个值,不能回到开始,更像是‘一次性的’,迭代器产生后的唯一目标就是重复执行next方法直到值取尽,否则就会停留在某个位置,等待下一次调用next;若是要再次迭代同个对象,你只能重新调用iter方法去创建一个新的迭代器对象,如果有两个或者多个循环使用同一个迭代器,必然只会有一个循环能取到值。文章来源地址https://www.toymoban.com/news/detail-422048.html
到了这里,关于Python基础之迭代器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!