python中可迭代对象、迭代器、生成器
可迭代对象
关注公众号“轻松学编程”了解更多。
1、列表生成式
list = [result for x in range(m, n)]
g1 = (i for i in range(101))
print(type(g1))
print(g1)
print(g1.__next__())
输出:
<class 'generator'>
<generator object <genexpr> at 0x0000024E6AC08F10>
0
g1 = (i for i in range(11))
list1 = [i for i in g1]
print(list1)
输出:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
2、可迭代对象
1.可以直接作用于for循环的对象统称为可迭代对象,我们称之为:Iterator
2.我们可以使用isintance()判断一个对象是否是Iterator对象
3.可以直接作用于for循环的数据类型有以下几种
a.集合数据类型:如list、tuple、dict、set和string
b.生成器(generator):就是一个能返回迭代器的函数,其实就是定义一个迭代算法,可以理解为一个特殊的迭代器。
生成器:
通过列表生成式,我们可以直接创建一个列表,但是,受到内存限制,列表容量肯定是有限的,如果我们仅仅需要访问前面几个元素,如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器(Generator)
要创建一个generator,有很多种方法。第一种方法很简单,只要把一个列表生成式的[]改成(),就创建了一个generator。
g1 = (i for i in range(11))
print(g1)
for i in range(11):
print(next(g1),end='\t')
输出:
<generator object <genexpr> at 0x00000207F5C69678>
0 1 2 3 4 5 6 7 8 9 10
注意:使用Iterator判断的时候需要导入Iterable的包
from collections import Iterable
print(isinstance([],Iterable))
print(isinstance((),Iterable))
print(isinstance("",Iterable))
print(isinstance({},Iterable))
print(isinstance({1,2,3},Iterable))
print({1,2,3})
print(isinstance(1,Iterable))
print(isinstance(1.2,Iterable))
g1 = (i for i in range(101))
print(isinstance(g1,Iterable))
输出:
True
True
True
True
True
{1, 2, 3}
False
False
True
3、迭代器
迭代器:不但可以作用于for循环,还可以被next()函数不断调用并返回下一个值,
直到最后出现StopIteration错误,表示无法返回下一个值
可以被next()函数调用并不断返回下一个值的对象称为迭代器(Iterator对象)
可以使用isinstance()函数判断一个对象是否是Iterator对象。
注意:可迭代对象不一定是迭代器,但是迭代器一定是迭代对象。
可迭代对象与迭代器的关系:
可迭代对象包含迭代器
from collections import Iterator
print(isinstance([],Iterator))
print(isinstance((),Iterator))
print(isinstance("",Iterator))
print(isinstance({},Iterator))
print(isinstance({1,2,3},Iterator))
print({1,2,3})
print(isinstance(1,Iterator))
print(isinstance(1.2,Iterator))
g1 = (i for i in range(101))
print(isinstance(g1,Iterator))
输出:
False
False
False
False
False
{1, 2, 3}
False
False
True
4、生成器
跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。
在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值, 并在下一次执行 next() 方法时从当前位置继续运行。
调用一个生成器函数,返回的是一个迭代器对象。
以下实例使用 yield 实现斐波那契数列:
生成器:使用了 yield 的函数被称为生成器(generator)
import sys
def fibonacci(n): # 生成器函数 - 斐波那契
a, b, counter = 0, 1, 0
while True:
if counter > n:
return
yield a
a, b = b, a + b
counter += 1
if __name__ == '__main__':
f = fibonacci(10) # f 是一个迭代器,由生成器返回生成
while True:
try:
print(next(f), end=" ")
except StopIteration:
sys.exit()
输出:
0 1 1 2 3 5 8 13 21 34 55
5、 Iterator转换
可以通过Iter()函数将list、tuple、dict、string转换为Iterator对象。
from collections import Iterator
list1 = [i for i in range(11)]
print(isinstance(list1,Iterator))
iter1 = iter(list1)
print(isinstance(iter1,Iterator))
for i in range(11):
print(next(iter1),end='\t')
输出:
False
True
0 1 2 3 4 5 6 7 8 9 10
后记
【后记】为了让大家能够轻松学编程,我创建了一个公众号【轻松学编程】,里面有让你快速学会编程的文章,当然也有一些干货提高你的编程水平,也有一些编程项目适合做一些课程设计等课题。
也可加我微信【1257309054】,拉你进群,大家一起交流学习。
如果文章对您有帮助,请我喝杯咖啡吧!
公众号


