详解迭代器、可迭代对象、next()与iter()、生成器、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 异常,此时也就是退出函数的时候了。

发布了43 篇原创文章 · 获赞 46 · 访问量 4503

猜你喜欢

转载自blog.csdn.net/S_123789/article/details/101941756
今日推荐