python之迭代器、生成器及列表推导式
一、迭代器
迭代器就是迭代的工具,迭代是一个重复的过程,每次重复都是一次迭代并且每次迭代的结果都是下次迭代的初始值。
lst=[1,2,3,4,5]
count=0
while count<len(lst):
print(lst[count])
count +=1
既然有for循环为什么还要用迭代器呢? 当然对于序列类型:字符串、列表、元组,我们可以使用索引的方式迭代取出其包
含的元素。但对于字典、集合、文件等类型是没有索引的,若还想取出其内部包含的元素,则必须找出一种不依赖于索引
的迭代方式,这就是迭代器。
可迭代对象:
可迭代对象指的是内置有__iter__方法的对象,我们要如何查看内置是否有__iter__()方法呢?
lst=[1,2,3]
print(dir(lst))
在需要查看的对象前使用dir方法 就是来查看该对象内置的方法,如果其中含有__iter__,又含有__next__()方法那么该对象就是可迭代对象
注:迭代器对象一定是可迭代对象,而可迭代对象不一定是迭代器对象。
lst=[1,2,3]
g = lst.__iter__()
print(g.__next__())
print(g.__next__())
print(g.__next__())
print(g.__next__()) #当列表中不存在元素提供迭代则会抛出异常StopIteration,或者说结束标志
我们怎么可以避免报错呢?
lst=[1,2,3,4,5,6,7,]
g=lst.__iter__()
while True:
try:
print(g.__next__())
except StopIteration: #此处表示当遇到该提示时终止迭代
break
迭代器的优缺点:
(1)优点: 提供一个统一的,不依赖索引的迭代方式, 节省内存。
(2)缺点: 惰性计算,只能往后走,不能往前退
二、生成器
生成器本质上就是迭代器
def func():
print(111)
return 222
print(func()) def func():
print(111)
yield 222
print(func())
怎样判断生成器,只要函数内部包含有yield关键字,那么函数名()得到的结果就是生成器,并且不会执行函数内部代码
def func():
print("")
yield 222
gener = func() #这里是获取生成器,不会执行函数
print(gener.__next__()) #这个时候函数才会执行,yield和return一样都是用来返回数据
生成器的特点和迭代器一样,取值方式和迭代器一样
惰性机制,只能往后退,不能往前,优点是节约内存。取值方式也是用.__next__() 执行函数. 执行到下一个yield.
生成器一般由生成器函数或者生成器表达式来构建
def func():
print(1)
a=yield "a"
print(a)
print(2)
b=yield "b"
print(b)
yield "over"
g =func() #获取生成器
print(g.__next__()) #没有上一个yield 所以不能使用send() 开头必须是__next__()
print(g.send("中华")) # send()与next用法相同,还可以将值传给上一个yield
print(g.__next__()) #send()也不能用来当末尾 yield代表结束 seed没值可传
三、列表推导式
列表推导式是用一行代码来构建你想要的列表。
lst=["","","","","",]
for i in range(len(lst)):
print(i) # 传统方法获取列表的索引值 lst=[i for i in range(0,5)]
print(lst) #将想要的结果放入到列表中 dic={"name":"张三","sex":"男"}
dic = {k:v for k,v in dic.items()}
print(dic) # 字典的推导式与列表大同小异 gen = (i for i in range(1,4))
print(gen) # 这个就是生成器表达式,元组不存在推导式。
生成器表达式与列表推导式的区别
列表推导式比较消耗内存,一次性加载
生成器表达式几乎不耗用内存,只有在用到的时候才会获取分配内存
python之迭代器、生成器及列表推导式的更多相关文章
- Python进阶(四)----生成器、列表推导式、生成器推导式、匿名函数和内置函数
Python进阶(四)----生成器.列表推导式.生成器推导式.匿名函数和内置函数 一丶生成器 本质: 就是迭代器 生成器产生的方式: 1.生成器函数
- python基础(14):生成器、列表推导式
1. 生成器 什么是⽣成器?⽣成器实质就是迭代器. 在python中有三种⽅式来获取⽣成器: 1. 通过⽣成器函数 2. 通过各种推导式来实现⽣成器 3. 通过数据的转换也可以获取⽣成器 ⾸先,我们先 ...
- Python-02 生成器表达式,列表推导式
列表推导式和生成器表达式 列表推导式,生成器表达式1,列表推导式比较直观,占内存2,生成器表达式不容易看出内容,省内存. [ 变量(加工后的数据) for 变量i in 可迭代的数据类型 ] 列表 ...
- Python的高级特性2:列表推导式,生成器与迭代器
一.列表推导式 1.列表推导式是颇具python风格的一种写法.这种写法除了高效,也更简短. In [23]: {i:el for i,el in enumerate(["one" ...
- 【python】 迭代器、生成器、列表推导式
一.可迭代对象.迭代器 1.可以被for循环的数据类型(可迭代对象): 字符串(str).列表(list).字典(dict).元祖(tuple).range() 2.迭代器 2.1 将可迭代对象==& ...
- Python入门之三元表达式\列表推导式\生成器表达式\递归匿名函数\内置函数
本章目录: 一.三元表达式.列表推导式.生成器表达式 二.递归调用和二分法 三.匿名函数 四.内置函数 ================================================ ...
- python之三元表达式、列表推导式、生成器表达式、递归、匿名函数、内置函数
一 三元表达式.列表推导式.生成器表达式 一 三元表达式 name=input('姓名>>: ') res='SB' if name == 'alex' else 'NB' print(r ...
- python之生成器和列表推导式
一.生成器函数 1.生成器 就是自己用python代码写的迭代器,生成器的本质就是迭代器(所以自带了__iter__方法和__next__方法,不需要我们去实现). 2.构建生成器的两种方式 1,生成 ...
- Python_迭代器、生成器、列表推导式,生成器表达式
1.迭代器 (1)可迭代对象 s1 = ' for i in s1: print(i) 可迭代对象 示例结果: D:\Python36\python.exe "E:/Python/课堂视频/ ...
随机推荐
- delphi十六进制字符串hex转byte数组互相转换bmp图片
procedure Hex2Png(str: string; out png: TPngObject); var stream: TMemoryStream; begin if not Assigne ...
- 【设计】IOT设备控制页面设计
https://www.uishe.cn/10803.html https://huaban.com/pins/1012512760/ https://huaban.com/pins/10878772 ...
- Docker入门之docker-compose
参考:https://blog.51cto.com/9291927/2310444 一,Docker-compose简介 1,Docker-compose简介 Docker-Compose项目是Doc ...
- beego框架(golang)学习过滤器(实现restful请求)
过滤器 在用beego做restful路由的时候,遇到了除了GTE.POST之外的HTTP请求,比如 PUT.PATCH.delete请求无法通过路由认证,报错误:405 METHOD NOT ALL ...
- 推荐Pi(π)币,相当于比特币手机挖矿版
我为什么推荐这个? 说实话,之所以发出来还是因为如果用我的邀请码注册,双方的挖矿速度都会增加些,我的邀请码:leneing,有问题可以咨询我. Pi币简介 1.在这里强烈推荐Pi币,相当于比特币手机挖 ...
- eclipse英语单词1
short cut bar 捷径,快捷方法 menu bar 菜单栏 tool bar 工具栏 workbench window 工作台窗口 perspective 透视 editor 编辑器 con ...
- 避免复制引用程序集的XML文件
VS在编译时,默认会复制所有引用程序集对应的XML文件到输出目录. 在项目中设置AllowedReferenceRelatedFileExtensions可以避免复制操作. <PropertyG ...
- OneNote中更改英文输入默认不是微软雅黑的问题
win10下的终极版解决方案: 1.进入C:\Windows\Fonts找到Calibri字体,点进去后先右键Calibri常规-属性-安全-高级,将所有者从“TrustedInstaller”更改为 ...
- Net UI Spy工具:ManagedSpy
Net UI Spy工具:ManagedSpy 很久之前在接手一个大型的Winform项目的时候.有如下困难: 1,项目很大整个产品的Build由1400多个Project组成 2,产品的组件.控件太 ...
- [转帖]年经贴: ARM将为苹果开发高性能CPU核心 取代笔记本x86处理器?
ARM将为苹果开发高性能CPU核心 取代笔记本x86处理器? https://www.cnbeta.com/articles/tech/899421.htm . 之前苹果的哥们说过 谁特别在意自己的软 ...