一.生成器
本质就是迭代器. 我们可以直接执⾏__next__()来执⾏ 以下⽣成器
一个一个的创建对象
创建生成器的方式:
1.生成器函数
2.通过生成器 表达式来获取生成器
3.类型转换(看不到)
二.生成器函数(重点)   
深坑:生成器在要值得时候才拿值
生成器函数中包含yield,返回数据和return差不多:return会立即结束这个函数的执行,yield 表示返回,不会终止函数的执行,可以分段的执行一个函数.
当函数中包含了yield,次函数就是生成器函数
坑:生成器函数在执行的时候返回生成器.而不是之直接执行此函数
函数中包含了yield, 此函数就是生成器函数
大坑: 生成器函数运行之后. 产生一个生成器. 而不是运行函数
def func():
print("我叫周润发")
yield "林志玲"   # yield表示返回. 不会终止函数的执行
print("宝宝干嘛去了??")
yield "宝宝回来了"
print("宝宝你在干嘛?")
# yield "没了"
ret = func() # 执行函数, 此时没有运行函数.生成器或者迭代器的好处:节省内存
# # 此时我们拿到的是生成器
# print("返回值是", ret) # <generator生成器 object func at 0x0000000009E573B8>
# 执行到下一个yield
print(ret.__next__()) # 第一次执行__next__此时函数才开始执行
print(ret.__next__()) # 执行到下一个yield
print(ret.__next__()) # StopIteration

send()  ----> 同__next__()开始执行
send()可以给上一个yield位置传值
能够向下执行的两个条件:
__next__(),执行到下一个yield
send(),执行到下一个yield,给上一个yield位置传值,
send和__next__()区别: 
1. send和next()都是让⽣成器向下走⼀次
2. send可以给上⼀个yield的位置传递值, 不能给最后⼀个yield发送值. 在第⼀次执⾏⽣ 成器代码的时候不能使⽤send()
def func():
print("韭菜盒子")
a = yield "韭菜鸡蛋"
print("a", a)
b = yield "韭菜西红柿"
print("b", b)
c = yield "火烧"
yield "GAME OVER"
gen = func()
print(gen.__next__()) # 第一个位置用send没有任何意义
print(gen.send("篮球")) # 给上一个yield位置传值  "篮球"这个值赋值给a
print(gen.send("足球"))
##韭菜盒子
韭菜鸡蛋
a 篮球
韭菜西红柿
b 足球
火烧

生成器中记录的是代码而不是函数的运行
def func():
print("我的天哪 ")
yield "宝宝"
gen = func() # 创建生成器.  此时运行会把生成器函数中的代码记录在内存
当执行到__next__(), 运行此空间中的代码, 运行到yield结束.
优点: 节省内存, 生成器本身就是代码. 几乎不占用内存
特点: 惰性机制, 只能向前. 不能反复
三.各种推导式
列表推导式    [结果 for循环 if]
#生成列表: python1->python18
lst = []
for i in range(1, 19):
lst.append("python%s期" % i)
print(lst)
列表推导式 [结果 for循环 if条件]
lst = ["python%s期" % i for i in range(1, 19)]
print(lst)
#生成列表.类表中装的数据是 1-100之间所有的偶数的平方
lst = [i**2 for i in range(1, 101) if i%2 == 0]
print(lst)
#筛选出列表中姓张的同学, lst = ["张无忌", "吴奇隆", "张诗诗", "范冰冰", "张翠山"]
lst = ["张无忌", "吴奇隆", "张诗诗", "范冰冰", "张翠山"]
lst2 = [name for name in lst if name.startswith("张")]
print(lst2)
# 寻找名字中带有两个e的人的名字
names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven','Joe'],
['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']]
lst = [name for el in names for name in el if name.count("e") == 2]
print(lst)

