python高级-迭代器(18)

2019-04-18 08:59:58来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折

一、什么是迭代器

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

 

二、可迭代对象

直接作?于 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异常.
  • 迭代器的优点:省内存.它是一种通过延时创建的方式生成一个序列,只有在需要的时候才被创建.
  • 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问结束,只能往前不能后退

 

 


原文链接:https://www.cnblogs.com/Se7eN-HOU/p/10715501.html
如有疑问请与原作者联系

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:侯哥的Python分享

下一篇:django apscheduler在特定时间执行一次任务(run at a specify ti