python---迭代器, for循环底层原理

2023-11-13

目录

何为迭代?

可迭代对象

迭代器对象

迭代器的优缺点

优点

缺点

for循环底层原理

迭代取值与索引取值对比


何为迭代?

迭代器即用来迭代取值的工具,而迭代是重复反馈过程的活动,其目的通常是为了逼近所需的目标或结果,每一次对过程的重复称为一次“迭代”,而每一次迭代得到的结果会作为下一次迭代的初始值,单纯的重复并不是迭代.

迭代其实就是更新换代, 每一次结果都是基于上一次的结果, eg: 游戏版本更新, 每次更新都是基于上一版本的迭代.

单纯的循环并不是迭代

 import time
 while True:
     print(123)
     time.sleep(0.1)

迭代

# 属于迭代
n = 1
while True:
    print(n)
    n += 1

迭代取值

# 迭代取值
l1 = [11, 22, 33, 44, 55]
n = 0
while n < len(l1):
    print(l1[n])
    n += 1

可迭代对象

通过索引的方式进行迭代取值,实现简单,但仅适用于序列类型:字符串,列表,元组。对于没有索引的字典、集合等非序列类型,必须找到一种不依赖索引来进行迭代取值的方式,这就用到了迭代器。

要想了解迭代器为何物,必须事先搞清楚一个很重要的概念:可迭代对象(Iterable)。从语法形式上讲,内置有__iter__方法的对象都是可迭代对象字符串、列表、元组、字典、集合、打开的文件都是可迭代对象:


 大白话理解就是数据可以通过点的方式点出来__iter__
 
 

迭代器对象

迭代器对象   即可迭代对象调用__iter__方法之后生成的结果就是迭代器对象迭代器对象的特征
   为含有__iter__方法和__next__方法.  迭代器对象能够极大的节省存储空间

    调用__next__方法即可进行迭代器对象取值 如果取完了则会直接报错!!!

  ps:开辟了一种不需要索引取值的方式(for循环底层依据的就是迭代器对象)
  '''有了迭代器对象才出现了针对字典和集合的迭代取值操作'''


迭代器对象补充说明
1.有很多双下方法其实都有简便写法 但不是全部
  """
  __方法名__  等价  方法名()
      最为常见的两个是
          __iter__    iter()
          __next__    next()

  """

2.有一些可迭代对象本身也是迭代器对象>>>:文件对象
3.可迭代对象调用一次__iter__方法编程迭代器对象  如果继续调用 结果还是迭代器对象本身.

# s = 'yietong'
# print(s.__iter__())   # <str_iterator object at 0x00000244D5EF90F0>
# print(iter(s))  # <str_iterator object at 0x000002D2DCA6C2E8>

res = s.__iter__()
res1 = s.__iter__().__iter__().__iter__()
print(res, res1)
# <str_iterator object at 0x000001AF30A290F0> <str_iterator object at 0x000001AF30A292E8>

4.迭代取值的要求
  print(s.__iter__().__next__())      每次先产生一个新的迭代器对象然后取值

s = 'yietong'
res = s.__iter__()
print(res.__iter__().__next__())
print(res.__iter__().__next__())
print(res.__iter__().__next__())
print(res.__iter__().__next__())
print(res.__iter__().__next__())
print(res.__iter__().__next__())
print(res.__iter__().__next__())

# y
# i
# e
# t
# o
# n
# g

迭代器的优缺点

基于索引的迭代取值,所有迭代的状态都保存在了索引中,而基于迭代器实现迭代的方式不再需要索引,所有迭代的状态就保存在迭代器中,然而这种处理方式优点与缺点并存:

优点

1、为序列和非序列类型提供了一种统一的迭代取值方式。

2、惰性计算:迭代器对象表示的是一个数据流,可以只在需要时才去调用__next__来计算出一个值,就迭代器本身来说,同一时刻在内存中只有一个值,因而可以存放无限大的数据流,而对于其他容器类型,如列表,需要把所有的元素都存放于内存中,受内存大小的限制,可以存放的值的个数是有限的。

缺点