字典推导式    {结果(k:v) for循环 if}
字典推导式
语法: { 结果(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 =  {"主食": "炒面", "副食": "小拌菜", "汤":"疙瘩汤"}
d = { v:k for k, v in dic.items()}
print(d)

结合推导式    {结果(k) for循环 if}
没有元组推导式
四.生成器表达式(重点)
(结果 for循环 if)
g = (i for i in range(10)) # 生成器表达式
print(g)  # <generator object <genexpr> at 0x0000000009E573B8>
print(g.__next__()) # 0
print(g.__next__()) # 1
print(g.__next__()) # 2
print(g.__next__()) # 3
print(g.__next__()) # 4
print(g.__next__()) # 5
print(g.__next__()) # 6
print(g.__next__()) # 7
print(g.__next__()) # 8
print(g.__next__()) # 9
# print(g.__next__()) # ??? StopIteration

from   可以把一个可迭代对象分别进行yield返回
def func():
lst = ["衣服%s" % i for i in range(500)]
yield from lst # 可以把一个可迭代对象分别进行yield返回
lst1 = ["python%s" % i for i in range(18)]
yield from lst1
gen = func()
print(gen.__next__())
print(gen.__next__())

转载于:https://www.cnblogs.com/yanghongtao/p/10102721.html

day 12 生成器和生成器函数以及各种推导式相关推荐

  1. 12 生成器和生成器函数以及各种推导式

    今日主要内容 1. 生成器 本质就是迭代器. 一个一个的创建对象 创建生成器的方式: 1. 生成器函数 2. 通过生成器表达式来获取生成器 3. 类型转换(看不到) 2. 生成器函数 (重点) 生成器 ...

  2. python 生成器装饰器_python: 生成器,装饰器以及列表推导式写法

    1.连接字符串尽量用format,两个的时候可以用 + name = "lxw" age = 24 x = "{0}{1}".format(name, age) ...

  3. 迭代器,生成器,三元运算,列表推导式

    目录 已学的知识中,哪些是对象 整型 浮点型 字符串 列表 元组 字典 集合 文件 函数 可迭代对象 可迭代对象有哪些? 字符串 列表 字典 集合 文件 总结:拥有iter方法的对象就是可迭代对象 迭 ...

  4. 轩小陌的Python笔记-day13 匿名函数、生成器、内置函数、推导式

    day13 内置函数和推导式 今日概要: 匿名函数 生成器 内置函数 附加:推导式,属于数据类型的知识,内部的高级的用法会涉及到[生成器]和[函数]的内容. 1. 匿名函数 传统的函数的定义包括了:函 ...

  5. Day13 内置函数和生成器及推导式

    day13 内置函数和推导式 今日概要: 匿名函数 生成器 内置函数 附加:推导式,属于数据类型的知识,内部的高级的用法会涉及到[生成器]和[函数]的知识. 1. 匿名函数 传统的函数的定义包括了:函 ...

  6. 13. 内置函数和推导式

    13. 内置函数和推导式 概要: 匿名函数 生成器 内置函数 附加:推导式,属于数据类型的知识,内部的高级的用法会涉及到[生成器]和[函数]的知识. 1. 匿名函数 传统的函数的定义包括了:函数名 + ...

  7. day13 内置函数和推导式

    day13 内置函数和推导式 今日概要: 匿名函数 生成器 内置函数 附加:推导式,属于数据类型的知识,内部的高级的用法会涉及到[生成器]和[函数]的知识. 1. 匿名函数 传统的函数的定义包括了:函 ...

  8. 模块二 day13 内置函数和推导式

    day13 内置函数和推导式 今日概要: 匿名函数 生成器 内置函数 附加:推导式,属于数据类型的知识,内部的高级的用法会涉及到[生成器]和[函数]的知识. 1. 匿名函数 传统的函数的定义包括了:函 ...

  9. 巨蟒python全栈开发-第12天 生成器函数 各种推导式 yield from

    一.今日主要内容总览(重点) 1.生成器(目的:帮助我们创建对象) (1)生成器的本质就是迭代器 (2)一个一个的创建对象 (3)创建生成器的方式: 1.生成器函数 2.通过生成器表达式来获取生成器 ...

最新文章

  1. android开发关于和使用本机内存,内置存储卡和外置存储卡大揭秘
  2. boost::property_map用法的测试程序
  3. Java Hashtable keySet()方法与示例
  4. python-opencv图像处理之SURF函数
  5. 尝试读取或写入受保护的内存 这通常指示_CPU到底有多快?内存:是我的250倍...
  6. php preg_replace html,php – 忽略preg_replace中的html标签
  7. awk入门-保护SSHD
  8. 区块链 自私挖矿(selfish mining)是什么
  9. Spring生态系统(Spring可能大家都在用,很少去关注整体架构)
  10. css div居中对齐
  11. 定积分的一些常用结论
  12. (判断题)两台路由器之间转发的数据包一定不携带VLAN TAG?
  13. Google搜索引擎的使用技巧
  14. css引入矢量图标_IconFont图标引用的方法步骤(代码) -
  15. 计算机视觉项目-银行卡卡号自动识别
  16. Android设置网络图片为手机背景图片的方法
  17. golang--channal与select
  18. python绘制三角函数图像
  19. 如何通过cmd怎么打开计算机管理
  20. 深度学习电脑配置选择

热门文章

  1. Android 10.0 Recent列表不显示某个app
  2. python小球方案问题_十二个小球称重问题及其Python实现
  3. 蓝光视频转换工具AnyMP4 Blu-ray Ripper Mac
  4. Win10使用vm虚拟机电脑蓝屏问题
  5. LeetCode_1046_最后一块石头的重量
  6. 软件定义网络笔记(PART 1)
  7. 如何使电脑网速加快,去掉系统的带宽限制
  8. 敏捷开发入门教程-----摘抄
  9. Datawhale--组队学习第12期--python爬虫基础学习---Task02:bs4、xpath和正则表达式(2天)
  10. 关于Keep-alive的认识和具体用法