python高级-迭代器(18)

1、什么是迭代器

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

 

2、可迭代对象

直接做⽤于 for 循环的数据类型有如下⼏种:函数

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

这些能够直接做⽤于 for 循环的对象统称为可迭代对象: Iterable工具

 

3、判断是否能够迭代

能够使⽤ isinstance() 判断⼀个对象是不是 Iterable 对象:spa

#从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))

运行结果为:code

True
True
True
True
False

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

 

4、迭代器

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

#从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

注意:ci

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

 

5、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))

运行结果为:generator

False
False
True
True

 

6、使用迭代器完成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异常.
  • 迭代器的优势:省内存.它是一种经过延时建立的方式生成一个序列,只有在须要的时候才被建立.
  • 迭代器对象从集合的第一个元素开始访问,直到全部的元素被访问结束,只能往前不能后退
相关文章
相关标签/搜索