一.生成器
   本质就是迭代器. 我们可以直接执⾏__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__())

python 生成器 和生成器函数 以及各种推导式的更多相关文章

  1. python高级内置函数和各种推导式的介绍:一行搞定的代码

    一.知识要点 all 都为真 any 有真的 min 最小的 max 最大的 sum 求和 reversed 反转 sorted 排序 zip 对应合并 [] 列表推倒式 () 生成器 {} 字典推倒 ...

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

    一.生成器    本质就是迭代器. 我们可以直接执⾏__next__()来执⾏ 以下⽣成器 一个一个的创建对象 创建生成器的方式: 1.生成器函数 2.通过生成器 表达式来获取生成器 3.类型转换(看 ...

  3. python 全栈开发,Day14(列表推导式,生成器表达式,内置函数)

    一.列表生成式 生成1-100的列表 li = [] for i in range(1,101): li.append(i) print(li) 执行输出: [1,2,3...] 生成python1期 ...

  4. Python 速通爆肝、列表推导式、生成器、装饰器、生命游戏

    列表推导式.赋值.切片(替换.插入).字符串处理与判断.enumerate().格式化字符串.读写文件.global 关键字.字符串startswith().类与对象.生成器.装饰器.Self.*ar ...

  5. 2018.11.06 生成器函数进阶&列表推导式&生成器表达式

    1.生成器函数进阶 2.列表推导式 3.生成器表达式

  6. python函数知识五 推导式和内置函数一(了解)

    17.推导式: 推导式:将for循环多行变成一行 list推导式:[] #普通模式 print([i for i in range(20)]) #循环模式 #[变量 for i in range(20 ...

  7. python之三元表达式,列表|字典推导式,函数对象

    #### 三元表达式: 就是if....else...的语法糖 # -- 1) 只能解决if...else...结构,其他if分支结构都不管 # -- 2)一个分支提供一个结果: 如果一个分支提供了多 ...

  8. Python-有名匿名函数、列表推导式

    介绍: 匿名函数:    匿名函数用lambda关键词能创建小型匿名函数.这种函数得名于省略了用def声明函数的标准步骤,节省开辟空间. 列表推导式: 有名函数 #1.有名函数(初始) def squ ...

  9. python之三元表达式、列表推导式、生成器表达式、递归、匿名函数、内置函数

    一 三元表达式.列表推导式.生成器表达式 一 三元表达式 name=input('姓名>>: ') res='SB' if name == 'alex' else 'NB' print(r ...

随机推荐

  1. 解决白屏(vue) - webpace es6转es5

    1.npm安装 npm install babel-polyfillnpm install es6-promise package.json中会出现 "babel-polyfill" ...

  2. (转)IBM AppScan 安全漏洞问题修复(.net)

    原文:https://www.cnblogs.com/anngeiBKY/p/4952269.html 按问题类型分类的问题 使用 SQL 注入的认证旁路2 已解密的登录请求3 登录错误消息凭证枚举1 ...

  3. Java 多线程学习笔记:生产者消费者问题

    前言:最近在学习Java多线程,看到ImportNew网上有网友翻译的一篇文章<阻塞队列实现生产者消费者模式>.在文中,使用的是Java的concurrent包中的阻塞队列来实现.在看完后 ...

  4. JavaScript -- Window-Interval

    -----031-Window-Interval.html----- <!DOCTYPE html> <html> <head> <meta http-equ ...

  5. Vue + Element UI 实现权限管理系统 前端篇(六):更换皮肤主题

    自定义主题 命令行主题工具 1.安装主题工具 首先安装「主题生成工具」,可以全局安装或者安装在当前项目下,推荐安装在项目里,方便别人 clone 项目时能直接安装依赖并启动. yarn add ele ...

  6. Java中的简单工厂模式(转)

    Java中的简单工厂模式 举两个例子以快速明白Java中的简单工厂模式: 女娲抟土造人话说:“天地开辟,未有人民,女娲抟土为人.”女娲需要用土造出一个个的人,但在女娲造出人之前,人的概念只存在于女娲的 ...

  7. spring boot 自动更新静态文件和后台代码 -- 热部署

    在spring boot使用的过程中, 发现我修改了静态文件, 前台刷新后, 没有任何变化, 必须重新启动, 才能看到, 这简直不能让人接受. 那有什么方法来解决这个问题呢. Baidu之后, 得到了 ...

  8. Spring-mvc登录方法及JSP的拦截

    添加登录拦截器:LoginInterceptor import javax.servlet.http.HttpServletRequest; import javax.servlet.http.Htt ...

  9. win10 磁盘占用高--- 禁用用户改善反馈 CompatTelRunner.exe

    1. 2.右键点开[这台电脑],点[管理],点[服务和应用程序]点[服务],在右边框里把[superfetch] [windows search][HomeGroupListener] [HomeGr ...

  10. double转换为int以及浮点型相加损失精度问题

    最近在做支付相关模块的业务,数据库字段却使用的是double类型,其实也行,只要计算不在sql语句中进行,也是没有问题的. 预先的类属性设置的是Double类型,自己算的时候发现小数相加会出现损失精度 ...