python基础之 迭代器回顾,生成器,推导式
1.迭代器回顾
可迭代对象:Iterable
可以直接作用于for循环的对象统称为可迭代对象:Iterable。因为可迭代对象里面存在可迭代协议,所以才会被迭代
可迭代对象包括:
列表(list)
元组(tuple)
字典(dict)
集合(set)
字符串(str)
生成器(generator)
也可以说除了int和bool类型的数据以外,都是可迭代对象。
为什么他们能被迭代? 因为他们还有__iter__方法
可以使用isinstance()判断一个对象是否是Iterable对象。
迭代器:Iterator
它表示的是一个数据流,Iterator对象可以被next()函数调用并不断返回下一个数据,直到没有数据时抛出StopIteration错误。可
以把这个数据流看做是一个有序序列,但我们却不能提前知道序列的长度,只能不断通过next()函数实现按需计算下一个数据,所以Iterator的计算是惰性的,
只有在需要返回下一个数据时它才会计算。Iterator甚至可以表示一个无限大的数据流,例如全体自然数。而使用list是永远不可能存储全体自然数的。
迭代器包括:
生成器(generator)都是Iterator对象
但list、dict、str虽然是Iterable,却不是Iterator。
如何把可迭代对象变成迭代器?
python2
把list、dict、str等Iterable变成Iterator可以使用iter()函数
isinstance(iter('abc'), Iterator)
python3
把list、dict、str等Iterable变成Iterator可以使用__iter__()函数
from collections import Iterable
str ="abc"
print(isinstance(str.__iter__(),Iterable))
2.生成器 generator
装饰器的本质是闭包
生成器的本质是迭代器 python中的generator保存的是算法,真正需要计算出值的时候才会去往下计算出值。它是一种惰性计算(lazy evaluation)。
在python中有三种方式来获取生成器(python中提供的生成器)
1.通过生成器函数
2.通过各种推到式来实现生成器
3.通过数据的转换也可以获取生成器(目前还不会)
1.通过生成器函数
def func():
print(1)
yield 5 # 我的函数走到这了
print(2)
yield 9 # 我的函数走到这了 g = func() # 生成一个生成器
print(g.__next__()) 1.在函数中使用yield关键字,函数就变成了一个generator。(看到有yiled的存在就是生成器函数)
其中的yiled可以和普通函数中的return进行比较:
普通函数碰到return就结束函数
生成器函数碰到yield不结束就挂起,进行分段执行。在执行到yiled的时候,函数会记住本次执行到的位置,当下一次调用时,就从该位置开始。
yiled特点:
1.挂起函数
2.返回值给调用者
3.接受值,可以接受调用者传参 注意:调用生成器函数不会得到返回的具体的值,而是得到一个可迭代的对象,每一次获得可迭代文件的值,就能推动函数执行,获取新的返回值,直到函数结束
2.如果我们循环和传参的话,需要使用的send()函数。
send函数的作用和__next__函数一样,都是让生成器执行到下一个yiled
区别:
send可以给上一个yield的位置传递值,不能给最后一个yield发送值,在第一次执行生成器的时候最好不要使用send(),如果非要使用的话,需要给个传递个空值。send(None)
send()函数的本质是next+参数
comment = yiled 2
print(comment)
如果调用的时send(10)的话,会返回2和10,因为yiled可已接收参数,来赋值给yiled左边的变量,但是yiled的值不改变 3.生成调用方法
1.__next__方法
2.生成器调用方法(这个地方不知道当时为什么这么做笔记)
3.send方法(本质是next+参数)
4.生成器优点
在了解迭代器的时候我们知道,迭代器是通过python语言本身实现的迭代功能,来节省内存地址的
起始生成器也是一样,只是为了在某些情况下,我们也需要节省内存,就只能自己写。我们自己写的这个能实现迭代器功能的东西就叫生成器。 5.在python3中提供一种可以直接把可迭代对象中的每一个数据作为生成器的结果进行返回
def func():
lst = ['卫龙','老冰棍','北冰洋','牛羊配']
yield from lst 相当于for item in lst:
g = func()
for i in g:
print(i) --->
2.通过推导式(把一个列表生成式的[]改成(),就创建了一个generator)
g = (i for i in range(10))
print(g) ---> <generator object <genexpr> at 0x0000000002143D00>
3.生成器总结
1.生成器的本质就是一个迭代器
2.生成器一定是一个迭代器,迭代器不一定是一个生成器
3.生成器是可以让程序员自己定义的一个迭代器
4.生成器的好处,节省内存空间 5.生成器的特性 一次性的,惰性机制,从上向下
6.send相当于 next+传值,第一次触生成器的时候,如果使用send(None),值必须是None,一般我建议你们使用__next__
7.python2 iter() next()
python3 iter() next() __next__() __iter__()
8.yield from 将可迭代对象元素逐个返回
9.生成器没有索引
10.调用生成器函数不会得到返回的具体的值,而是得到一个可迭代的对象 生成器理解:
生成器最大利用点在yield关键字,能践行传值返回值和保存状态,这与cpu的切换+保存状态和协程的切换+保存状态是一个道理
3.推导式
推导式的用法
【结果 语法】 容器 就是将【】替换成想要推导的数据类型的符号 (第一个位置是结果,剩下的都是语句) 推导式:
1.列表推导式
print([item for item in range(10)])
2.集合推导式
print({item for item in range(10)})
3.字典推导式
print({item:item+1 for item in range(10)})
4.生成器推导式:(最简单的办法是将列表推导式的[]换成())
print(i for i in range(10))--->打印出来的是生成器的内存地址,__next__才会调用 #根据推导式写出小于100的奇数
print([item for item in range(100) if item %2 !=0 ]) 注意:
推导式不宜写太长,可读性差
实现小的需求时,可以使用推导式,节省代码
4.other
1.大批量的数据的时候首先要想到生成器
2.生成器的好处,非常节省内存
3.yiled既可以返回值给调用者,又能接受参数,还可以将函数挂起,挂起的时候返回None
4.第一次调用生成器的时候使用send里边的值必须是None
5.看见yield就是生成器函数
6.几个yiled就应该对应几个(next+count)总数
7.yiled和return的区别是:多了一个挂起,少了一个终止函数
8.生成器函数和普通函数的区别????
1.在打印函数名()的时候,普通函数是打印函数的返回值而生成器函数打印的时生成器的内存地址,必须要函数名().__next__()才能看到返回值
2.返回值的方式不同,yiled和return
如何查看一个包,类中所有可用的方法(属性):
[x for x in dir(list) if not x.startswith('_')]
查看某个具体方法的使用:
help(类名) help(list)
help(类名.方法名) help(list.pop)
使用生成器获取100之内7的倍数
def test():
for item in range(0,100):
yield item
ret = test()
for item in range(0,100):
ss =ret.__next__()
if ss %7 == 0:
print(ss)
生成器读取文件
def func():
with open('t','r',encoding='utf-8')as f:
for i in f:
i = i.strip('\r\n')
yield i
g = func()
for i in g:
try:
print(i)
except StopIteration:
# pass
print(1)

