linuxsir首页 LinuxSir.Org | Linux、BSD、Solaris、Unix | 开源传万世,因有我参与欢迎您!
网站首页 | 设为首页 | 加入收藏
您所在的位置:主页 > Linux基础建设 >

Python 生成器和推导式

时间:2019-10-08  来源:未知  作者:admin666

一、Python生成器和生成器函数
1、生成器和生成器函数的概念
    1、生成器的本质是迭代器
    2、函数中包含yield,就是生成器函数

2、生成器函数的写法
    def func():
        a =10
        yield 20
    gen = func()  #没有执行,而是生成一个生成器
    普通函数和生成器函数的不同
    1、普通函数名()表示函数的的执行
    2、生成器函数名()不是函数的执行,而是生成一个生成器

    yield和return的不同
    1、retun表示返回,同时函数执行终止,return之后的代码不会执行
    2、yield也表示返回,函数暂停,函数分段执行

    def func():
        a =10
        yield 20
        b = 30
        yield 40
    gen = func()  #生成一个生成器
    gen.__next__() #返回20 执行到第一个yield
    gen.__next__() #返回40 从第一个yeild开始执行到第二个yield

3、如何得到生成器
    1、生成器函数
      生成器函数名()
    2、生成器表达式
    3、类型转换

4、生成器的特点
    1、节省内存
    2、惰性机制(每执行一次__next__()方法,取值一次)
    3、只能向前取值,不能退后

5、生成器的取值
    __next__()方法和send()方法的区别
      前者表示向下取值
      后者除了表示向下取值,还可以给上一个yield传递值
      注意:send()方法不能用在第一个取值,第一个取值只能用__next__()
            最后一个yield也不能用send()

6、生成器的好处
    节约内存
'''

#关于__next__()方法和send()方法的例子
def func():
    a = 1
    a2 = yield 2
    print(a2)
    c = 3
    c2 = yield 4
    print(c2)
    yield 5
gen = func() #生成一个生成器
gen.__next__()  #执行到了第一个yield
gen.send('test') #把参数传递到第一个yield
gen.send('娃哈哈') #把参数传递到第2个yield

#生成器的好处-节约内存的例子
#一次性买100件衣服,需要地方保存,比较浪费内存
li1 = []
def func2():
    for i in range(1,11):
        li1.append('衣服 %s' % i)
    return li1
ret = func2()
print(ret)  #100件衣服一次性生成出来,放到列表到了
print('----------1')

#最好的方式是下一个100件衣服的订单,但是呢,需要一件,送一件,就不需要专门的地方保存了,节约内存
#方法1 生成器函数
def func3():
    for i in range(1,11):
        yield ('衣服 %s' %i)
gen = func3()  #生成一个生成器
print(gen.__next__()) #第一件
print(gen.__next__()) #第二件
for i in gen: #生成器本质是迭代器,支持for循环
    print(i)

#方法2 生成器表达式
# gen = (i for i in range(1,11))
# print(gen)  #生成一个生成器(类比:就是买衣服订单)
# print(gen.__next__()) #第一件
# print(gen.__next__()) #第二件
# for i in gen: #生成器本质是迭代器,支持for循环
#    print(i)

二、推导式
推导式(列表推导式,字典推导式等)
1、列表推导式:[结果      for循环 if条件]
2、字典推导式:{key: value for循环 if条件}
3、集合推导式:{key        for循环 if条件}
注意:没有元组推导式

三、生成器表达式
1、生成器表达式:(结果 for循环 if条件)
2、惰性机制(类比:弹夹没子弹了,不能将同一个值,生成2次)
  生成器是记录在内存中的一段代码,产生的时候,没有执行

生成器表达式和列表推导式的区别类比:
1、买100个鸡蛋,列表推导式:是一次性把100个鸡蛋买回来,需要地方存储
2、生成器表达式:是买一只母鸡,需要鸡蛋就给下蛋

Linux公社的RSS地址:https://www.linuxidc.com/rssFeed.aspx

友情链接
  • Mozilla发布Firefox 67.0.4,修复沙箱逃逸漏洞
  • 蚂蚁金服正式成为CNCF云原生计算基金会黄金会员
  • Firefox 68将采用Microsoft BITS安装更新
  • OpenSSH增加对存储在RAM中的私钥的保护
  • 谷歌想实现自己的curl,为什么?
  • Raspberry Pi 4发布:更快的CPU、更大的内存
  • Firefox的UA将移除CPU架构信息
  • Ubuntu放弃支持32位应用程序实属乌龙,Steam会否重回Ubuntu怀抱
  • Qt 5.13稳定版发布:引入glTF 2.0、改进Wayland以及支持Lottie动
  • 红帽企业Linux 7现已内置Redis 5最新版
  • Slack进入微软内部禁用服务清单,GitHub也在其列?
  • 安全的全新编程语言V发布首个可用版本
  • Windows Terminal已上架,快尝鲜
  • 阿里巴巴微服务开源生态报告No.1
  • 面世两年,Google地球将支持所有基于Chromium的浏览器
  • 推进企业容器化持续创新,Rancher ECIC千人盛典完美收官
  • CentOS 8.0最新构建状态公布,或于数周后发布
  • Debian移植RISC
  • 微软拆分操作系统的计划初现雏形
  • Oracle发布基于VS Code的开发者工具,轻松使用Oracle数据库
  • Ubuntu 19.10停止支持32位的x86架构
  • 微软为Windows Terminal推出全新logo
  • 联想ThinkPad P系列笔记本预装Ubuntu系统
  • 微软发布适用于Win7/8的Microsoft Edge预览版
  • 启智平台发布联邦学习开源数据协作项目OpenI纵横
  • 经过六个多月的延迟,微软终于推出Hyper
  • ZFS On Linux 0.8.1 发布,Python可移植性工作
  • DragonFly BSD 5.6.0 发布,HAMMER2状态良好
  • Linux Kernel 5.2
  • CentOS 8.0 看起来还需要几周的时间
  • 百度网盘Linux版正式发布
  • PCIe 6.0宣布:带宽翻倍 狂飙至256GB/s
  • PHP 7.4 Alpha 发布,FFI扩展,预加载Opcache以获得更好的性能
  • Canonical将在未来的Ubuntu版本中放弃对32位架构的支持
  • Scala 2.13 发布,改进的编译器性能
  • 微软的GitHub收购了Pull Panda,并且使所有订阅完全免费
  • Windows Subsystem for Linux 2 (WSL 2)现在适用于Windows 10用
  • Debian 10 “Buster”的RISC
  • MariaDB宣布发布MariaDB Enterprise Server 10.4
  • DXVK 1.2.2 发布,带来微小的CPU开销优化
  • DragonFlyBSD 5.6 RC1 发布,VM优化,默认为HAMMER2
  • PrimeNG 8.0.0 发布,支持Angular 8,FocusTrap等
  • GIMP 2.10.12 发布,一些有用的改进
  • 清华大学Anaconda 镜像服务即将恢复
  • Debian GNU/Linux 10 “Buster” 操作系统将于2019年7月6日发布
  • 时时彩论坛
  • 五星体育斯诺克
  • 北单比分直播
  • 河北11选5走势图
  • 福建体彩36选7开奖结果
  • 九龙图库下载