巨蟒python全栈开发-第12天 生成器函数 各种推导式 yield from
一.今日主要内容总览(重点)
1.生成器(目的:帮助我们创建对象)
(1)生成器的本质就是迭代器
(2)一个一个的创建对象
(3)创建生成器的方式:
1.生成器函数
2.通过生成器表达式来获取生成器
3.类型转换(看不到) 2.生成器函数(重点)
(1)生成器函数中包含 yield关键字,返回数据和return差不多
return会立即结束和这个函数的执行
yield 可以分段的执行一个函数 (2)大坑(五星重点):
生成器函数在执行的时候返回生成器,而不是直接执行次函数 (3)能向下执行的两个条件:
__next__(),执行到下一个yield
send(),执行到下一个yield,给上一个yield位置传值 (4)所有的生成器都是迭代器,都可以直接使用for循环
都可以使用list()函数来获取到生成器内所有的数据 (5)生成器中记录的是代码而不是函数的运行
def func():
print('我的天哪') yield '宝宝'
gen=func() #创建生成器,此时运行会把生成器函数中的代码记录在内存
当执行到__next__(),运行此空间中的代码,运行到yield结束 (6)生成器
优点:节省内存,生成器本身就是代码,几乎不占用内存
特点:惰性机制,只能向前,不能反复 3.各种推导式(诡异)
列表推导式 [结果 for 循环 if]
字典推导式 {结果(k,v) for 循环 if}
集合推导式 {结果(k) for 循环 if} 4.生成器表达式(重点)
(结果 for循环 if)
二.今日内容大纲
1.生成器函数
2.各种推导式
3.yield from
三.内容详解
1.生成器函数
(1)
def func():
print('我叫周润发')
return '林志玲' #return
ret=func()
print('返回值是:',ret)
'''
结果:
我叫周润发
返回值是: 林志玲
'''
(2)
注意:
函数中包含了yield,次函数就是生成器函数
大坑:生成器函数运行之后,产生一个生成器,而不是运行函数
def func():
print('我叫周润发')
yield '林志玲' #yield表示返回,不会终止函数的执行
print('宝宝去干嘛了???')
yield '宝宝回来了'
print('大冬瓜,你好')
# yield '没了'
ret=func() #执行函数,但是此时没有运行函数
#此时,我们拿到的是生成器ret
print('返回值是:',ret) #返回值是: <generator object func at 0x000002286D7CCF68>
#
# #执行到下一个yield
print(ret.__next__()) #第一次执行__next__此时函数才开始执行
print(ret.__next__()) #第二次执行__next__此时函数才开始执行,执行到下一个yield
#
# print(ret.__next__()) #如果最后一句没有 ''yield '没了' '',报错原因是:StopIteration
# 这句话开始报错,并且'大冬瓜,你好'也不会打印 '''
结果:
返回值是: <generator object func at 0x000001B57FC2CF68>
我叫周润发
林志玲
宝宝去干嘛了???
宝宝回来了
'''
(2-1)
def func():
print('我叫周润发')
yield '林志玲' #yield表示返回,不会终止函数的执行
print('宝宝去干嘛了???')
yield '宝宝回来了'
print('大冬瓜,你好')
yield '没了'
ret=func() #第一种
for i in ret:
print(i) #第二种
while 1:
try:
k=ret.__next__()
print(k)
except StopIteration:
break
(3)
买衣服, JACK JONES 10000件衣服
当数据量很大,有用不了,怎么办,用一个拿一个 (3-1)直接放入列表中10000件
def buy():
lst=[]
for i in range(10000):
lst.append("衣服%s"%i)
return lst
k=buy()
print(k)
(3-2)取20件,简单版本
def buy():
for i in range(10000):
yield '衣服%s' %i
lst=buy() #生成器或者迭代器的好处:节省内存
# print(lst.__next__())
# print(lst.__next__())
# print(lst.__next__())
#
for i in range(20):
print(lst.__next__())
(3-3)#想拿多少件拿多少件//重磅题目
def buy():
for i in range(10000):
yield '衣服%s' %i
re=buy()
while 1:
n=input('请输入需要提取的衣服数量:').strip()
m=0
for i in re:
print(i)
m += 1
if m==int(n):
break
s=input('是否还要继续取衣服:').strip()
if s=='是':continue
else:break
(4)
def buy():
for i in range(10000):
yield '衣服%s' %i
lst=buy() # 方法一:
for yifu in lst: #迭代器.__next__()
print(yifu) #注意这里是没有加括号的 # 方法二: #超级重点
print(lst)
lst=list(lst) #将地址强转成了列表里的内容
print(lst)
(5)
(5-1)
def func():
print('韭菜盒子')
a=yield '韭菜鸡蛋'
print('a',a)
b=yield '韭菜西红柿'
print('b',b)
c=yield '火烧'
print('c',c)
gen=func()
#
print(gen.__next__())
print(gen.__next__())
print(gen.__next__())
结果:
结果:
韭菜盒子
韭菜鸡蛋
a None
韭菜西红柿
b None
火烧
(5-2)
功能介绍
send() =>__next__()
send() 可以给上一个yield传值
def func():
print('韭菜盒子')
a=yield '韭菜鸡蛋'
print('a=',a)
b=yield '韭菜西红柿'
print('b=',b)
c=yield '火烧'
print('c',c)
gen=func() # # 方法一:
print(gen.__next__()) # 第一个位置用send没有任何意义
#结果:
# 韭菜盒子
# 韭菜鸡蛋
print(gen.send('篮球')) # 给上一个yield位置传值
#结果:
# a=篮球
# 韭菜西红柿
print(gen.send('足球'))
#结果:
# b=足球
# 火烧
# print(gen.send('排球'))#这句话再传入就会报错了,因为后边没有接收了
(5-3)
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("胡辣汤") #a= 胡辣汤
print(ret2) #⼤饼
ret3 = gen.send("狗粮") #b= 狗粮
print(ret3) #⾲菜盒⼦
ret4 = gen.send("猫粮") #c= 猫粮
print(ret4) #GAME OVER
2.各种推导式
(1)
#生成列表:python1期 =>python18期 lst=[]
for i in range(1,19):
lst.append('python%s期'%i)
print(lst)
(2)
列表推导式语法: [结果 for循环 if 条件] 不要着急写结果,先写循环,再写结果
lst=['python%s期'%i for i in range(1,19)] #循环一次拿一次
print(lst) '''
结果:
['python1期', 'python2期', 'python3期', 'python4期', 'python5期', 'python6期',
'python7期', 'python8期', 'python9期', 'python10期', 'python11期', 'python12期',
'python13期', 'python14期', 'python15期', 'python16期', 'python17期', 'python18期']
'''
(3)练习
# 练习1 生成列表,类似于表中装好的数据是 1-100之间所有的偶数的平方 lst=[i**2 for i in range(1,101) if i%2==0]
print(lst) # 练习二:筛选出列表中姓张的同学,lst=['张无忌','吴奇隆','张诗诗','范冰冰','张翠山']
#法一
lst=['张无忌','吴奇隆','张诗诗','范冰冰','张翠山']
li=[i for i in lst if i[0]=='张']
print(li)
#法二
li=[i for i in lst if i.startswith('张')]
print(li) # 练习三:寻找名字中带有两个e的人的名字 names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven','Joe'],
['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']]
li=[ii for i in names for ii in i if ii.count('e')>=2]
print(li)
#老师写法
li=[ii for i in names for ii in i if ii.count('e')==2]
print(li)
(4)#字典推导式
# 语法: {结果(key:value) for循环 if条件}
lst=[11,22,33] #结果{0:11,1:22,2:33}
dic={i:lst[i] for i in range(len(lst))}
print(dic) # 练习: {"主食": "炒面", "副食": "小拌菜", "汤":"疙瘩汤"}
# 把字典的key和value互换,生成新字典
dic={"主食": "炒面", "副食": "小拌菜", "汤":"疙瘩汤"}
di={v:k for k,v in dic.items()} #这个题目当时没有想出来,不要受上一个题目影响
print(di)
(5)集合推导式
集合推导式{k for循环 if 条件} 没有元组推导式
g=(i for i in range(10)) #生成器表达式是一次性的,如果想在迭代完,继续用,再写一遍
print(g) #<generator object <genexpr> at 0x0000000009E573B8>
print(g.__next__()) #执行10次取完,也就是再写9次
print(g.__next__()) #第11次,StopIteration
(6)
#生成器函数
def func():
print(111)
yield 222
# yield 333 #就算后边有再多的yield ,也是放在第一个列表中
# yield [1,2,3] #注意:1.惰性机制,2.只能向前
g = func() # 创建⽣成器g
g1 = (i for i in g) #生成器表达式 创建了一个新的⽣成器g1. 但是g1的数据来源于g
g = func()
g2 = (i for i in g1) # 创建了一个新的⽣成器⽣成器g2. 来源g1 #注意:在这之前,只是记录了关系,并没有工作 print(g) #<generator object func at 0x0000013452C32048>
print(list(g)) # 获取g中的数据. 这时func()才会被执⾏. 打印111.获取到222. g完毕.
# #list(g)直接拿没了
#
# print(list(g1)) # 获取g1中的数据. g1的数据来源是g. 但是g已经取完了. g1 也就没有数据了
print(list(g2)) # 和g1同理
无论注释,倒数第一行还是注释倒数第二行,结果都是下面结果
'''
结果:
<generator object func at 0x000002056A182048>
111
[222]
111
[222]
'''
如果都放开是
'''
<generator object func at 0x000002056A182048>
111
[222]
111
[222]
[]
'''
3.yield from
(1)
def func():
# lst=['衣服%s'%i for i in range(500)]
# yield from lst #将列表中的每一项进行yield返回 for i in range(500): #等价于上边两行,上边相当于yield from中的列表中的一行
yield '衣服%s'%i gen=func()
print(gen.__next__())
print(gen.__next__())
'''
总结:
1.list=列表推导式
yield from list
2.for 循环
yield 值
1和2等价
'''
(2)先拿第一个,再拿第二个
def func():
lst=['衣服%s'%i for i in range(2)]
yield from lst lst = ['python%s' % i for i in range(15)]
yield from lst
gen=func()
print(gen.__next__())
print(gen.__next__())
print(gen.__next__())
print(gen.__next__())
print(gen.__next__())
'''
结果:
衣服0
衣服1
python0
python1
python2
'''
今日作业:
2,用列表推导式做下列小题
(1)
(1)过滤掉长度小于3的字符串列表,并将剩下的转换成大写字母
'''
lis=['penchengchegn','wusir','sir','we']
li=[i.upper() for i in lis if len(i)>=3 ]
print(li)
'''
(2)
求(x,y)其中x是0-5之间的偶数,y是0-5之间的奇数组成的元祖列表
'''
li = [(x,x+1) for x in range(6) if x%2==0] # 全排列,注意这个题目的写法
li = [(x,y) for x in range(6) if x%2==0 for y in range(6) if y%2==1]
print(li)
'''
(3)
求M中3,6,9组成的列表M = [[1,2,3],[4,5,6],[7,8,9]]
M = [[1,2,3],[4,5,6],[7,8,9]]
li=[i[2] for i in M]
print(li) # 结果:[3, 6, 9] M = [[1,2,3],[4,5,6],[7,8,9]]
li=[[i for i in range(1,4)],[i for i in range(4,7)],[i for i in range(7,10)]]
print(li) #结果:[[1, 2, 3], [4, 5, 6], [7, 8, 9]] M = [[1,2,3],[4,5,6],[7,8,9]]
lst = [ a for i in M for a in i if a ==i[2]]
print(lst)
(4)
求出50以内能被3整除的数的平方,并放入到一个列表中。
'''
li=[i**2 for i in range(50) if i%3==0]
print(li)
'''
(5)
构建一个列表:['python1期', 'python2期', 'python3期', 'python4期', 'python6期', 'python7期', 'python8期', 'python9期', 'python10期']
'''
li=['python%s期'%i for i in range(1,11)]
print(li)
''')
(6)
构建一个列表:[(0, 1), (1, 2), (2, 3), (3, 4), (4, 5), (5, 6)]
'''
li=[(x,x+1) for x in range(6)]
print(li)
'''
(7)
构建一个列表:[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
'''
li=[i for i in range(19) if i%2==0]
print(li)
'''
(8)
有一个列表l1 = ['alex', 'WuSir', '老男孩', '太白']将其构造成这种列表['alex0', 'WuSir1', '老男孩2', '太白3']
l1 = ['alex', 'WuSir', '老男孩', '太白']
li=[l1[s]+str(s) for s in range(4)]
print(li)
(9)
题目
有以下数据类型:
x = {
'name':'alex',
'Values':[{'timestamp':1517991992.94,
'values':100,},
{'timestamp': 1517992000.94,
'values': 200,},
{'timestamp': 1517992014.94,
'values': 300,},
{'timestamp': 1517992744.94,
'values': 350},
{'timestamp': 1517992800.94,
'values': 280}
],}
将上面的数据通过列表推导式转换成下面的类型:
[[1517991992.94, 100], [1517992000.94, 200], [1517992014.94, 300], [1517992744.94, 350], [1517992800.94, 280]]
答案:
x = {
'name':'alex',
'Values':[{'timestamp':1517991992.94,
'values':100,},
{'timestamp': 1517992000.94,
'values': 200,},
{'timestamp': 1517992014.94,
'values': 300,},
{'timestamp': 1517992744.94,
'values': 350},
{'timestamp': 1517992800.94,
'values': 280}
],} li=[[i['timestamp'],i['values']] for i in x['Values']]
print(li)
巨蟒python全栈开发-第12天 生成器函数 各种推导式 yield from的更多相关文章
- 巨蟒python全栈开发-第9天 初识函数
一.今日主要内容总览(重点) 1.什么是函数? f(x)=x+1 y=x+1 函数是对功能或者动作的封装2.函数的语法和定义 def 函数名(): 函数体 调用:函数名()3.关于函数的返回值 ret ...
- 巨蟒python全栈开发-第10天 函数进阶
一.今日主要内容总览(重点) 1.动态传参(重点) *,** *: 形参:聚合 位置参数*=>元组 关键字**=>字典 实参:打散 列表,字符串,元组=>* 字典=>** 形参 ...
- python全栈开发-Day11 迭代器、生成器、面向过程编程
一. 迭代器 一 .迭代的概念 迭代器即迭代的工具,那什么是迭代呢? 迭代是一个重复的过程,每次重复即一次迭代,并且每次迭代的结果都是下一次迭代的初始值 while True: #只是单纯地重复,因而 ...
- python 全栈开发,Day13(迭代器,生成器)
一.迭代器 python 一切皆对象 能被for循环的对象就是可迭代对象 可迭代对象: str,list,tuple,dict,set,range 迭代器: f1文件句柄 dir打印该对象的所有操作方 ...
- 巨蟒python全栈开发linux之centos1
1.linux服务器介绍 2.linux介绍 3.linux命令学习 linux默认有一个超级用户root,就是linux的皇帝 注意:我的用户名是s18,密码是centos 我们输入密码,点击解锁( ...
- 巨蟒python全栈开发linux之centos6
1.nginx复习 .nginx是什么 nginx是支持反向代理,负载均衡,且可以实现web服务器的软件 在129服务器中查看,我们使用的是淘宝提供的tengine,也是一种nginx服务器 我们下载 ...
- 巨蟒python全栈开发linux之centos3
1.作业讲解 (1)递归创建文件夹/tmp/oldboy/python/{alex,wusir,nvshen,xiaofeng} 下面中的路径没有必要换,在哪里创建都行,根目录下或者tmp目录下或者其 ...
- 巨蟒python全栈开发django5:组件&&CBV&FBV&&装饰器&&ORM增删改查
内容回顾: 补充反向解析 Html:{% url ‘别名’ 参数 %} Views:reverse(‘别名’,args=(参数,)) 模板渲染 变量 {{ 变量名 }} 逻辑相关 {% %} 过滤器: ...
- 巨蟒python全栈开发-第4天 列表&元组&range
今日内容大纲 1. 什么是列表 定义: 能装对象的对象 在python中使用[]来描述列表, 内部元素用逗号隔开. 对数据类型没有要求 列表存在索引和切片. 和字符串是一样的. 2. 相关的增删改查操 ...
随机推荐
- LinkedList的一种错误使用方法
近期在做图像处理的时候.发现某一段代码很的慢.慢得让人无法接受.基本的代码是顺序訪问一个LinkedList的元素,效果是随着index的变大,速度越来越慢,list的元素个数在百万以上.找到原因,分 ...
- Lintcode---二叉树的前序、中序、后序遍历
给出一棵二叉树,返回其节点值的后序遍历. 您在真实的面试中是否遇到过这个题? Yes 样例 给出一棵二叉树 {1,#,2,3}, 1 \ 2 / 3 返回 [3,2,1] 思路:二叉树的后序遍历,简单 ...
- 怎样使用Debussy+ModelSim快速查看前仿真波形
引子:ModelSim是HDL仿真软件,Debussy是波形查看软件:搭配使用,相当爽.此处所谓快速查看前仿真波形仅为抛砖引玉,大家不要拘泥于此.两款软件的功能都很强大,请自行研究. 注:本篇博文的软 ...
- 解决Jenkins无法编译Egret5.0项目的问题
问题的原因可查看:https://blog.csdn.net/sujun10/article/details/75512929 解决 造成这个问题的原因是用户权限分配,你可以通过下面几步解决,而非改e ...
- 讲一下 Spring的事务传播特性
1. PROPAGATION_REQUIRED: 如果存在一个事务,则支持当前事务.如果没有事务则开启 2. PROPAGATION_SUPPORTS: 如果存在一个事务,支持当前事务.如果没有事 ...
- word中特殊符号的替换
首先在word里替换快捷键是ctrl+H,点击“更多”,会出现更多选项,在特殊格式那里可以选在各种符号,比如回车,空格什么的. 有的时候在word里看不到一些格式,需要点一下下图的对着的两个箭头图标: ...
- EMMC与nand flash的区别
1.NAND Flash 是一种存储介质,要在上面读写数据,外部要加主控和电路设计. 2.eMMC是NAND flash+主控IC ,对外的接口协议与SD.TF卡类似:对厂家而言简化了电路设计,降低了 ...
- C扩展php的方法(制作php扩展库)
用PHP调用C扩展整个配置过程在CentOS下 今天终于把C扩展加入到PHP中了,并且可以调用,废话就不说了,看下文. 一.必须先要安装Apache和mysql,这两个的安装过程我就不说了. ...
- APACHE支持.htaccess
需要开启.htacess功能需要以下三步: 1 2 3 4 5 6 7 8 9 1.打开httpd.conf 将Options FollowSymLinks AllowOverride None ...
- ZABBIX监控原理
zabbix实现原理及架构详解 想要用好zabbix进行监控,那么我们首要需要了解下zabbix这个软件的实现原理及它的架构.建议多阅读官方文档. 一.总体上zabbix的整体架构如下图所示: 重 ...