python基础之 迭代器回顾,生成器,推导式的更多相关文章
- python基础之迭代器、生成器、装饰器
一.列表生成式 a = [0,1,2,3,4,5,6,7,8,9] b = [] for i in a: b.append(i+1) print(b) a = b print(a) --------- ...
- Python基础之迭代器、生成器
一.迭代器: 1.迭代:每一次对过程的重复称为一次“迭代”,而每一次迭代得到的结果会作为下一次迭代的初始值.例如:循环获取容器中的元素. 2.可迭代对象(iterable): 1)定义:具有__ite ...
- Python基础之迭代器和生成器
阅读目录 楔子 python中的for循环 可迭代协议 迭代器协议 为什么要有for循环 初识生成器 生成器函数 列表推导式和生成器表达式 本章小结 生成器相关的面试题 返回顶部 楔子 假如我现在有一 ...
- python基础8 -----迭代器和生成器
迭代器和生成器 一.迭代器 1.迭代器协议指的是对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代 (只能往后走不能往前退) 2. ...
- python 基础(五) 迭代器与生成器
迭代器和生成器 迭代器 iterator (1) 迭代对象: 可以直接作用于for循环的 称为可迭代对象(iterable)可以通过 isinstance 判断是否属于可迭代对象 可以直接作用于for ...
- 【Python基础】迭代器、生成器
迭代器和生成器 迭代器 一 .迭代的概念 #迭代器即迭代的工具,那什么是迭代呢? #迭代是一个重复的过程,每次重复即一次迭代,并且每次迭代的结果都是下一次迭代的初始值 while True: #只是单 ...
- 1.17 Python基础知识 - 迭代器和生成器初识
可循环迭代的对象称为可迭代对象,迭代器和生成器函数是可迭代对象. 列表解析表达式:可以简单高效处理一个可迭代对象,并生成结果列表 示例代码: [ i ** 2 for i in range(10) ] ...
- Python高手之路【九】python基础之迭代器与生成器
迭代器与生成器 1.迭代器 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退.另外 ...
- 7th,Python基础4——迭代器、生成器、装饰器、Json&pickle数据序列化、软件目录结构规范
1.列表生成式,迭代器&生成器 要求把列表[0,1,2,3,4,5,6,7,8,9]里面的每个值都加1,如何实现? 匿名函数实现: a = map(lambda x:x+1, a) for i ...
随机推荐
- ssm实现图片上传
在使用ssm完成前后端对接时,总免不了前台传过来的文件问题,而html中的<input>框直接使用时,往往会获取不到路径,今天在完成图片上传后的来做个总结 首先,前台页面 <!DOC ...
- jQuery第七章插件的编写和使用
1.本章目标 编写jquery插件 2.插件 也称为扩展,是一种按照一定的规范的应用程序接口编写出来的程序 插件的目标是给已有的一系列函数做一个封装,以便在其他的地方复用,方便维护和开发效率 3.jq ...
- Java Spring Boot VS .NetCore (五)MyBatis vs EFCore
Java Spring Boot VS .NetCore (一)来一个简单的 Hello World Java Spring Boot VS .NetCore (二)实现一个过滤器Filter Jav ...
- powershell 激活WIN10
1.以win10专业版为例,鼠标右键点击开始图标,选择[windows powershell(管理员)],或者命令提示符管理员:2.打开命令窗口,复制这个命令slmgr /ipk W269N-WFGW ...
- 关于pyCharm专业版的破解方法
用pycharm编写自动化脚本时,pycharm专业版的使用期限只有30天, 找到了pycharm破解方法. 破解码:{"licenseId":"145446792566 ...
- k个一组翻转链表
给出一个链表,每 k 个节点一组进行翻转,并返回翻转后的链表. k 是一个正整数,它的值小于或等于链表的长度.如果节点总数不是 k 的整数倍,那么将最后剩余节点保持原有顺序. 示例 : 给定这个链表: ...
- BZOJ.5092.[Lydsy1711月赛]分割序列(高维前缀和)
题目链接 \(Description\) \(Solution\) 首先处理\(a_i\)的前缀异或和\(s_i\).那么在对于序列\(a_1,...,a_n\),在\(i\)位置处分开的价值为:\( ...
- Centos7安装InfluxDB1.7
Centos7安装InfluxDB1.7 本操作参照InfluxDB官网:InfuxDB 使用的Red Hat和CentOS用户可以安装InfluxDB最新的稳定版本 yum包管理器: cat < ...
- 2018-2019-1 20189210 《LInux内核原理与分析》第七周作业
一 .Linux内核创建一个新进程的过程 1.操作系统内核三大功能是进程管理,内存管理,文件系统,最核心的是进程管理. 2.对应的三个抽象的概念是进程,虚拟内存和文件.其中,操作系统最核心的功能是进程 ...
- cmd 命令 net start mongodb 启动不了,提示 net 不是内部命令或者外部命令
1.要管理员的身份进入 cmd 2.右击我的电脑-->属性-->高级系统设置 3.选择高级-->环境变量 4.找到系统变量-->Path-->编辑 5.把 C:\wind ...