1、除非取尽,否则无法获取迭代器的长度

2、只能取下一个值,不能回到开始,更像是‘一次性的’,迭代器产生后的唯一目标就是重复执行next方法直到值取尽,否则就会停留在某个位置,等待下一次调用next;若是要再次迭代同个对象,你只能重新调用iter方法去创建一个新的迭代器对象,如果有两个或者多个循环使用同一个迭代器,必然只会有一个循环能取到值。

for循环底层原理


    for 变量名 in 可迭代对象:
        循环体代码

1.会将in后面的数据调用__iter__()变成迭代器对象
    为什么文件对象也可以for循环 因为文件本身就是迭代器对象 再次调用不变

2.针对产生的迭代器对象依次调用__next__()方法迭代取值

3.当值取完之后 会自动处理报错并退出循环.

需求:不依赖于for循环 完成对列表元素的取值

l1 = [11,22,33,45,66,77]
res = l1.__iter__()
while True:
    print(res.__next__())

'''
11
22
33
45
66
77
Traceback (most recent call last):
  File "C:/me/JetBrains/pythonProject/迭代器/迭代器.py", line 185, in <module>
    print(res.__next__())
StopIteration
'''

for循环结合异常处理

res = 可迭代对象.__iter__()
while True:
  try:
      print(res.__next__)
  except StopIteration as e:
    break

迭代取值与索引取值对比

1.索引取值
   优势:可以反复获取相同的元素 并且没有固定的方向
  劣势:只能支持有序的容器类型 无序的无法取值兼容性没有迭代取值高
 
2.迭代取值
    优势:兼容所有的容器类型
  劣势:取值的顺序永远都是从左往右 并且无法重复获取 取完就完了
  # 真正底层的迭代取值后续可能很少用 一般都是for循环代替
"""
迭代器里面的东西是固定的 每取一个就会少一个 取完就空了
"""

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python---迭代器, for循环底层原理 的相关文章

