迭代是Python最强大的功能之一,是访问集合元素的一种方式。
一般分为可迭代对象,迭代器,可迭代对象不一定是迭代器,但迭代器一定是可迭代对象
1、可以直接作用于for循环的数据类型
  第一类:集合数据类型,如list、tuple、dict、set、str等;
  第二类:generator,包括集合定义generator和带yield的generator(也就是generator function)。
以上这些可以直接作用于for循环的对象统称为可迭代对象:Iterable。
可以使用isinstance()判断一个对象是否是Iterable对象:可迭代代对象一般内置__iter__()方法,或者是可以利用iter()函数转变为Iterator的对象,iter()为内置函数,作用是将可迭代对象转变为迭代器,而__iter__()继承于iter()
def iter(source, sentinel=None): # known special case of iter
"""
iter(iterable) -> iterator
iter(callable, sentinel) -> iterator Get an iterator from an object. In the first form, the argument must
supply its own iterator, or be a sequence.
In the second form, the callable is called until it returns the sentinel.
"""
pass
    def __iter__(self, *args, **kwargs): # real signature unknown
""" Implement iter(self). """
pass
from collections import Iterable
print(isinstance([], Iterable)) # True
print(isinstance({}, Iterable)) # True
print(isinstance((), Iterable)) # True
print(isinstance('abc', Iterable)) # True
print(isinstance(123, Iterable)) # Flase

2、迭代器(Iterator)

可以使用isinstace()判断一个对象是否是Iterator对象:

当一个可迭代对象调用__iter__()或者iter()后得到的就是一个迭代器对象,而迭代器对象可以通过__next__()或者next()方法进行取值,取值特点是,一次取出一个值,不能后退,当值取完时会抛出StopIteration异常

# 可迭代对象执行obj.__iter__()得到的结果就是迭代器对象
# 而迭代器对象指的是即内置有__iter__又内置有__next__方法的对象
# 以使用isinstance()判断一个对象是否是Iterator对象:
print(isinstance((x for x in range(10)), Iterator)) #True
print(isinstance([], Iterator)) # Flase
print(isinstance([].__iter__(), Iterator)) # True
print(isinstance({}, Iterator)) # Flase
print(isinstance(iter({}), Iterator)) # True
print(isinstance((), Iterator)) # Flase
print(isinstance('abc', Iterator)) # Flase

迭代器通过__next__()或者next()取值

l = [1, 2, 3]
l = l.__iter__()
print(l.__next__())
print(next(l))

迭代器的优缺点:

# 优点:
# - 提供一种统一的、不依赖于索引的迭代方式
# - 惰性计算,节省内存
# 缺点:
# - 无法获取长度(只有在next完毕才知道到底有几个值)
# - 一次性的,只能往后走,不能往前退

最新文章

  1. 【zz】面试题之寻找丢失的数字
  2. SQL Server提高事务复制效率优化(四)修改数据同步过程优化
  3. 【转】jQuery中.bind() .live() .delegate() .on()的区别
  4. web前端基础——jQuery编程进阶
  5. AIO、NIO、BIO
  6. MySQL 中随机抽样:order by rand limit 的替代方案
  7. JQ方法大全
  8. Docker 基本管理
  9. 【Loadrunner】初学Loadrunner——安装
  10. Microsoft.Identity的IPasswordHasher的默认实现与运用
  11. hasattr(obj,attr) 判断前面是否有后面的属性
  12. GetTypes Unable to load one or more of the requested types
  13. Vivox9怎么录制屏幕
  14. py-day2-5 python 百分号字符串拼接
  15. PAT 1039 到底买不买
  16. .Net Core之Swagger
  17. 第十一章 串 (c2)KMP算法:查询表
  18. IOS开发之无法选择模拟器显示NO Scheme
  19. 用jquery写的校验用户名
  20. Java精选笔记_面向对象(慨念、类和对象)

热门文章

  1. Luogu 4751 动态DP 模板
  2. location对象属性
  3. 003_Python3 基本数据类型
  4. 第四组团队git现场编程实战
  5. vue中封装一个倒计时
  6. postgresql数据的入门教程
  7. gradle的简单使用
  8. java.lang.IllegalStateException: Method get not annotated with HTTP method type (ex. GET, POST);
  9. cannot load from mysql.proc. the table is probably corrupted 解决办法
  10. THINKPHP扩展PHPEXCEL,PHP7.2以上版本无法导出Excel