一、迭代器

    迭代器就是迭代的工具,迭代是一个重复的过程,每次重复都是一次迭代并且每次迭代的结果都是下次迭代的初始值。

    

 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之迭代器、生成器及列表推导式的更多相关文章

  1. Python进阶(四)----生成器、列表推导式、生成器推导式、匿名函数和内置函数

    Python进阶(四)----生成器.列表推导式.生成器推导式.匿名函数和内置函数 一丶生成器 本质: ​ 就是迭代器 生成器产生的方式: ​ 1.生成器函数

  2. python基础(14):生成器、列表推导式

    1. 生成器 什么是⽣成器?⽣成器实质就是迭代器. 在python中有三种⽅式来获取⽣成器: 1. 通过⽣成器函数 2. 通过各种推导式来实现⽣成器 3. 通过数据的转换也可以获取⽣成器 ⾸先,我们先 ...

  3. Python-02 生成器表达式,列表推导式

    列表推导式和生成器表达式 列表推导式,生成器表达式1,列表推导式比较直观,占内存2,生成器表达式不容易看出内容,省内存. [ 变量(加工后的数据) for  变量i  in 可迭代的数据类型 ] 列表 ...

  4. Python的高级特性2:列表推导式,生成器与迭代器

    一.列表推导式 1.列表推导式是颇具python风格的一种写法.这种写法除了高效,也更简短. In [23]: {i:el for i,el in enumerate(["one" ...

  5. 【python】 迭代器、生成器、列表推导式

    一.可迭代对象.迭代器 1.可以被for循环的数据类型(可迭代对象): 字符串(str).列表(list).字典(dict).元祖(tuple).range() 2.迭代器 2.1 将可迭代对象==& ...

  6. Python入门之三元表达式\列表推导式\生成器表达式\递归匿名函数\内置函数

    本章目录: 一.三元表达式.列表推导式.生成器表达式 二.递归调用和二分法 三.匿名函数 四.内置函数 ================================================ ...

  7. python之三元表达式、列表推导式、生成器表达式、递归、匿名函数、内置函数

    一 三元表达式.列表推导式.生成器表达式 一 三元表达式 name=input('姓名>>: ') res='SB' if name == 'alex' else 'NB' print(r ...

  8. python之生成器和列表推导式

    一.生成器函数 1.生成器 就是自己用python代码写的迭代器,生成器的本质就是迭代器(所以自带了__iter__方法和__next__方法,不需要我们去实现). 2.构建生成器的两种方式 1,生成 ...

  9. Python_迭代器、生成器、列表推导式,生成器表达式

    1.迭代器 (1)可迭代对象 s1 = ' for i in s1: print(i) 可迭代对象 示例结果: D:\Python36\python.exe "E:/Python/课堂视频/ ...

随机推荐

  1. delphi十六进制字符串hex转byte数组互相转换bmp图片

    procedure Hex2Png(str: string; out png: TPngObject); var stream: TMemoryStream; begin if not Assigne ...

  2. 【设计】IOT设备控制页面设计

    https://www.uishe.cn/10803.html https://huaban.com/pins/1012512760/ https://huaban.com/pins/10878772 ...

  3. Docker入门之docker-compose

    参考:https://blog.51cto.com/9291927/2310444 一,Docker-compose简介 1,Docker-compose简介 Docker-Compose项目是Doc ...

  4. beego框架(golang)学习过滤器(实现restful请求)

    过滤器 在用beego做restful路由的时候,遇到了除了GTE.POST之外的HTTP请求,比如 PUT.PATCH.delete请求无法通过路由认证,报错误:405 METHOD NOT ALL ...

  5. 推荐Pi(π)币,相当于比特币手机挖矿版

    我为什么推荐这个? 说实话,之所以发出来还是因为如果用我的邀请码注册,双方的挖矿速度都会增加些,我的邀请码:leneing,有问题可以咨询我. Pi币简介 1.在这里强烈推荐Pi币,相当于比特币手机挖 ...

  6. eclipse英语单词1

    short cut bar 捷径,快捷方法 menu bar 菜单栏 tool bar 工具栏 workbench window 工作台窗口 perspective 透视 editor 编辑器 con ...

  7. 避免复制引用程序集的XML文件

    VS在编译时,默认会复制所有引用程序集对应的XML文件到输出目录. 在项目中设置AllowedReferenceRelatedFileExtensions可以避免复制操作. <PropertyG ...

  8. OneNote中更改英文输入默认不是微软雅黑的问题

    win10下的终极版解决方案: 1.进入C:\Windows\Fonts找到Calibri字体,点进去后先右键Calibri常规-属性-安全-高级,将所有者从“TrustedInstaller”更改为 ...

  9. Net UI Spy工具:ManagedSpy

    Net UI Spy工具:ManagedSpy 很久之前在接手一个大型的Winform项目的时候.有如下困难: 1,项目很大整个产品的Build由1400多个Project组成 2,产品的组件.控件太 ...

  10. [转帖]年经贴: ARM将为苹果开发高性能CPU核心 取代笔记本x86处理器?

    ARM将为苹果开发高性能CPU核心 取代笔记本x86处理器? https://www.cnbeta.com/articles/tech/899421.htm . 之前苹果的哥们说过 谁特别在意自己的软 ...