文章目录
1.什么是迭代器(Iterator) ?
list,truple,str这些都是可迭代对象,但是他们不一定是迭代器。
迭代器本身不知道自己要执行多少次,所以可以理解为不知道有多少个元素,
每调用一次next(),就会往下走一步,是惰性的。
迭代器提供了一种不依赖索引取值的方式,这样可以遍历没有索引的可迭代对象,比如字典、集合、文件等等,加载这一个元素至内存中随后释放,相比之下相当节省内存,
这也是迭代器最大的优点,但是我们没有办法获取迭代器的长度,而且只能往后依次取值。
这也是for循环遍历取值实现的机制。
2.什么是可迭代对象 (Iterable) ?
以直接作用于 for 循环的数据类型有以下几种:
一类是集合数据类型,如 list 、 tuple 、 dict 、 set 、 str 等;
一类是 generator(生成器)带有yield 。
小结
迭代器不一定是生成器,生成器一定是迭代器
(1)凡是可作用于 for 循环的对象都是 Iterable 类型;
凡是可作用于 next() 函数的对象都是 Iterator 类型
(2)迭代器不一定是生成器,生成器一定是迭代器
(3)集合数据类型如 list 、 dict 、 str 等是 Iterable 但不是 Iterator ,
不过可以通过 iter() 函数获得一个Iterator 对象。生成器既是
3.是否是迭代器OR可迭代对象的判断方式
s=[1,3,5]
#是否是可迭代对象
print(isinstance(s,Iterable))
#是否是迭代器
print(isinstance(s,Iterator))
4.Python中和迭代有关的两个函数next()和iter()
(1) iter():用来生成迭代器
iter语法:
iter(object[, sentinel])
object -- 支持迭代的集合对象。
sentinel -- 如果传递了第二个参数,则参数 object 必须是一个可调用的对象(如,函数),此时,iter
创建了一个迭代器对象,每次调用这个迭代器对象的__next__()方法时,都会调用 object。
(2) next():返回迭代器的下一个项目
next语法:
next(iterator[,dafault])
iterator -- 可迭代对象
default -- 可选,用于设置在没有下一个元素时返回该默认值,如果不设置,
又没有下一个元素则会触发 StopIteration 异常。
(3)栗子:
list = [1, 2, 3]
# 首先获得Iterator对象:
it = iter(list)
# 循环:
while True:
try:
# 获得下一个值:
x = next(it)
print(x)
except StopIteration:
# 遇到StopIteration就退出循环
break
#运行结果
===================== RESTART: C:/Users/pc/Desktop/n.py =====================
1
2
3
5.yield
有yield的函数是生成器。
调用函数得到一个生成器对象——>执行迭代器内的语句,直到碰到yield,此时返回一个迭代值,但并不退出(yield与return都是返回,但不同)——>下一次从yield的下一个语句开始执行,直到再遇到yield。
ps: 因为迭代器本身不知道自己要执行多少次,所以当没有下一个元素会触发 StopIteration 异常,此时也就是退出函数的时候了。