python基础之生成器,生成器函数,列表推导式
内容梗概: 1. 生成器和生成器函数. 2. 列表推导式. 1.生成器函数1.1 生成器函数. 就是把return换成yield
def gen():print("爽歪歪")yield "娃哈哈" # 可以让我们的函数分段运行print("酸酸乳")yield "AD钙奶"print("黄焖鸡米饭")ret = gen() # 不会执行你的函数, 获取到生成器对象
# 迭代器不能等价代换
print(ret) # <generator object gen at 0x00000195518CFE60> generator 生成器
print(ret.__next__()) # 必须执行__next__()才可以触发生成器的运行 娃哈哈
print(ret.__next__()) # 必须执行__next__()才可以触发生成器的运行 AD钙奶
print(ret.__next__()) # StopIteration 迭代器, 就找yield, 执行不到才会报错
1.2 生成器函数的作用:节省内存,要多少用多少
def gen():lst = []for i in range(1, 10000):lst.append("衣服%s" % i)if i % 50 == 0: # 1 2 3 4 5 6 7 8 9 .. 49 50yield lstlst = [] # 每次生成一个新列表g = gen() # 获取到生成器print(g.__next__())
print(g.__next__())
print(g.__next__())
print(g.__next__())
print(g.__next__())
生成器和迭代器有相同的特点# 节省内存# 惰性机制# 只能往前 生成器还可以使用__next__(), send()来访问生成器send()可以给上一个yield位置传值详见实例:
def func():print("水饺")a = yield "大馅水饺"print("a=", a)print("烧饼")b = yield "武大郎烧饼"print("b=",b)print("老婆饼")c = yield "只要老婆不要饼"print("c=", c)
1.3 x.send()的用法
gen = func() # 生成器
print("返回值是:", gen.__next__())
print("返回值是:",gen.send("混沌面")) # 和__next__()一样也是向下找yield. 给上一个yield传值
print("返回值是:",gen.send("胡辣汤")) # 和__next__()一样也是向下找yield. 给上一个yield传值
print("返回值是:",gen.send("马拉")) # 和__next__()一样也是向下找yield. 给上一个yield传值
send()不可以在第一个位置和最后一个位置出现 最后的yield后的代码是可以执行的但是会报错. StopIteration 注意:生成器函数里不要写return
def func():print("哈哈")yield "呵呵"print("吼吼")return "嘻嘻" # don't do this! gen = func()gen.__next__()gen.__next__()
2.推导式2.1列表推导式:lis = [结果 for循环 if判断语句]实例1 筛选出名字长度小于二的
lst = ["中岛美雪", "夏川美里", "原由子", "汪峰", "田震","那英","周杰伦"]
new_lst = [ el for el in lst if len(el) == 2] #此处快速创建了一个新列表,并用IF语句做出来筛选
print(new_lst)
实例2
[3,6,9] 已知 求转换成[(1,2,3), (4,5,6), (7,8,9)]lst = [3,6,9]
new_lst = [(el-2, el-1, el) for el in lst]
2.2 字典推导式 {结果 for循环 if判断}
实例一 lst = [11, 22, 33] # => {0:11, 1:22, 2:33} dic = {i:lst[i] for i in range(len(lst)) } #字典推导式 print(dic) 实例二 dic = {"张无忌":"赵敏", "杨过":"小龙女", "郭靖":"黄蓉"} # 把字典中的key和value互换 # dic = {"赵敏":"张无忌", "小龙女":"杨过", "黄蓉":"郭靖"} 法1 dic1 = { v:k for k, v in dic.items()} # 强化 print(dic1) 法2 dic2 = { dic[k]:k for k in dic} # 强化 print(dic2)
2.3 集合推导式 # 特点: 不可变. 不重复, 无序{结果 for循环 if判断}s = {i*"胡辣汤" for i in range(10)}print(s) 注意: 没有元组推导式 2.1 生成器表达式 (结果 for循环 if判断) => 生成器表达式2.1.1特点: 本质是迭代器. __next__() 1. 省内存 2. 惰性机制 3. 只能向前 2.1.2为啥省内存?
lst = ["衣服%s" % i for i in range(100000000)] # 占内存 print(lst)g = ("衣服%s" % i for i in range(100000000)) # 生成器表达式. 节省内存,要多少多少 print(g.__next__()) print(g.__next__()) print(g.__next__()) print(g.__next__())
生成器推导式的一些坑1. list()里面包含循坏,会循环生成器,打印成列表2.生成器的惰性机制,拿一次取一次详见实例: 实例1:
g = (i for i in range(10)) print(list(g)) # 把传递进来的数据转化成列表. 里面包含了for循环 list() => for=> __iter__() ==> __next__() print(list(g)) # 上一次已经拿没了,因为生成器是一次性的,且只能往前取值,所以会打印出空表格 print(g.__next__()) for el in g:print(el) for el in g: # 已经没有数据了 惰性机制-> 只能往前print(el)
实例2 :
def func(): # 生成器函数print(111)yield 222 g = func() # 生成器 -> 没有执行过__next__() g1 = (i for i in g) # 生成器表达式. 也没有__Next__() g2 = (i for i in g1) # 生成器表达式. 也没有__Next__() # 到此为止, 没有人拿过值 print(list(g)) # 111 [222] print(list(g1)) # [] #因为前面的g已将拿过值了,g已经空了,先到先得 print(list(g2)) # []
tips:生成器表达式和列列表推导式的区别:1. 列表推导式比较耗内存. 一次性加载. 生成器表达式几乎不占⽤用内存. 使用的时候才分配和使用内存2. 得到的值不一样. 列表推导式得到的是⼀个列列表. 生成器表达式获取的是⼀个生成器. 补充知识点:yield from在python3中提供了了一种可以直接把可迭代对象中的每一个数据作为生成器的结果进行返回
def gen():lst1 = ["⿇花藤", "胡辣汤", "微星牌饼铛", "Mac牌锅铲"]lst2 = ["饼铛还是微星的好", "联想不能煮鸡蛋", "微星就可以", "还可以烙饼"]yield from lst1yield from lst2 g = gen() for el in g:print(el) #结果会先将lst1先打印完,然后再打印lst2
转载于:https://www.cnblogs.com/Mixtea/p/9892265.html
python基础之生成器,生成器函数,列表推导式相关推荐
- python之生成器(~函数,列表推导式,生成器表达式)
一.生成器 概念:生成器的是实质就是迭代器 1.生成器的贴点和迭代器一样,取值方式也和迭代器一样. 2.生成器一般由生成器函数或者声称其表达式来创建,生成器其实就是手写的迭代器. 3.在python中 ...
- Python入门 推导式 ! 解释:生成器表达式和列表推导式的区别
Python 入门之 推导式 学习python中有什么不懂的地方,小编这里推荐加小编的python学习群:895,817, 687 有任何不懂的都可以在里面交流,还有很好的视频教程pdf学习资料,大家 ...
- 函数生成器、生成器表达式,列表推导式
目录 一.生成器 ⼆.列表推导式,⽣成器表达式以及其他推导式 三.字典推导式 四.集合推导式 一.生成器 ⼀.⽣成器什么是⽣成器.⽣成器实质就是迭代器. def fun():print('111')r ...
- python中的列表生成式_生成器中的列表推导式
# 2,用列表推导式做下列小题 # 1)过滤掉长度小于3的字符串列表,并将剩下的转换成大写字母 # lst=['abc','asfg','ad','ap'] # print([i.upper() fo ...
- 生成器和迭代器,列表推导式
迭代器 可迭代协议 : 某个变量中含有__iter__方法,这个变量可迭代 迭代器协议 : 某个变量中含有__iter__和__next__方 迭代器和可迭代的关系: 迭代器一定可迭代\反之不成立 迭 ...
- Python语言学习讲解十:列表推导式
注:每周一到周五都会进行相关Python基础知识更新,欢迎大家提宝贵的意见 一.用列表推导式取代map和filter python 提供一种精炼的写法,可以根据一份列表来制作另外一份列表.这种表达式称 ...
- Python 知识点全解析系列之列表推导式(list comprehension)
Python里面有个很棒的语法糖(syntactic sugar),它就是 list comprehension ,可以方便的操作list, dict, set等数据结构.有人把它翻译成"列 ...
- else列表推导式 if python_python3基础09列表推导式|迭代器|生成器|匿名函数
"pythonic生物人"的第46篇分享. python3匿名函数.推导式.迭代器和生成器用法. 目录 1.匿名函数(lambda)2.推导式(comprehensions) 列表 ...
- python 三元表达式、列表推导式、生成器表达式、递归、匿名函数、内置函数
一.三元表达式 语法:[成立1 if condition1 else成立2 if condition2 else ...if 成立N conditionN else 不成立] sex = 'man' ...
最新文章
- C++ 虚函数和纯虚函数的用法
- 前端学习 -- Css -- 字体分类
- mysql数据库主从同步配置教程--数据库同步
- dao传递类参数 mybatis_MyBatis DAO层传递参数到mapping.xml 几种方式
- SAP直接踢人下线 SM04
- HALCON示例程序max_connection.hdev确定分割区域的最大区域数目
- jpa 与非jpa 结合_EasyCriteria –使用JPA标准的简便方法
- Subscription
- 助力移动AR应用发展,阿里巴巴推出AR开放平台
- Sass:基础用法学习笔记
- 为什么登录MySQL会闪退_MySql登录时闪退的快速解决办法
- 制作一个美团饿了么外卖的cps小程序
- tp1900芯片对比7621a_TP-LINK WDR7660千兆版 厉害了单芯片TP1900-路由器交流
- Python 爬取科技部计划申报指南pdf文件并作词频分析
- Windows通过IP地址向对方发送信息
- C语言中 \0 代表什么?
- elasticsearch+logstash+kibana+filebeat+kafka
- unity模型制作(终章):柔体布料绘制
- 【UNR #1】合唱队形
- 【Lawin Transformer2022】Lawin Transformer: Improving Semantic Segmentation Transformer with Multi-Sc
热门文章
- linux/docker个人服务器项目中文变问号??,时间差8小时问题解决方法,最新,最有效
- 2022-2028年中国碘矿行业竞争格局分析及市场需求前景报告
- docker常用命令详解
- 2022-2028年中国手机配件行业发展前景战略及投资风险预测分析报告
- 2022-2028年中国新零售行业深度调研及投资前景预测报告(全卷)
- win10系统的“管理员”
- PyTorch代码调试利器_TorchSnooper
- RCNN系列、Fast-RCNN、Faster-RCNN、R-FCN检测模型对比
- Python案例:使用正则表达式的爬虫
- Django 上传图片和Admin站点5.2