python学习之【第十二篇】:Python中的迭代器
1.为何要有迭代器?
对于序列类型:字符串、列表、元组,我们可以使用索引的方式迭代取出其包含的元素。但对于字典、集合、文件等类型是没有索引的,若还想取出其内部包含的元素,则必须找出一种不依赖于索引的迭代方式,这就是迭代器。
2.什么是迭代器协议、可迭代对象、迭代器?
迭代器协议:
迭代器协议是指:对象必须提供一个next
方法,执行该方法要么返回迭代的下一项,要么就引起一个 StopIteration
异常,以终止迭代(只能往后走 不能往前推)。
可迭代对象:
实现了迭代器协议的对象称为可迭代对象Iterable。
实现方法:对象内部定义__iter__()
方法
迭代器:
可迭代对象执行了obj.__iter__()
后得到的结果就是迭代器,迭代器是即内置有__iter__
又内置有__next__
方法的对象。
3.Python中的for循环
3.1 for循环本质
由于字符串、列表、元组、字典、集合、文件等这些对象都不是迭代器,而在for
循环内部,调用了这些对象的__iter__()
方法,从而将这些对象变成了迭代器,然后调用迭代器的__next__
方法进行取值,并且for
循环最后会捕捉 StopIteration
异常,以终止迭代。
3.2 for循环工作原理
l = [1, 2, 3, 4, 5]
for i in l:
print(i)
以上这个for
循环其内部执行了如下操作:
- 执行
l.__iter__()
方法,得到一个迭代器对象iter_l
; - 执行
iter_l.__next__()
,将得到的值赋值给i
,然后执行循环体代码; - 重复过程2,直到捕捉到异常
StopIteration
,结束循环;
3.3 模拟for循环
# 模拟for循环
l = [1, 2, 3, 4, 5]
# 1.执行l.__iter__()方法,得到一个迭代器对象iter_l
iter_l = l.__iter__()
while True:
try:
# 2.执行iter_l.__next__(),将得到的值赋值给i,然后执行循环体代码;
i = iter_l.__next__()
print(i)
# 3.直到捕捉到异常StopIteration,结束循环
except StopIteration:
break
4.迭代器的优缺点
优点:
- 提供一种统一的、不依赖于索引的迭代方式
- 惰性计算,节省内存
缺点
- 无法获取长度(只有在next完毕才知道到底有几个值)
- 一次性的,只能往后走,不能往前退
(完)
python学习之【第十二篇】:Python中的迭代器的更多相关文章
- Python学习【第十二篇】模块(2)
序列化 1.什么是python序列化? 把变量从内存中变成可存储或传输的过程称之为序列化,在Python中叫pickling 序列化就是将python的数据类型转换成字符串 反序列化就是将字符串转换成 ...
- Python 学习笔记(十二)Python文件和迭代(一)
文件 文件和文件夹 文件:文本文件.二进制文件 文件夹:(windows) G:\pythonWorkspace\python\study (linux/mac) /home/workspace/py ...
- Python 学习笔记(十二)Python文件和迭代(二)
迭代 基本含义 迭代是重复反馈过程的活动,其目的通常是为了接近并到达所需的目标或结果.每一次对过程的重复被称为一次“迭代”,而每一次迭代得到的结果会被用来作为下一次迭代的初始值. 在计算科学中,迭代 ...
- python学习笔记(十二)python操作redis
1.python要操作redis 首先需要安装redis模块,然后导入才能使用 安装:pip install redis 导入:import redis 2.连接redis r = redis.Red ...
- MySQL学习【第十二篇事务中的锁与隔离级别】
一.事务中的锁 1.啥是锁? 顾名思义,锁就是锁定的意思 2.锁的作用是什么? 在事务ACID的过程中,‘锁’和‘隔离级别’一起来实现‘I’隔离性的作用 3.锁的种类 共享锁:保证在多事务工作期间,数 ...
- Python开发【第二十二篇】:Web框架之Django【进阶】
Python开发[第二十二篇]:Web框架之Django[进阶] 猛击这里:http://www.cnblogs.com/wupeiqi/articles/5246483.html 博客园 首页 ...
- Egret入门学习日记 --- 第十二篇(书中 5.1节 内容)
第十二篇(书中 5.1节 内容) 昨天把 第4章完成了. 今天来看第5章. 接下来是 5.1节 的内容. 总结一下 5.1节 的重点: 1.如何制作一个公用按钮皮肤. 跟着做: 重点1:如何制作一个公 ...
- Python学习笔记第十二周
目录: 数据库介绍 mysql 数据库安装使用 mysql管理 mysql 数据类型 常用mysql命令事务 索引 创建数据库 外键 增删改查表 权限 python 操作mysql ORM sqla ...
- Python之路(第十二篇)程序解耦、模块介绍\导入\安装、包
一.程序解耦 解耦总的一句话来说,减少依赖,抽象业务和逻辑,让各个功能实现独立. 直观理解“解耦”,就是我可以替换某个模块,对原来系统的功能不造成影响.是两个东西原来互相影响,现在让他们独立发展:核心 ...
- Python开发【第十二篇】python作用域和global nonlocal
python的作用域 作用域也叫名字空间,是访问变量时查找变量名的范围空间 python中的四个作用域 LEGB 作用域 英文解释 英文缩写 局部作用域 Local(function) L 外部嵌套函 ...
随机推荐
- 使用真机导致Androidstudio打印不出log
针对真机打印不出log这个问题,我具体的解决方案是这样: 1.你要确保你的Android studio中的菜单栏 ,Tools → Android → Enable ADB Integration这个 ...
- docker服务在Mac上的启动与使用
在mac上打开安装的docker软件就可以启动docker服务了 点击顶部状态栏中鲸鱼图标会弹出操作菜单,显示着服务的状态,如下图所示: 只有在docker服务启动了之后,才可以在终端使用docker ...
- B-概率论-极大似然估计
[TOC] 更新.更全的<机器学习>的更新网站,更有python.go.数据结构与算法.爬虫.人工智能教学等着你:https://www.cnblogs.com/nickchen121/ ...
- python编程基础之二十二
字典:字典属于可变对象,但是不属于序列,内部是通过哈希方式存储的,内部保存的是一个个键值对key:value 字典的键是唯一的, 字典查找速度比较快 d1 = {} #括号里面用键值对表示 d2 = ...
- Java求和的整体思路
一. 设计思想: 设计这个程序我们需要考虑到参数的输入,并且可以输入多个参数,以及为用户考虑到各种的边界问题.首先第一步我们应该给出输入参数的语句,让用户可以输入.第二步我们应对其进行参数个数的 ...
- ios手机通过fiddler抓去Https协议包时证书问题
解决Fiddler无法抓取ios端HTTPS请求的问题 南天E心 关注 2018.01.15 10:36 字数 281 阅读 909评论 0喜欢 0 近日公司服务升级,将所有的接口请求由HTTP升级为 ...
- 阿里云学生服务器+WordPress搭建个人博客
搭建过程: 第一步:首先你需要一台阿里云服务器ECS,如果你是学生,可以享受学生价9.5元/月 (阿里云翼计划:https://promotion.aliyun.com/ntms/act/campus ...
- 前端深入之css篇丨2020年前,彻底掌握css动画【animation】
写在前面 马上就2020年了,不知道小伙伴们今年学习了css3动画了吗? 说起来css动画是一个很尬的事,一方面因为公司用css动画比较少,另一方面大部分开发者习惯了用JavaScript来做动画,所 ...
- 面试官,Java8 JVM内存结构变了,永久代到元空间
在文章<JVM之内存结构详解>中我们描述了Java7以前的JVM内存结构,但在Java8和以后版本中JVM的内存结构慢慢发生了变化.作为面试官如果你还不知道,那么面试过程中是不是有些露怯? ...
- Unity 场景中看不到物体或者OnDrawGizmos画的线看不到
有时候,Unity中的场景里面,物体突然看不见了,可以这样做: 首先,在 Hierarchy 面板选择看不见的物体,按下快捷键 f.如果物体还是看不见,见下图: 看看图中圈红的地方.如果,如果 ...