设为首页 | 加入收藏 | 咨询微信
码奇编程
打造少儿编程“培训+开发”一站式服务品牌!
  • 少儿编程,让思维在数字世界自由
  • 少儿编程:家长又把宝押在这里!
  • Scratch趣味编程
  • Python创意编程
  • NOIP

首页>>学员天地

迭代器、可迭代对象和range对象,一网打尽!
编辑:Simon  阅读:701次  发布:21-11-22

一、迭代器和可迭代对象

当谈论 Python 中的迭代器(iterator)和可迭代对象(iterable)时,你很可能会听到有人重复 range 是迭代器的误解。我认为这是非常严重误解, 

在 Python 中,可迭代对象就是可以迭代的任何数据,如字串、列表、元组等,而迭代器则是执行迭代的代理。

Iterables are able to be iterated over. Iterators are the agents that perform the iteration.

1、可以使用iter函数从任何可迭代对象中获取迭代器:

     image.png

2、对于迭代器,可以用next()获得它的下一个元素,如果没有更多的元素了, 则会抛出一个stop iteration exception:

     image.png

3、所有的迭代器都是可迭代对象,因此可以从一个迭代器中得到一个迭代器,也可以遍历一个迭代器:

     image.png
    image.png

4、迭代器是有状态的,在循环遍历一次迭代器后,如果尝试再次循环,它将为空:

    image.png 

5、生成器是一种创建迭代器的简单方法:

     image.png

二、range对象

1、range对象(Python 2中的xrange)是可迭代对象,可以像任何其他可迭代对象一样循环使用:

     image.png

2、可以从range对象得到一个迭代器,即range迭代器对象,但 range 对象本身不是迭代器,所以不能在 range 对象上调用 next():

     image.png

3、遍历一个 range 对象,也不会“消耗”它的元素:

     image.png

4、range 对象和生成器的区别

     下面是一个 range 对象和一个生成器(是一种迭代器):

          image.png

     1)与生成器不同,range 对象有长度,并且可以被索引:

          image.png

     2)与生成器(迭代器)不同,可以询问range对象是否包含某元素而不改变他们的状态:

          image.png

5、什么range对象?

    range 对象从某种意义上说是“惰性的”,因为它不会生成创建时包含的每个数字,当我们在循环中需要的时候,它才将这些数字返回给我们。

    range 对象可以被称为懒序列,因为range 是序列(如列表,元组和字符串),但并不包含任何内存中的内容,而是通过计算来回答问题。


三、总结

1、如果可以循环遍历某个对象,这是一个可迭代对象(iterable)。

2、如果正在循环遍历的对象是在循环的时候计算出来,那么这是一个惰性可迭代对象(lazy iterable)。

3、如果可以传递一些东西给 next 函数,它就是一个迭代器(这是最常见的惰性可迭代对象)。

4、如果可以循环多次而不会“耗尽”,它不是一个迭代器。如果你不能将某些东西传递给 next 函数,那么它不是一个迭代器。 

5、range 对象不是迭代器。如果你正在指导别人关于 range 对象的知识,请不要使用“迭代器”一词,这会让人十分困惑,并可能导致他人开始滥用“迭代器”这个词。




上一篇: 50条有趣且实用的Python一行代码   下一篇: 彻底理解 Python 生成器
返回列表

更多..最新通告

为隆重庆祝南桥基地成功开业,现开展活动特惠广大学子。
Scratch、Python、C++、Spike机器人课均免费试听!

地址:南桥新世界广场

©2016-2020 上海码奇编程科创&科普中心 版权所有
奉贤区南桥新世界广场C区3楼324-325室(邮编:200333)
咨询:159-2192-6207  合作:13371929650 电邮:service@muchcode.top
《中华人民共和国电信与信息服务业务》经营许可证沪ICP备2021019270号