详解迭代器、可迭代对象、next()与iter()、生成器、yield

mac2022-06-30  26

文章目录

1.什么是迭代器(Iterator) ?2.什么是可迭代对象 (Iterable) ?小结 3.是否是迭代器OR可迭代对象的判断方式4.Python中和迭代有关的两个函数next()和iter()5.yield

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 异常,此时也就是退出函数的时候了。

最新回复(0)