一、基本概念

迭代(Iteration)动词,是指通过遍历获取某容器内所有元素,特指遍历获取这个动作。

可迭代 (iterable)形容词,是指某容器可被遍历获取内部所有元素,特指容器内元素可被遍历获取的特性。

在python中包含__iter__方法的对象就是可迭代的。

  • 可迭代对象一般指某容器可被循环遍历获取内部所有元素,该容器有__iter__方法和__getitem__,无__next__方法。
  • 可迭代对象常见的有str、list、tuple、set、dict等。

迭代器 (iterator)名词,特指某种特殊的容器,该容器内所有元素可通过__next__方法依次获取

在python中包含__iter__方法和__next__方法的对象就是迭代器。

  • 迭代器一般指某容器可通过__next__方法依次获取内部所有元素,该容器有__iter__方法和__next__,无__getitem__方法。
  • 迭代器常见的有文件句柄以及通过iter()转换的对象和迭代器生成式生成的对象等。
  • 生成器,是一种特殊的迭代器,生成器自动生成了__iter__方法和__next__,不需要再手动生成。

可迭代、可迭代对象、迭代器关系图

二、区分可迭代对象与迭代器的方法

  1. 判断一个对象是可迭代对象,可以通过查看该对象是不是有__iter__方法和__getitem__方法来鉴别。
# 字符串:可迭代对象s1 = '努力学python,坚持认真学python'print('*' * 10, '判断字符串iter、getitem、next', '*' * 10)print('iter:', '__iter__' in dir(s1))print('getitem:', '__getitem__' in dir(s1))print('next:', '__next__' in dir(s1))# 列表:可迭代对象l1 = [i for i in range(10)]print('*' * 10, '判断列表iter、getitem、next', '*' * 10)print('iter:', '__iter__' in dir(l1))print('getitem:', '__getitem__' in dir(l1))print('next:', '__next__' in dir(l1))out:********** 判断字符串iter、getitem、next **********iter: Truegetitem: Truenext: False********** 判断列表iter、getitem、next **********iter: Truegetitem: Truenext: False
  1. 判断一个对象是不是迭代器,可以通过查看该对象是不是有__iter__方法和__next__方法来鉴别。
# 字符串迭代器s2 = iter(s1)print('*' * 10, '判断字符串迭代器iter、getitem、next', '*' * 10)print('iter:', '__iter__' in dir(s2))print('getitem:', '__getitem__' in dir(s2))print('next:', '__next__' in dir(s2))# 列表迭代器l2 = iter(l1)print('*' * 10, '判断列表迭代器iter、getitem、next', '*' * 10)print('iter:', '__iter__' in dir(l2))print('getitem:', '__getitem__' in dir(l2))print('next:', '__next__' in dir(l2))out:********** 判断字符串迭代器iter、getitem、next **********iter: Truegetitem: Falsenext: True********** 判断列表迭代器iter、getitem、next **********iter: Truegetitem: Falsenext: True
  1. 可以自定义一个简单的lambda表达式来判断是可迭代对象还是迭代器。
is_er = lambda x: '__iter__' in dir(x) and '__getitem__' in dir(x)is_or = lambda x: '__iter__' in dir(x) and '__next__' in dir(x)s1 = '努力学python,坚持认真学python's2 = iter(s1)print('s1是可迭代对象吗?', is_er(s1))print('s1是迭代器吗?', is_or(s1))print('s2是可迭代对象吗?', is_er(s2))print('s2是迭代器吗?', is_or(s2))out:s1是可迭代对象吗? Trues1是迭代器吗? Falses2是可迭代对象吗? Falses2是迭代器吗? True

三、可迭代对象与迭代器的优劣比较

可迭代对象的优点:

  1. 访问速度快。
  2. 访问方式灵活,可多次、重复、任意选择范围访问。
  3. 内置方法和函数比较多。

可迭代对象的缺点:

  1. 耗费内存。
  2. 取值过于灵活(有时会引起报错,如index out of range、TypeError等)。

迭代器的优点:

  1. 节省内存。
  2. 惰性取值(一次固定取一条数据,直到取值完毕报StopIteration,不会引发报错)。

迭代器的缺点:

  1. 访问速度慢。
  2. 访问方式死板,只能访问下一条不能访问上一条。
  3. 内置方法和函数比较少。

比较可迭代对象与迭代器的优缺点。