关注我,我们一起成长~~
python中可迭代对象、迭代器、生成器的更多相关文章
- 深入理解python中可迭代对象,迭代器,生成器
英文原文出处:Iterables vs. Iterators vs. Generators 在python学习中,通常会陷入对以下几个相关概念之间的确切差异的困惑中: a container(容器) ...
- 可迭代对象&迭代器&生成器
在python中,可迭代对象&迭代器&生成器的关系如下图: 即:生成器是一种特殊的迭代器,迭代器是一种特殊的可迭代对象. 可迭代对象 如上图,这里x是一个列表(可迭代对象),其实正如第 ...
- python 可迭代对象 迭代器 生成器总结
可迭代对象 只要有魔法方法__iter__的就是可迭代对象 list和tuple和dict都是可迭代对象 迭代器 只要有魔法方法__iter__和__next__的就是可迭代对象 生成器 只要含有y ...
- 【Python】【容器 | 迭代对象 | 迭代器 | 生成器 | 生成器表达式 | 协程 | 期物 | 任务】
Python 的 asyncio 类似于 C++ 的 Boost.Asio. 所谓「异步 IO」,就是你发起一个 IO 操作,却不用等它结束,你可以继续做其他事情,当它结束时,你会得到通知. Asyn ...
- Python--可迭代对象,迭代器,生成器
记得在刚开始学Python的时候,看到可迭代对象(iterable).迭代器(iterator)和生成器(generator)这三个名词时,完全懵逼了,根本就不知道是啥意识.现在以自己的理解来详解下这 ...
- Python中的装饰器,迭代器,生成器
1. 装饰器 装饰器他人的器具,本身可以是任意可调用对象,被装饰者也可以是任意可调用对象. 强调装饰器的原则:1 不修改被装饰对象的源代码 2 不修改被装饰对象的调用方式 装饰器的目标:在遵循1和2的 ...
- python中的装饰器迭代器生成器
装饰器: 定义:本质是函数(装饰其它函数) 为其它函数添加附加功能 原则: 1 不能修改被装饰函数源代码 2 不修改被装饰函数调用方式 实现装饰器知识储备: 1 函数即‘’变量‘’ 2 高阶函数 ...
- Python中可迭代对象是什么?
Python中可迭代对象(Iterable)并不是指某种具体的数据类型,它是指存储了元素的一个容器对象,且容器中的元素可以通过__iter__( )方法或__getitem__( )方法访问. __i ...
- Python之可迭代对象、迭代器、生成器
在使用Python的过程中,很容易混淆如下几个关联的概念: 1.容器(container) 2.可迭代对象(Iterable) 3.迭代器(Iterator) 4.生成器(generator) 5.生 ...
随机推荐
- MySQL 8.0索引合并
简介 参考https://dev.mysql.com/doc/refman/8.0/en/index-merge-optimization.html#index-merge-intersection. ...
- shiro认证流程源码分析--练气初期
写在前面 在上一篇文章当中,我们通过一个简单的例子,简单地认识了一下shiro.在这篇文章当中,我们将通过阅读源码的方式了解shiro的认证流程. 建议大家边读文章边动手调试代码,这样效果会更好. 认 ...
- C++库文件解析(conio.h)
转载:https://blog.csdn.net/ykmzy/article/details/51276596 Conio.h 控制台输入输出库该文内容部分参照百度百科 Conio.h 在C stan ...
- Matlab中加汉明窗 ahmming 作用
转自:http://www.cnblogs.com/lxy2017/p/4049124.html 1.什么是汉明窗? 语音信号一般在10ms到30ms之间,我们可以把它看成是平稳的.为了处理语音信号, ...
- 【SSO】一个简单的单点登录演示实现
业务系统的管理后台往往数量众多,且各自需要一套用户名密码来进行登录,不方便使用.因此花了点时间研究如何实现一套单点登录系统. 众所周知,SSO系统设计中,往往需要想办法解决cookie不能跨域的问题, ...
- Brew error: Could not symlink, path is not writable
As explained here by Rick: Start with brew doctor which will show you errors with your brew setup. Y ...
- 实验五 css进阶应用
实验五 css进阶应用 实验目的: 掌握CSS在列表中的应用,能利用CSS将列表做成精美的导航栏: 掌握CSS在表单元素中的应用: 掌握SPRY菜单的制作方法和CSS代码修改. 实验内容: 1. 制作 ...
- linux centos 03
linux用户权限相关 root用户 相当于qq群的群主 sudo命令 相当于qq群的管理员 普通用户 相当于qq群的 水军 超级用户root的UID是 0 组ID也是 0 普通用户的UID ...
- python算法常用技巧与内置库
python算法常用技巧与内置库 近些年随着python的越来越火,python也渐渐成为了很多程序员的喜爱.许多程序员已经开始使用python作为第一语言来刷题. 最近我在用python刷题的时候想 ...
- 【Luogu】P3005 [USACO10DEC]槽的游戏The Trough Game
一.题目 题目描述 农夫约翰和贝西又在玩游戏.这个游戏需要很多个槽. 农夫约翰在谷仓里藏起来了N(1<=N<=20)个槽,并且他已经把其中的一些装上了食物.贝西以"在这个表里(表 ...