python学习之路---day12
生成器和生成器表达式
一:生成器
生成器实质上就是迭代器。
三种方式获取生成器:
01:通过生成器函数
02:通过各种推导式实现生成器
03:通过数据的转换也可以获取生成器
eg:普通函数
def fun()
print("")
return
ret=func()
print(ret)
结果:
111
222
将函数的return 换成yield 就是生成器
def fun()
print("")
yield
ret=func()
print(ret)
结果:<generator object func at 0x10567ff68>
打印结果:结果是一个函数名字的内存地址
原因:由于函数中存在了yield. 那么这个函数就是⼀个⽣成器
函数. 这个时候. 我们再执⾏这个函数的时候. 就不再是函数的执⾏了.
⽽是获取这个⽣成器.如何使⽤呢? 想想迭代器. ⽣成器的本质是迭代器.
所以. 我们可以直接执⾏__next__()来执⾏
其实return和yield一样都有返回值,return返回值后,就退出函数,后面的函数就不在执行
yield 则是在返回 返回值后 ,还给上一个yield 的变量赋值
案例结果说明
例如:
def eat():
print("我吃什么啊")
a = yield "馒头"
print("a=",a)
b = yield "⼤饼"
print("b=",b)
c = yield "⾲菜盒⼦"
print("c=",c)
yield "GAME OVER"
gen = eat() # 获取⽣成器
ret1 = gen.__next__()
print(ret1)
ret2 = gen.send("胡辣汤")
print(ret2)
ret3 = gen.send("狗粮")
print(ret3)
ret4 = gen.send("猫粮")
print(ret4) 打印结果:send和__next__()区别:
1. send和next()都是让⽣成器向下走⼀次
2. send可以给上⼀个yield的位置传递值, 不能给最后⼀个yield发送值.
在第⼀次执⾏⽣
成器代码的时候不能使⽤send()
案例解释
二:生成器的作用:
生成器可以用for循环来循环获取内部的元素:
def func():
print(111)
yield 222
print(333)
yield 444
print(555)
yield 666
gen = func() #这里并没有直接执行这个函数,只是获取了这个函数生成器,
for i in gen: #在循环这个函数后,生成器才会执行func()这个函数。i才会找gen要值,func才会执行
print(i)
结果:
111
222
333
444
555
666
三:列表推导式:
例如:
lst = []
for i in range(1, 15):
lst.append(i)
print(lst)
这个代码块是,给出一个列表,通过循环,将数字添加到新的列表中去
001):可以用列表推导式:
lst = [i for i in range(1, 15)]
print(lst)
列表是常用写法:
[ 结果 for 变量 in 可迭代对象]
002):列表推导式还可以用来筛选
获取1-100内所有的偶数
lst = [i for i in range(1, 100) if i % 2 == 0]
print(lst)
四:生成器和列表推导式的区别:
生成器: 有yield的函数体
列表推导式:( [ 结果 for 变量 in 可迭代对象] )
列表推导式是通过一行来构建我们需要的列表,列表推导式看起来代码简单。但是出了
错误很难排查!
五:生成器表达式:
001):⽣成器表达式和列表推导式的语法基本上是⼀样的. 只是把[]替换成()
gen = (i for i in range(10))
print(gen)
结果:
<generator object <genexpr> at 0x106768f10> 打印的结果就是⼀个⽣成器. 我们可以使⽤for循环来循环这个⽣成器:
gen = ("麻花藤我第%s次爱你" % i for i in range(10))
for i in gen:
print(i)
六:⽣成器表达式和列表推导式的区别:
1. 列表推导式比较耗内存. ⼀次性加载. ⽣成器表达式⼏乎不占⽤内存. 使⽤的时候才分
配和使⽤内存
2. 得到的值不⼀样. 列表推导式得到的是⼀个列表. ⽣成器表达式获取的是⼀个⽣成器.
举个栗⼦.
同样⼀篮⼦鸡蛋. 列表推导式: 直接拿到⼀篮⼦鸡蛋. ⽣成器表达式: 拿到⼀个老⺟鸡. 需要
鸡蛋就给你下鸡蛋.
⽣成器的惰性机制: ⽣成器只有在访问的时候才取值. 说⽩了. 你找他要他才给你值. 不找他
要. 他是不会执⾏的.
七:总结: 推导式有, 列表推导式, 字典推导式, 集合推导式, 没有元组推导式
⽣成器表达式: (结果 for 变量 in 可迭代对象 if 条件筛选)
⽣成器表达式可以直接获取到⽣成器对象. ⽣成器对象可以直接进⾏for循环. ⽣成器具有
惰性机制.
python学习之路---day12的更多相关文章
- ql的python学习之路-day12
前言:这一节主要学习json和pickle 背景: 相信大家在日常生活中都有接触大型的网络游戏,打游戏的时候都是自己在电脑上操作,自己刷怪升级:当然也会碰到中午去吃饭然后挂机的情况,让电脑自动的刷怪, ...
- python学习之路-day2-pyth基础2
一. 模块初识 Python的强大之处在于他有非常丰富和强大的标准库和第三方库,第三方库存放位置:site-packages sys模块简介 导入模块 import sys 3 sys模 ...
- Python学习之路-Day2-Python基础3
Python学习之路第三天 学习内容: 1.文件操作 2.字符转编码操作 3.函数介绍 4.递归 5.函数式编程 1.文件操作 打印到屏幕 最简单的输出方法是用print语句,你可以给它传递零个或多个 ...
- Python学习之路-Day2-Python基础2
Python学习之路第二天 学习内容: 1.模块初识 2.pyc是什么 3.python数据类型 4.数据运算 5.bytes/str之别 6.列表 7.元组 8.字典 9.字符串常用操作 1.模块初 ...
- Python学习之路-Day1-Python基础
学习python的过程: 在茫茫的编程语言中我选择了python,因为感觉python很强大,能用到很多领域.我自己也学过一些编程语言,比如:C,java,php,html,css等.但是我感觉自己都 ...
- python学习之路网络编程篇(第四篇)
python学习之路网络编程篇(第四篇) 内容待补充
- Python学习之路【第一篇】-Python简介和基础入门
1.Python简介 1.1 Python是什么 相信混迹IT界的很多朋友都知道,Python是近年来最火的一个热点,没有之一.从性质上来讲它和我们熟知的C.java.php等没有什么本质的区别,也是 ...
- python 学习之路开始了
python 学习之路开始了.....记录点点滴滴....
- python学习之路,2018.8.9
python学习之路,2018.8.9, 学习是一个长期坚持的过程,加油吧,少年!
随机推荐
- 浅谈块元素绝对定位的margin属性
对于div的绝对定位一直以为margin属性是无效的,只是通过top,left,bottom,right定位,然而今天的却发现不是这样的,于是对其做了些实验: 使用的HTML原始测试文件: <! ...
- resin3.X那些事之resin.conf
[经验总结]resin那些事之resin.conf ----by johnson 话说与resin打交道很久了,却从未系统了解过.resin一听火了,说:你老兄当真与我打交道很久了?工具.流程如此发达 ...
- linux 下搭建LAMP
http://www.mizuiren.com/414.html 写的非常好
- Win10 Tensorflow 配置Mask_RCNN
1.安装Anaconda3 下载地址 Anaconda 官网下载地址:https://www.continuum.io/downloads 下载以后,点击exe程序,开始安装,详细的安装过程(图片参 ...
- jQuery--左侧菜单收缩隐藏
实现步骤: 步骤一. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 ...
- Smarty3——变量修饰器
变量修饰器可以用于变量, 自定义函数或者字符串. 使用修饰器,需要在变量的后面加上|(竖线)并且跟着修饰器名称. 修饰器可能还会有附加的参数以便达到效果. 参数会跟着修饰器名称,用:(冒号)分开. 同 ...
- Sqlserver中的几把锁和.net中的事务级别
当数据表被事务锁定后,我们再进行select查询时,需要为with(锁选项)来查询信息,如果不加,select将会被阻塞,直到锁被释放,下面介绍几种SQL的锁选项 SQL的几把锁 NOLOCK(不加锁 ...
- 黑盒测试实践--Day4 11.28
黑盒测试实践--Day4 11.28 今天完成任务情况: 分块明确自己部分的工作,并做前期准备 完成被测系统--学生管理系统的需求规格说明书 完成Mook上高级测试课程的第六章在线学习,观看自动化测试 ...
- mysql_init调用卡住原因分析
有同学做类似如下的操作: class X { public: X() // 类X的构造函数ctor { _mysql_handler = mysql_init(NULL); } }; // 定义类X的 ...
- eclipse导入tomcat
官网下载tomcat压缩包 官网:http://tomcat.apache.org/ tomcat8:链接:http://pan.baidu.com/s/1kVHAEoR 密码:kyt8 tomcat ...