四、可迭代对象与迭代器如何选择

  • 在存储数据相对少(8g内存可承受几百万个对象),侧重对数据灵活处理时,将数据集设为可迭代对象更好。
  • 当数据量大到足以撑爆内存(几千万甚至上亿个对象时),侧重节省内存时,将数据集设为迭代器更好。

可迭代对象、迭代器两种方式怎么选?

python 怎么算l2范数_python之彻底搞懂迭代、可迭代、迭代器的区别(一)相关推荐

  1. python 怎么算l2范数_向量范数与矩阵范数(L0, L1, L2)

    直观理解 在实数域中,数的大小和两个数之间的距离是通过绝对值来度量的.在解析几何中,向量的大小和两个向量之差的大小是"长度"和"距离"的概念来度量的.为了对矩阵 ...

  2. python 怎么算l2范数_数学推导+纯Python实现机器学习算法13:Lasso回归

    版权说明:本公号转载文章旨在学习交流,不用于任何商业用途,版权归原作者所有,如有异议,敬请后台联络我们,议定合作或删除,我们将第一时间按版权法规定妥善处理,非常感谢! Python机器学习算法实现 A ...

  3. python 怎么算l2范数,回归模型中成本函数的L1范数而不是L2范数

    I was wondering if there's a function in Python that would do the same job as scipy.linalg.lstsq but ...

  4. python怎么算一元二次方程_python如何解一元二次方程

    本文收集整理关于python如何解一元二次方程的相关议题,使用内容导航快速到达. 内容导航: Q1:python 使用try except解一元二次方程问题 123456789101112131415 ...

  5. python怎么算二元一次方程_python如何拟合二元一次方程?

    import numpy as np from scipy import optimize# 最小二乘法拟合 import matplotlib.pyplot as plt # python matp ...

  6. python怎么算一元二次方程_Python求一元二次方程解

    题目: 请定义一个函数 'quadratic(a,b,c)',接收三个参数,返回一元二次方程: ax² + bx + c = 0 的两个解.(提示:计算平方根可以调用math.sqrt()函数) im ...

  7. python中x y表示_Python中表达式x += y和x = x+y 的区别详解

    前言 本文主要给大家介绍的是关于Python中表达式x += y和x = x+y 区别的相关内容,分享出来供大家参考学习,下面来看看详细的介绍: 直接看下面代码: x +=y In [66]: id( ...

  8. python字典items返回什么_Python 字典items返回列表,iteritems返回迭代器

    说明:items以列表方式返回字典中的键值对,iteritems以迭代器对象 返回键值对儿(Python3中不再支持): 字典items()方法和iteritems()方法,是python字典的内建函 ...

  9. python飞机大战联网版_Python 飞机大战搞怪版本

    python 飞机大战搞怪版本 (飞机为迷你亚索,外星人为迷你小诺手,由于时间关系和图片素材较难寻找,仅仅做了简易版,没有贴上背景图片.由于篇幅原因,对于函数讲解较为简略,可以自行搜索相应函数的用法) ...

最新文章

  1. ant table表格整行点击事件并获取当前行的数据
  2. Java面试通关要点汇总集之核心篇参考答案
  3. 移动端重构系列1——前期准备工作
  4. c语言命令行选项处理函数getopt和getopt_long() 函数使用
  5. C++结构与联合有和区别?
  6. java 枚举类型 构造函数及用法
  7. java servlet是接口_JavaWeb:Servlet 接口
  8. 使用MyQ打开车库门时如何接收警报
  9. composer 更改为中国镜像
  10. 将Python和R整合进一个数据分析流程
  11. 推荐几个好的粉碎文件的软件?这3款软件让你彻底摆脱无法删除文件的烦恼
  12. WordPress网站配置腾讯云cdn缓存
  13. 提示“The selection cannot be launched, and there are no recent launches.”
  14. android文件管理器u盘,Android U盘文件显示在文件管理器
  15. Spring Boot之定时任务
  16. Adobe Flash cs5正式版发布
  17. C++编程之模板与泛型
  18. ENGLISH资料收集(18)-蔬菜名
  19. java 项目测试_项目测试工作流程
  20. 基于Airtest陀螺世界辅助源代码

热门文章

  1. [CTSC2018]暴力写挂
  2. 笔记|软件调试的技巧
  3. centos7忘记root密码重置
  4. SpringBoot日记——日志框架篇
  5. Matlab图像处理应用举例2
  6. spring boot 多数据源分布式事务处理
  7. protobuf 编码实现解析(java)
  8. [原]敏捷开发-项目启动
  9. Composition or inheritance for delegating page methods?
  10. php.ini 设置内存,php.ini怎么进行内存设置