巨蟒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=0for i in re:print(i)m += 1if m==int(n):breaks=input('是否还要继续取衣服:').strip()if s=='是':continueelse: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'%igen=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 lstlst = ['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)
转载于:https://www.cnblogs.com/studybrother/p/10105570.html
巨蟒python全栈开发-第12天 生成器函数 各种推导式 yield from相关推荐
- 巨蟒python全栈开发-第10天 函数进阶
一.今日主要内容总览(重点) 1.动态传参(重点) *,** *: 形参:聚合 位置参数*=>元组 关键字**=>字典 实参:打散 列表,字符串,元组=>* 字典=>** 形参 ...
- python全栈开发—什么是迭代器生成器、装饰器、数据序列化,建议收藏
迭代器&生成器 装饰器 软件目录结构规范 作业:ATM项目开发 1.列表生成式,迭代器&生成器 列表生成式 孩子,我现在有个需求,看列表[0, 1, 2, 3, 4, 5, 6, 7, ...
- python全栈开发-Day11 迭代器、生成器、面向过程编程
一. 迭代器 一 .迭代的概念 迭代器即迭代的工具,那什么是迭代呢? 迭代是一个重复的过程,每次重复即一次迭代,并且每次迭代的结果都是下一次迭代的初始值 while True: #只是单纯地重复,因而 ...
- 巨蟒python全栈开发-第11阶段 ansible_project2
一个NB的网站: https://www.toolfk.com/ CDN:将用户的需求送到最近的节点:内容分发网络 有些是专门做CDN的工具 常用的markdown是需要知道的,短信有字数限制. we ...
- 巨蟒python全栈开发-第11阶段 ansible_project1
今日大纲: 1.前端页面介绍 2.发布流程 3.需求分析 4.表结构设计 5.前端页面设计 昨日内容回顾: 1.roles - tasks- handlers- files- templates- v ...
- python123蟒蛇代码_巨蟒python全栈开发-第3天
1 今日作业 1.有变量name = "aleX leNb" 完成如下操作: #1)移除 name 变量对应的值两边的空格,并输出处理结果 '''''' '''# name = & ...
- python点击事件onclick_巨蟒python全栈开发数据库前端6:事件onclick的两种绑定方式onblur和onfocus事件window.onload解释小米商城讲解...
1.回顾上节内容(JavaScript) 一.JavaScript概述 1.ECMAScript和JavaScript的关系 2.ECMAScript的历史 3.JavaScript是一门前后端都可以 ...
- 巨蟒python全栈开发flask10 项目开始2
1.websocket异常处理 出现上图报错的原因是什么? 原因是:websocket断开了,所以报错 19行接收的msg是None值,所以报错. 打开一个文件,点击发送音乐,出现上面的内容: 客户端 ...
- 巨蟒python全栈开发flask8 MongoDB回顾 前后端分离之H5pycharm夜神
1.MongoDB回顾 1.启动 mongod - 改变data/db位置: --dbpath D:\data\dbmongod --install 安装windows系统服务mongod --rem ...
最新文章
- 【备忘】Android获取正在使用网络的IP4地址
- python教程实例-Python中函数的用法实例教程
- Zabbix监控,详细部署
- 在洛谷开了一个邀请赛
- .NET操作Excel
- 利用Frame Animation实现动画效果,代码正确,就是达不到变换效果
- MySQL高可用--MGR入门(3)单主/多主模式切换
- key redis 模糊查询个数_Reids Lua 模糊查询所有key 及 相对应的集合总数
- C语言中函数中传入一个数组,并且返回一个数组
- Linux ag命令
- python之类之多继承
- python读取excel数据为矩阵_用Python实现excel中“矩阵”式列表转“向量”式列表...
- VMware vSphere Hypervisor 6 (ESXi) 免费许可证使用限制
- SPSSAU入门---浅谈问卷设计到数据分析之间的联系
- 一半嫁妆钱,换了90000张照片,一个老爹的摄影计划
- C#接入steam内购
- QueryRunner常用方法
- Ajax异步数据抓取
- 微信公众号--php
- Python PDF转Word,以及提取Word中图片里的文字