python的生成器与迭代器和可迭代对象
来简单的说下python中的生成器和可迭代对象以及迭代器的问题。只是简单地记录一下并不涉及太深入的内容。
首先来说一下什么是生成器,先看下面的代码:
#_*_ coding:utf-8 _*_ result = (x for x in range(10)) '''
下面print的打印结果
<generator object <genexpr> at 0x0000026FA092B360>
'''
print(result)
上面的这种代码其实就是生成器,而通过print也发现,我们无法打印出计算出来的结果。
而如果想要计算结果的话,只能通过两种方式,next()方法和for循环。看下面的代码:
result = (x for x in range(10)) print(next(result)) # 0
print(next(result)) #
.
.
.
print(next(result)) # 9 # 如果在已经将生成器中的值全部取出后,那么久会产生一个StopIteration错误
print(next(result)) # StopIteration print("===============================") # 最简单取出生成器值的方式就是使用for循环,同时可以避免异常
for x in result:
print(x)
下面在来说一下可迭代对象:
简单的说,可以直接作用于for循环的对象都可以称之为可迭代对象(Iterable)。
例如上面我们说的生成器,就是一个可迭代对象。
在很多常用的数据类型里面,例如:list,dict,tuple,set,str 还有generator 这些都是可迭代对象。
那么该如何判断某数据类型是不是可迭代对象呢?可以用isinstance() 来进行判断,下面是一段简单的示例代码:
# coding:utf-8
from collections import * if isinstance([],Iterable):
print("Yes")
else:
print("No")
在使用上面的代码的时候不要忘了引入对应的模块。
再来说一下迭代器:
迭代器简单一点说就是 可以被next()方法不断调用,并且返回下一个值的对象就是迭代器,Iterator。
(例如最开始说到的生成器,就是一个迭代器,同时,生成器也是可迭代对象。这里需要注意的是,所有的生成器都是迭代器,而所有的迭代器未必都是生成器)
同样,我们可以通过isintance() 的方法来判断某个数据到底是不是迭代器。
这里判断的代码就不写了,跟上面的判断代码一样。
其实经过实践之后就会发现,很多的常用的数据类型都是可迭代对象(Iterable)但是并不是迭代器(Iterator),那么这个时候,如果开发需要,我们可以通过iter()这个方法将可迭代对象转换为迭代器。
# coding:utf-8
from collections import *
# 创建一个列表
list_test = [1,2,3]
# 判断这个列表是不是一个迭代器
if isinstance(list_test,Iterator):
print("Yes")
else:
print("No") # 输出结果为No # 使用iter进行转换
result = iter(list_test)
# 转换完成后可以使用next()方法
print(next(result)) # 也可以使用for循环
for i in result:
print(i)
在这可以简单的进行一下总结:
主要有三个概念:生成器、可迭代对象、迭代器
生成器可以采用next方法获取值,也可以通过for循环获取值
可迭代对象,凡是可以作用于for循环的都是可迭代对象,生成器也是可迭代对象
迭代器,生成器除了是可迭代对象,也是迭代器。可以使用isinstance()方法来判断对象是不是迭代器或者是不是可迭代对象,基本上我们常用的很多数据类型都是可迭代对象,但是并不是迭代器,但是我们可以使用iter()方法来将对象转换为迭代器。
python的生成器与迭代器和可迭代对象的更多相关文章
- Python的容器、生成器、迭代器、可迭代对象的家谱
前言 之前虽然写Python,但是对Python的这些概念也是模模糊糊,知道有一天,看到了一篇文章,讲的透彻,所以就写这篇作为对于这篇高文的读书笔记吧 致谢,该文作者,完全理解Python迭代对象.迭 ...
- Python生成器、迭代器、可迭代对象
把一个列表[]改成()就创建了一个生成器:generator,generator保存的是算法. 可以用于for循环的数据类型:1.集合类型:list tuple dict set str2.gener ...
- 搞清楚 Python 的迭代器、可迭代对象、生成器
很多伙伴对 Python 的迭代器.可迭代对象.生成器这几个概念有点搞不清楚,我来说说我的理解,希望对需要的朋友有所帮助. 1 迭代器协议 迭代器协议是核心,搞懂了这个,上面的几个概念也就很好理解了. ...
- 2019-02-02 Python学习——生成器杨辉三角,迭代器与可迭代对象的区别
练习 杨辉三角定义如下: 1 / \ 1 1 / \ / \ 1 2 1 / \ / \ / \ 1 3 3 1 / \ / \ / \ / \ 1 4 6 4 1 / \ / \ / \ / \ / ...
- Python中生成器和迭代器的区别(代码在Python3.5下测试):
https://blog.csdn.net/u014745194/article/details/70176117 Python中生成器和迭代器的区别(代码在Python3.5下测试):Num01–& ...
- python中“生成器”、“迭代器”、“闭包”、“装饰器”的深入理解
python中"生成器"."迭代器"."闭包"."装饰器"的深入理解 一.生成器 1.生成器定义:在python中,一边 ...
- python tips:迭代器与可迭代对象
for循环 for i in s: print(i) 在上述for循环中,不断地将s中的值赋值给i,然后打印出来.这种只针对s中元素的循环称为对s的迭代,能够迭代的s称为可迭代的. python为了实 ...
- python语法生成器、迭代器、闭包、装饰器总结
1.生成器 生成器的创建方法: (1)通过列表生成式创建 可以通过将列表生成式的[]改成() eg: # 列表生成式 L = [ x*2 for x in range(5)] # L = [0, 2, ...
- Python之生成器、迭代器
生成器 生成器类似返回值为数组的一个函数,这个函数可以接受参数,可被调用,但只能产生一个值,所以大大节省内存. 生成器表达式的语法非常简单,只需要将列表推导式的中括号改成小括号就可以了 [x+x fo ...
随机推荐
- Python入门-文件操作
文件读取f = open('D:/工作日常/学生空姐模特护士联系方式.txt', 'r', encoding=‘utf-8’)f.read()f.close()解释file='D:/工作日常/学生空姐 ...
- hibernate添加数据时Exception in thread "main" org.hibernate.PropertyValueException: not-null property references a null or transient value: com.javakc.hibernate.test.entity.TestEntity.testName
意思是,一个非null属性引用了一个null或瞬态值.就是在对应实体类配置文件hbm.xml中该属性配置了not-null="true",将其去掉即可.
- Python_socket常见的方法、网络编程的安全注意事项、socketsever模块、浏览器中在一段时间记录用户的登录验证机制
1.socket常见的方法 socket_常见方法_服务器端 import socket from socket import SOL_SOCKET,SO_REUSEADDR sk = socket. ...
- BAT (中国互联网公司三巨头)
BAT,B=百度.A=阿里巴巴.T=腾讯,是中国互联网公司百度公司(Baidu).阿里巴巴集团(Alibaba).腾讯公司(Tencent)三大互联网公司首字母的缩写.百度总部在北京.阿里巴巴总部在浙 ...
- Linux下用rm删除的文件的恢复方法
Linux下用rm删除的文件的恢复方法_Linux教程_Linux公社-Linux系统门户网站https://www.linuxidc.com/Linux/2008-08/14744.htm linu ...
- CSS3 background-size属性兼容
background-size是CSS3新增的属性,但是IE8以下还是不支持 background-size:contain; // 缩小图片来适应元素的尺寸(保持像素的长宽比):background ...
- CRM/PLM/SCM/MES与ERP的联系与区别
企业通过专设信息机构.信息主管,配备适应现代企业管理运营要求的自动化.智能化.高技术硬件.软件.设备.设施,建立包括网络.数据库和各类信息管理系统在内的工作平台,提高企业经营管理效率的发展模式. 那么 ...
- MyBatis源码分析1 参数映射分析
首先我们拿出之前的代码,在如图位置打上断点,开始调试 我们规定了一个mapper接口,而调用了mapper接口的getEmpByIdAndLastName,我们并没有实现这个接口,这是因为Mybati ...
- IntelliJ IDEA -- 破解
① 到这个地方下载 IntelliJ IDEA 注册码:http://idea.lanyus.com/ 就是这个jar包:JetbrainsCrack-2.6.10-release-enc.jar ...
- 数据驱动-参数化(Parameters)
在录制程序运行的过程中,Vugen(脚本生成器)自动生成了脚本以及录制过程中实际用到的数据.在这个时候,脚本和数据是混在一起的. 在登录操作中,很明显xpj与123123是填入的数据,如果Contro ...