Python练习 | Python 可迭代对象 迭代器
博主github:https://github.com/MichaelBeechan
博主CSDN:https://blog.csdn.net/u011344545
在使用Python的过程中,很容易混淆如下几个关联的概念:
1.容器(container)
2.可迭代对象(Iterable)
3.迭代器(Iterator)
4.生成器(generator)
5.生成器表达式
6.{list, set, dict} 解析式
它们之间的关系如下表所示:
容器(container)
容器是用来储存元素的一种数据结构,它支持隶属测试,容器将所有数据保存在内存中,在Python中典型的容器有:
list, deque, …
set,frozesets,…
dict, defaultdict, OrderedDict, Counter, …
tuple, namedtuple, …
str
容器相对来说很好理解,因为你可以把它当成生活中的箱子、房子、船等等。
一般的,通过判断一个对象是否包含某个元素来确定它是否为一个容器。例如:
字典容器通过检查是否包含键来进行判断:
字符串通过检查是否包含某个子 串来判断:
注意:并非所有的容器都是可迭代对象。
可迭代对象
正如前面所提到的,大部分容器都是可迭代的,但是还有其他一些对象也可以迭代,例如,文件对象以及管道对象等等,容器一般来说存储的元素是有限的,同样的,可迭代对象也可以用来表示一个包含有限元素的数据结构。
可迭代对象可以为任意对象,不一定非得是基本数据结构,只要这个对象可以返回一个iterator。听起来可能有点费解,但是可迭代对象与迭代器之间有一个显著的区别。先看下面的例子
注意:可迭代的类中,一般实现以下两个方法,__iter__()以及__next()__方法,__iter__()方法返回self。
当我们运行以下代码的时候:
1 2 3 |
x = [1,2,3] for elem in x: ... |
实际调用过程如下:
当我们反向编译这段代Python码的时候,可以发现它显示调用了 GET_ITER,本质上跟调用iter(x)一样,而FOR_ITER指令相等于调用next()方法来获取每个元素。
>>> import dis
>>> x = [1,2,3]
>>> dis.dis('for _ in x: pass')
1 0 SETUP_LOOP 12 (to 14)
2 LOAD_NAME 0 (x)
4 GET_ITER
>> 6 FOR_ITER 4 (to 12)
8 STORE_NAME 1 (_)
10 JUMP_ABSOLUTE 6
>> 12 POP_BLOCK
>> 14 LOAD_CONST 0 (None)
16 RETURN_VALUE
迭代器(Iterators)
那么什么是迭代器呢?任何具有__next__()方法的对象都是迭代器,对迭代器调用next()方法可以获取下一个值。而至于它使如何产生这个值的,跟它能否成为一个迭代器并没有关系。所以迭代器本质上是一个产生值的工厂,每次向迭代器请求下一个值,迭代器都会进行计算出相应的值并返回。
迭代器的例子很多,例如,所有itertools模块中的函数都会返回一个迭代器,有的还可以产生无穷的序列。
有的函数根据有限序列中生成无限序列:
2 3 4 5 6 7 8 9 10 |
>>> from itertools import cycle >>> colors = cycle(["red","white","blue"]) >>> next(colors) "red" >>> next(colors) "white" >>> next(colors) "blue" >>> next(colors) "red" |
有的函数根据无限序列中生成有限序列:
>>> from itertools import islice
>>> colors = cycle(['red', 'white', 'blue']) # infinite
>>> limited=islice(colors,0, 4) # finite
>>> for x in limited: # so safe to use for-loop on
... print(x)
red
white
blue
Red
为了更好的理解迭代器的内部结构,我们先来定义一个生成斐波拉契数的迭代器:
>>> class fib:
... def __init__(self):
... self.prev = 0
... self.curr = 1
...
... def __iter__(self):
... return self
...
... def __next__(self):
... value = self.curr
... self.curr += self.prev
... self.prev = value
... return value
...
>>> f = fib()
>>> list(islice(f, 0, 10))
[1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
注意这个类既是可迭代的 (因为具有__iter__()方法),也是它自身的迭代器(因为具有__next__()方法)。
迭代器内部状态保存在当前实例对象的prev以及cur属性中,在下一次调用中将使用这两个属性。每次调用next()方法都会执行以下两步操作:
修改状态,以便下次调用next()方法
计算当前调用的结果
比喻:从外部来看,迭代器就像政府工作人员一样,没人找他办事的时候(请求值),工作人员就闲着,当有人来找他的时候(请求值),工作人员就会忙一会,把请求的东西找出来交给请求的人。忙完之后,又没事了,继续闲着。
生成器
生成器其实就是一种特殊的迭代器。它shi一种更为高级、更为优雅的迭代器。
使用生成器让我们可以以一种更加简洁的语法来定义迭代器。
让我们先明确以下两点:
任意生成器都是迭代器(反过来不成立)
任意生成器,都是一个可以延迟创建值的工厂
下面也是一个生成斐波那契序列的工厂函数,不过是以生成器的方式编写的:
生成器的类型
在Python中两种类型的生成器:生成器函数以及生成器表达式。生成器函数就是包含yield参数的函数。生成器表达式与列表解析式类似。
Python练习 | Python 可迭代对象 迭代器相关推荐
- 【Python】【容器 | 迭代对象 | 迭代器 | 生成器 | 生成器表达式 | 协程 | 期物 | 任务】...
Python 的 asyncio 类似于 C++ 的 Boost.Asio. 所谓「异步 IO」,就是你发起一个 IO 操作,却不用等它结束,你可以继续做其他事情,当它结束时,你会得到通知. Asyn ...
- python 函数可以作为容器对象的元素_11.Python初窥门径(函数名,可迭代对象,迭代器)...
python(函数名,可迭代对象,迭代器) 一.默认参数的坑 # 比较特殊,正常来说临时空间执行结束后应该删除,但在这里不是. def func(a,l=[]): l.append(a) return ...
- Python要想学得好,【容器/可迭代对象/迭代器/生成器】少不了,稳扎稳打学Python!
在刚开始学Python的时候,是不是经常会听到大佬们在讲容器.可迭代对象.迭代器.生成器.列表/集合/字典推导式等等众多概念,其实这不是大佬们没事就搁那扯专业术语来装B,而是这些东西都得要明白的,光知 ...
- 【python笔记】可迭代对象和迭代器
可迭代对象:简单来说,一般能用for循环遍历的对象都被称为可迭代对象 迭代器属于可迭代对象,当使用for语句是,for语句会通过__iter__()方法获得对象的迭代器, 并通过__next__()方 ...
- Python基础9——可迭代对象
17可迭代对象 list 是一个迭代对象 可以通过 for - in - 这类语句遍历读取数的对象称之为可迭代对象 li = [1,2,3]for i in li:print(i) 17.1 什么是可 ...
- python中可迭代对象_什么是python中的可迭代对象(iterable object)?
我们经常在打印报错信息中和英文的文档中看到iter这个词根,可以组合成iterable/iterate等派生词.这个iter可以翻译成"迭代",这样iterable object的 ...
- 传入json对象_【Python基础】可迭代对象amp;迭代器对象及其实现
可迭代对象 首选确保for循环的in后面是一个可迭代对象,这样就能通过python内置函数iter()得到一个迭代器对象(iterator) 我们分别把列表list_test和字符串str_test分 ...
- 怎么确定迭代器后面还有至少两个值_如何理解Python中的可迭代对象、迭代器和生成器
▍前言 在讨论可迭代对象.迭代器和生成器之前,先说明一下迭代器模式(iterator pattern),维基百科这么解释: 迭代器是一种最简单也最常见的设计模式.它可以让用户透过特定的接口巡访容器中的 ...
- python可迭代对象 迭代器生成器_Python可迭代对象、迭代器和生成器
8.1 可迭代对象(Iterable) 大部分对象都是可迭代,只要实现了__iter__方法的对象就是可迭代的. __iter__方法会返回迭代器(iterator)本身,例如: >>&g ...
最新文章
- 【HDU - 2516 】取石子游戏 (Fibonacci博弈)
- vba转换为vbs的方法_vba代码改成vbs,该怎么解决(4)
- 2021年呼和浩特高考段考成绩查询,2019届呼和浩特市高三段考成绩排名分析
- WEB安全基础-WEB介绍
- DeepLearning | Tensorflow编程基础:Session、Constant、Variable、Tensor、Placeholder、OP
- Shell in AIX Web端 自动远程执行重启tomcat服务命令
- Prism4翻译笔记(二)第二章:初始化Prism应用程序
- SQL日期格式化处理
- Caffe 的深度学习训练全过程
- Javascript特效代码大全(420个)(转)
- 计算机app无法删除,文件夹删不掉怎么办?
- 类人猿易语言云控系统开发 + 附加安卓模拟器中控+ 内存操控 系列课程
- vertica rebalance优化
- 可以批量制作吊牌标签上的条码标签打印软件
- [MIT]微积分重点 第十七课 六函数、六法则和六定理 学习笔记
- 修改jar包中class文件
- 多元函数泰勒级数展开_一元及多元函数的泰勒展开式
- 手把手搭建SSM框架
- 长途枢纽大楼综合布线系统
- inet_addr报错