随机推荐

  • 求整数的位数及各位数字之和 (15 分)

    7 5 求整数的位数及各位数字之和 15 分 对于给定的正整数N 求它的位数及其各位数字之和 输入格式 输入在一行中给出一个不超过10 9 的正整数N 输出格式 在一行中输出N的位数及其各位数字之和 中间用一个空格隔开 输入样例 321 输
  • 【Docker】Docker API的使用

    1 通过实训平台进入到操作系统界面 在 后输入vi usr lib systemd system docker service命令 进入编译模式 然后按i 小写 键 修改代码 usr bin dockerd current H tcp 0
  • 创建一维数组,长度为20,元素索引值为索引的二倍,奇数为负偶数为正,然后对数组排序

    import java util Arrays public class ArrayCreate public static void main String args int a new int 20 for int i 0 i lt 2
  • 单屏播放asf和vga文件的教学视频

    在自己的电脑上播放三分屏教学视频时 总觉得左边那两个小屏幕太占位置 还有右上方的小屏幕的播放进度条太短而无法精确拖放 虽然不是很懂HTML 但修改一下代码 还是单屏能播放的 下面是单屏播放asf和vga文件的设置 1 文件夹结构 index
  • CSS 实现七彩圆环loading动画

    前言 CSS 实现七彩圆环loading动画 速速来Get吧 1 实现效果 2 实现步骤 定义父容器宽度为 w 每个圆环之间的gap间距为 gap 圆环的border边框宽为 border root border 5px gap 30px
  • Java小练习——图书管理系统

    目录 一 图书管理系统应具备的功能 二 简单分析如何实现该系统 三 框架图 四 代码实现过程及简析 1 Book类 简析 2 BookShelf类 简析 3 IOperation接口 3 1 AddOperation类 3 2 Borrow
  • 离散事件模型

    离散事件模型通常需要用到队列和线性表 典型的例子是银行业务的模拟 本文参考的是严蔚敏的 数据结构 过程如下 用四个队列表示银行的四个窗口 用一个有序链表存储到达事件和离开事件 在初始化函数里面先初始化四个队列和一个链表 并且产生一个到达事件
  • 解决Eclipse添加新server时无法选择Tomcat7.0

    解决Eclipse添加新server时无法选择Tomcat7 0 新添加tomcat时 出现如下图情况 解决方法 这时打开工作空间目录下的 metadata plugins org eclipse core runtime settings
  • 面试题13. 机器人的运动范围(java+python)

    地上有一个m行n列的方格 从坐标 0 0 到坐标 m 1 n 1 一个机器人从坐标 0 0 的格子开始移动 它每次可以向左 右 上 下移动一格 不能移动到方格外 也不能进入行坐标和列坐标的数位之和大于k的格子 例如 当k为18时 机器人能够
  • 高级快速读入

    namespace fastIO define BUF SIZE 100000 fread gt read bool IOerror 0 inline char nc static char buf BUF SIZE p1 buf BUF
  • 考勤系统需求分析(软件工程)

    前言 随着企业人事管理的日趋复杂和企业人员的增多 企业的考勤管理变得越来越复杂 有一个比较完善的考勤管理系统显得是如此的重要 考勤管理系统是使用计算机管理方式代替以前手工处理的工作 应用计算机技术和通信技术建立一个高效率的 无差错的考勤管理
  • javascript 算法_JavaScript中的算法

    javascript 算法 The word Algorithms or Algo would impact fear in anyone who isn t really strong in maths like me Well toda
  • 2023年无人航空系统与航空航天国际会议(ICUASA 2023)

    2023年无人航空系统与航空航天国际会议 ICUASA 2023 重要信息 会议网址 www icuasa org 会议时间 2023年2月18 20日 召开地点 中国广州 截稿时间 2023年12月30日 录用通知 投稿后2周内 收录检索
  • 事物有哪些特性 ?MySQL 如何保证事物的四大特性 ?

    目录 1 事物有哪些特性 2 MySQL 如何保证事物的四大特性 3 事物的隔离级别 1 事物有哪些特性 1 1 何为事物 事物就是把一件事情的多个步骤 多个操作 打包成一个步骤 一个操作 其中任意一个步骤执行失败 都会进行回退 使影响降到
  • Linux df -h 显示磁盘空间满,但实际未占用满——问题分析

    问题现象 工作中遇到一个问题 在 TX2 系统上 告警提示磁盘空间不够 如图所示 wohu wohu df h Filesystem Size Used Avail Use Mounted on dev root 28G 28G 0 100
  • 关于个人vs调试时“字符串中字符无效“的处理办法

    一开始选中要监视的字符串那一行开始调试时出现字符串中字符无效 后来瞎猫碰到死耗子 选中被监视的下一行时竟然就可以了 希望对大家有帮助 不过原理我不太懂我也是个小白 希望评论区有大佬给我提点提点背后的原理是啥
  • Arnold置乱变换的代码实现与置乱度分析

    1 传统Arnold置乱变换算法简介 Arnold置乱变换 又称为cat映射 是一种基于古典密码体制的图像加密算法 本质上是对长宽相等的图像进行拉伸与折叠操作以改变空间中像素点的位置 从而破坏图像相邻像素点之间的相关性 它的安全性较低 易利
  • 递归查找三级菜单以及Stream流filter()与map()的用法

    查询策略 需求 查询三级菜单 按层级返回并排序 1 给实体类添加字段 用来封装子菜单 TableField exist false 不映射数据库字段 TableField exist false private List
  • Docker私有仓库部署记录

    Docker私有仓库部署记录 原创 一 介绍 1 SSL证书安装部署 2 准备docker环境 3 私有仓库不同方式的部署 二 CA证书安装部署 1 获取SSL证书 可以通过各种云平台购买 或者申请短期免费SSL证书 或者自签证书 再或者使
  • python---迭代器, for循环底层原理

    目录 何为迭代 可迭代对象 迭代器对象 迭代器的优缺点 优点 缺点 for循环底层原理 迭代取值与索引取值对比 何为迭代 迭代器即用来迭代取值的工具 而迭代是重复反馈过程的活动 其目的通常是为了逼近所需的目标或结果 每一次对过程的重复称为一