完全理解python迭代对象_完全理解Python迭代对象、迭代器、生成器
1.assert:python assert断言是声明其布尔值必须为真的判定,如果发生异常就说明表达示为假。可以理解assert断言语句为raise-if-not,用来测试表示式,其返回值为假,就会触发异常。
2.
容器(container)
容器是一种把多个元素组织在一起的数据结构,
容器中的元素可以逐个地迭代获取,
可以用in, not in关键字判断元素是否包含在容器中。
通常这类数据结构把所有的元素存储在内存中
(也有一些特例,并不是所有的元素都放在内存,比如迭代器和生成器对象)在Python中,常见的容器对象有:
list, deque, ....
set, frozensets, ....
dict, defaultdict, OrderedDict, Counter, ....
tuple, namedtuple, …
str
容器比较容易理解,因为你就可以把它看作是一个盒子、一栋房子、一个柜子,里面可以塞任何东西。
从技术角度来说,当它可以用来询问某个元素是否包含在其中时,那么这个对象就可以认为是一个容器,
比如 list,set,tuples都是容器对象:
d = {1: 'foo', 2: 'bar', 3: 'qux'}
assert 1 in d
尽管绝大多数容器都提供了某种方式来获取其中的每一个元素,
但这并不是容器本身提供的能力,而是可迭代对象赋予了容器这种能力,
当然并不是所有的容器都是可迭代的,比如:Bloom filter,
虽然Bloom filter可以用来检测某个元素是否包含在容器中,但是并不能从容器中获取其中的每一个值,
因为Bloom filter压根就没把元素存储在容器中,而是通过一个散列函数映射成一个值保存在数组中。
可迭代对象(iterable)
>>> x = [1, 2, 3]
>>> y = iter(x)
>>> z = iter(x)
>>> next(y)
1
>>> next(y)
2
>>> next(z)
1
>>> type(x)
>>> type(y)
这里x是一个可迭代对象,可迭代对象和容器一样是一种通俗的叫法,
并不是指某种具体的数据类型,list是可迭代对象,dict是可迭代对象,
set也是可迭代对象。y和z是两个独立的迭代器,迭代器内部持有一个状态,
该状态用于记录当前迭代所在的位置,以方便下次迭代的时候获取正确的元素。
迭代器有一种具体的迭代器类型,比如list_iterator,set_iterator。
可迭代对象实现了__iter__方法,该方法返回一个迭代器对象。
迭代器(iterator)
那么什么迭代器呢?它是一个带状态的对象,他能在你调用next()方法的时候返回容器中的下一个值,
任何实现了__iter__和__next__()(python2中实现next())方法的对象都是迭代器,
__iter__返回迭代器自身,__next__返回容器中的下一个值,如果容器中没有更多元素了,
则抛出StopIteration异常,至于它们到底是如何实现的这并不重要。
所以,迭代器就是实现了工厂模式的对象,它在你每次你询问要下一个值的时候给你返回。
有很多关于迭代器的例子,比如itertools函数返回的都是迭代器对象。
生成器(generator)
生成器算得上是Python语言中最吸引人的特性之一,
生成器其实是一种特殊的迭代器,不过这种迭代器更加优雅。
它不需要再像上面的类一样写__iter__()和__next__()方法了,
只需要一个yiled关键字。 生成器一定是迭代器(反之不成立),
因此任何生成器也是以一种懒加载的模式生成值。用生成器来实现斐波那契数列的例子是:
完全理解python迭代对象_完全理解Python迭代对象、迭代器、生成器相关推荐
- python参数传递方法_深入理解python中函数传递参数是值传递还是引用传递
python 的 深入理解python中函数传递参数是值传递还是引用传递 目前网络上大部分博客的结论都是这样的: Python不允许程序员选择采用传值还是传 引用.Python参数传递采用的肯定是&q ...
- python文件对象是可以迭代的_详解python可迭代对象、迭代器和生成器
可迭代对象 什么是可迭代对象?顾名思义就是可以迭代的一个对象,再通俗点就是可以被for循环遍历的对象,如常用的list.str等数据类型.我们可以使用isinstance来判断这个数据是否是可迭代对象 ...
- python列表拆包_详解python 拆包可迭代数据如tuple, list
详解python 拆包可迭代数据如tuple, list 拆包是指将一个结构中的数据拆分为多个单独变量中. 以元组为例: >>> a = ('windows', 10, 25.1, ...
- 深入理解java虚拟机章节_深入理解java虚拟机-第六章
第6章 类文件 6.3 Class类文件的结构 Class文件是一组以8位字节为基础单位的二进制流. Class文件格式采用一种类似C语言结构伪结构存储数据,这种伪结构中只有两种数据类型:无符号数和表 ...
- python哪些是可变对象_什么是Python可变对象和不可变对象
什么是Python可变对象和不可变对象 发布时间:2020-07-22 09:59:15 来源:亿速云 阅读:60 作者:Leah 这篇文章运用简单易懂的例子给大家介绍什么是Python可变对象和不可 ...
- python 绘图类_关于创建自定义绘图对象-python中的类,有很好的教程吗? - python...
我想创建一个用于自定义绘图的对象类.我正在寻找有关如何创建自己的绘图对象的面向对象入门的好教程((可能仍在使用像matplotlib这样的库)? 例如. class myplot: def __ini ...
- python面向对象图片_趣味解读Python面向对象编程 (类和对象)
一.面向对象简介 考虑现实生活中,我们的思维方式是放在学生这个个人上,是学生做了自我介绍.而不是像我们刚刚写出的代码,先有了介绍的行为,再去看介绍了谁. 用我们的现实思维方式该怎么用程序表达呢?面向过 ...
- 深入理解java虚拟机 新生代_深入理解java虚拟机:笔记
1.运行时数据区域 1.程序计数器 当前线程执行字节码的行号指示器,字节码解释器工作通过改变这个计数器的值来选取下一条需要执行的字节码指令,每一个线程拥有独立的程序计数器,线程私有的内存 2.虚拟机栈 ...
- python zip函数_相当于Python的zip函数
下面是一个更时髦的ECMAScript 6版本:zip= rows=>rows[0].map((_,c)=>rows.map(row=>row[c])) 插图等价物到Python{z ...
最新文章
- NVIDIA® TensorRT™ supports different data formats
- 在CentOS 6.6 64bit上安装Oracle VirtualBox 5.0.12
- OpenGL实现flocking (聚集)实例
- 水晶报表各版本打包模块及相关文档
- oracle 试图访问已经在使用的事物处理临时表,解决ORA-14450:试图访问已经在使用的事务处理临时表...
- linux查看openjdk的安装的路径
- Martin Fowler 微服务的原文翻译(转载)
- linkedin api php,php – 如何使用linkedin api发送消息/通知?
- Android获取网页源代码
- 2021年主流CAD批量打印软件功能对比
- 增加项目报告功能,支持与TAPD、Jira、禅道双向同步缺陷,MeterSphere开源持续测试平台v1.15.0发布
- 云计算与大数据——云计算的特点
- 实战一个项目后,谈谈 Rust 语言的优点和缺点
- 敏捷(Agile)是什么?有哪些优缺点?敏捷落地需不需工具?
- linux系统下刻录u盘制作启动盘
- esp32 cam 配网 实现视频传输
- leetcode1079. 活字印刷(回溯)
- 让你的终端更漂亮——MAC OS 终端的设置
- LC463. 岛屿的周长
- 颜色类中英文词汇大全(2)
热门文章
- python可以用break作为变量名_Python初体验(一)—【配置环境变量】【变量】【input】【条件语句】【循环语句】...
- Xamarin Essentials教程地理定位Geolocation
- XamarinAndroid组件教程RecylerView适配器设置动画示例
- Web模糊测试工具Powerfuzzer
- qgc地面站如何导入离线地图_QGC地面站工具下载 QGroundControl(QGC地面站软件) v2018.11.02 免费安装版 下载-脚本之家...
- 简述python程序结构_python架构的概念讲解
- hbuilder前端需要的插件_最新web前端学习路线
- 灰色关联投影法python_python灰色关联算法(灰度关联算法)
- 皮克斯技术指导辞职读博:研究AI设计怪物,从《游戏王》卡牌开始
- AI预测RNA结构登上Science封面,论文一作已成立药物公司开始招人