这是我参与11月更文挑战的14天,活动详情查看:2021最后一次更文挑战。
迭代器
迭代器指的是迭代取值的工具,迭代是指一个重复的过程,每一次重复都是基于上一次结果而来。迭代提供了一种通用的不依赖索引的迭代取值方式。
可以用for循环遍历的对象都是可迭代对象:
str、list、tuple、dict、set等都是可迭代对象;generator,包括生成器和带yield的生成器函数。 判断是否可迭代:
除了看内置是否含有__iter__方法来判断该对象是否是一个可迭代的对象之外,我们还可以使用 isinstance() 判断一个对象是否是 Iterable 对象:
isinstance():用来判断对象是否是相应类型,与type()类似。
from collections import Iterable,Iterator
print(isinstance('abc',Iterable)) # True
print(isinstance([1,2,3,4],Iterable)) # True
print(isinstance(123,Iterable)) # False
迭代器对象
- 有内置的
__next__()方法的对象,执行该方法可以不依赖索引取值; - 有内置的
__iter__()方法的对象,执行迭代器的__iter__()方法得到的依然是迭代器本身。 ⚠️注意: 可迭代对象不一定是迭代器:
from collections import Iterable,Iterator
li = [1,2,3,4]
print(isinstance(li,Iterator)) # False
Iterator
可以被next()函数调用并不断返回下一个值的对象称为迭代器:
Iterator。 那我们可以通过iter()方法将可迭代的对象,转为迭代器:
li = [1,2,3,4]
lis = iter(li)
print(type(lis)) # <class 'list_iterator'>
⚠️注意: 迭代器不可以通过下标取值,而是使用__next__()或者next()。但是只要超出范围则直接报错StopIteration:
print(lis[0]) # 报错 not subscriptable
print(lis.__next__())
print(lis.__next__())
print(lis.__next__())
print(lis.__next__())
print(next(lis))
print(next(lis))
print(next(lis))
print(next(lis))
next()只能顺延调用,不能往前。
可迭代对象与迭代器区别
- 可用于
for循环的都是可迭代类型; - 作用于
next()都是迭代器类型; list、dict、str等都是可迭代的但不是迭代器,因为next()函数无法调用它们。可以通过iter()函数将它们转为迭代器;python的for循环本质就是通过不断调用next()函数实现的。
生成器与迭代器
生成器能做到迭代器能做的所有事;- 因为
生成器自动创建了iter()和next()方法,生成器显得简洁,而且高效。