python高级-迭代器(18)

2023-01-31 00:01:13 python 高级

一、什么是迭代器

  • 迭代是访问集合元素的⼀种⽅式。
  • 迭代器是⼀个可以记住遍历的位置的对象。
  • 迭代器对象从集合的第⼀个元素开始访问,直到所有的元素被访问完结束。
  • 迭代器只能往前不会后退

 

二、可迭代对象

直接作⽤于 for 循环的数据类型有以下⼏种:

  • ⼀类是集合数据类型:如 list 、 tuple 、 dict 、 set 、 str 等;
  • ⼀类是generator ,包括⽣成器和带 yield 的generator function。

这些可以直接作⽤于 for 循环的对象统称为可迭代对象: Iterable

 

三、判断是否可以迭代

可以使⽤ isinstance() 判断⼀个对象是否是 Iterable 对象:

#从collections.abc模块导入Iterable工具
from collections.abc import Iterable
#判断列表是否可以迭代
print(isinstance([],Iterable))
#判断字典是否可以迭代
print(isinstance({},Iterable))
#判断生成器是否可以迭代
print(isinstance((x for x in range(1,10)),Iterable))
#判断字符串是否可以迭代
print(isinstance("abc",Iterable))
#判断整形是否可以迭代
print(isinstance(100,Iterable))

运行结果为:

True
True
True
True
False

可以看出,列表、字典、生成器、字符串都是可以被迭代的,而整形常量不可以被迭代

 

四、迭代器

可以被next()函数调⽤并不断返回下⼀个值的对象称为迭代器:Iterator。
可以使⽤ isinstance() 判断⼀个对象是否是 Iterator 对象:

#从collections.abc模块导入Iterator工具
from collections.abc import Iterator
#判断列表是否可以迭代
print(isinstance([],Iterator))
#判断字典是否可以迭代
print(isinstance({},Iterator))
#判断生成器是否可以迭代
print(isinstance((x for x in range(1,10)),Iterator))
#判断字符串是否可以迭代
print(isinstance("abc",Iterator))
#判断整形是否可以迭代
print(isinstance(100,Iterator))

运行结果为:

False
False
True
False
False

注意:

  • 判断是否可以被迭代使用的是 Iterable,而判断是否是迭代器使用的是 Iterator,不一样的 。
  • 生成器也是迭代器
  • 列表、字典、字符串虽然可以被迭代,但是不是迭代器,这就说明了,迭代器一定可以迭代,但是可以迭代的不一定是迭代器。这个道理就和鱼会游泳,但是会游泳的不一定是鱼,一个道理。

 

五、iter()函数

⽣成器是迭代器对象,但列表、字典 、字符串虽然是可迭代的,却不是迭代器。把列表、字典、字符串等可迭代对象变成迭代器可以使⽤ iter() 函数:

#从collections.abc模块导入Iterator工具
from collections.abc import Iterator
#没有使用iter()函数
print(isinstance([],Iterator))
print(isinstance("abc",Iterator))

#使用iter()函数
print(isinstance(iter([]),Iterator))
print(isinstance(iter("abc"),Iterator))

运行结果为:

False
False
True
True

 

六、使用迭代器完成for循环的底层实现

for x in [1,2,3,4,5]:
    print(x)

#完全等价于

# 首先获得Iterator对象:
it = iter([1, 2, 3, 4, 5])
# 循环:
while True:
    try:
        # 获得下一个值:
        x = next(it)
        print(x)
    except StopIteration:
        # 遇到StopIteration就退出循环
        break

总结

 

  • 凡是可作⽤于 for 循环的对象都是 Iterable 类型;
  • 凡是可作⽤于 next() 函数的对象都是 Iterator 类型
  • 集合数据类型如 list 、 dict 、 str 等是 Iterable 但不是 Iterator ,不过可以通过 iter() 函数获得⼀个 Iterator 对象。
  • 迭代器对象就是实现了iter() 和 next()方法的对象.其中iter()返回迭代器本身,而next()返回容器的下一个元素,在结尾处引发StopInteration异常.
  • 迭代器的优点:省内存.它是一种通过延时创建的方式生成一个序列,只有在需要的时候才被创建.
  • 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问结束,只能往前不能后退

 

 

相关文章