一 . 生成器

  生成器就是迭代器

  生成器的特点和迭代器一样.

    1.省内存

    2.惰性机制

    3.只能向前

  在python中有三种方式获取生成器

    1.通过生成器函数

    2.通过各种推导式来实现生成器

    3.通过数据的转换也可以获取生成器

  简单的生成器函数

def func():    print("111")    yield 222 ret = func()
print(ret) 结果:
<generator object func at 0x10567ff68>

   yield和return的效果是一样的.  有什么区别呢?  yield是分段来执行一个 函数. return呢? 直接停止执行函数.

def func():    print("111")    yield 222    print("333")    yield 444 gener = func()
ret = gener.__next__()
print(ret)
ret2 = gener.__next__()
print(ret2)
ret3 = gener.__next__()  # 最后⼀一个yield执行完毕. 再次__next__()程序报错, 也就是 说. 和return无关了了.
print(ret3) 结果: 111
Traceback (most recent call last):
222
333
File "/Users/sylar/PycharmProjects/oldboy/iterator.py", line 55, in <module>
444    ret3 = gener.__next__()  # 最后⼀一个yield执行完毕. 再次__next__()程序报错, 也 就是说. 和return无关了了. StopIteration

  send和__next__()区别:

    1. send和next()都是让⽣生成器向下走一次

    2. send可以给上一个yield的位置传递值, 不能给后一个yield发送值. 在第一次执行生
  成器代码的时候不能使用send()

生成器可以使用for循环来循环获取内部的元素

def func():    print(111)    yield 222    print(333)    yield 444    print(555)    yield 666 gen = func()
for i in gen:    print(i) 结果:
111
222
333
444
555
666

二 . 推导式

  列表推导式:

lst = [i for i in range(1, 15)]
print(lst)

列表推导式的常用写法:

  [ 结果 for 变量 in 可迭代对象]

生成器表达式和列表推导式的语法基本上是一样的. 只是把[]替换成()

gen = (i for i in range(10))
print(gen) 结果:
<generator object <genexpr> at 0x106768f10> 

生成器表达式也可以进行筛选:

# 获取1-100内能被3整除的数
gen = (i for i in range(1,100) if i % 3 == 0)
for num in gen:    print(num) # 100以内能被3整除的数的平方
gen = (i * i for i in range(100) if i % 3 == 0)
for num in gen:    print(num) # 寻找名字中带有两个e的人的名字
names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 'Joe'],          ['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']] # 不用推导式和表达式
result = []
for first in names:    for name in first:        if name.count("e") >= 2:            result.append(name) print(result) # 推导式
gen = (name for first in names for name in first if name.count("e") >= 2)
for name in gen:    print(name)    

生成器表达式和列表推导式的区别: 

  1. 列表推导式比较耗内存. 一次性加载. 生成器表达式几乎不占用内存. 使用的时候才分配和使用内存

  2. 得到的值不一样. 列表推导式得到的是一个列表. 生成器表达式获取的是一个生成器.

生成器的惰性机制: 生成器只有在访问的时候才取值. 说白了. 你找他要他才给你值. 不找他要. 他是不会执行的.

def func():    print(111)    yield 222 g = func()  # 生成器g
g1 = (i for i in g) # 生成器g1. 但是g1的数据来源于g
g2 = (i for i in g1)    # 生成器g2. 来源g1 print(list(g))  # 获取g中的数据. 这时func()才会被执行. 打印111.获取到222. g完毕.
print(list(g1))  # 获取g1中的数据. g1的数据来源是g. 但是g已经取完了. g1也就没有数据了
print(list(g2))  # 和g1同理

  深坑==> 生成器. 要值得时候才拿值. 

字典推导式: 

# 把字典中的key和value互换
dic = {'a': 1, 'b': '2'}
new_dic = {dic[key]: key for key in dic}
print(new_dic) # 在以下list中. 从lst1中获取的数据和lst2中相对应的位置的数据组成一个新字典
lst1 = ['jay', 'jj', 'sylar']
lst2 = ['周杰伦', '林俊杰', '邱彦涛']
dic = {lst1[i]: lst2[i] for i in range(len(lst1))}
print(dic)

集合推导式:

lst = [1, -1, 8, -8, 12]
# 绝对值去重 

s = {abs(i) for i in lst}
print(s)

  总结: 推导式有, 列表推导式, 字典推导式, 集合推导式, 没有元组推导式 

      生成器表达式: (结果 for 变量 in 可迭代对象 if 条件筛选)

   生成器表达式可以直接获取到生成器对象. 生成器对象可以直接进行for循环. 生成器具有惰性机制

def add(a, b):    return a + bdef test():    for r_i in range(4):        yield r_ig = test()  for n in [2, 10]:    g = (add(n, i) for i in g)print(list(g))结果:
[20,21,22,23]

   友情提示: 惰性机制, 不到后不会拿值

  这个题要先读一下. 然后自己分析出结果. 后用机器跑一下.

转载于:https://www.cnblogs.com/xiangweilai/p/9468386.html

生成器和生成器表达式相关推荐

  1. python生成器yield原理_Python generator生成器和yield表达式详解

    前言 Python生成器(generator)并不是一个晦涩难懂的概念.相比于MetaClass和Closure等概念,其较为容易理解和掌握.但相对于程序结构:顺序.循环和分支而言其又不是特别的直观. ...

  2. 初识生成器与生成器表达式 Day12

    一.生成器 1,生成器基本概念 生成器的实质是迭代器 迭代器:Iterator 内部同时包含了__iter__()和__next__()函数 可迭代对象:Iterable 内部包含__iter__() ...

  3. 初学者python笔记(迭代器、生成器、三元表达式、列表解析、send()与yield())

    文章目录 迭代器与for循环的关系 1. 迭代器协议 2. 可迭代对象 3. for循环的本质 4. 强大的for循环机制 5. 迭代器如何工作的 6. while循环模拟for循环与迭代器的结合 7 ...

  4. python生成器表达式_python 生成器和生成器表达式

    1.生成器 生成器的本质就是迭代器 生成器的特点和迭代器一样.取值方式和迭代器一样(__next__(),send():给上一个yield传值) 生成器一般由生成器函数或者生成器表达式来创建 其实就是 ...

  5. Python中的yield关键字及表达式、生成器、生成器迭代器、生成器表达式详解

    文章目录 1. yield关键字及表达式.生成器.生成器迭代器.生成器表达式 1.1 yield关键字及表达式(yield expression) 1.1.1 yield关键字 1.1.2 yield ...

  6. 用python编写图片生成器_python生成器

    生成器 一.生成器 定义: 生成器与迭代器看成是一种.生成器的本质就是迭代器. 唯一的区别: 生成器是自己用python写代码构建的数据结构.迭代器都是(系统)提供的,或者转化而来的 获取生成器的三种 ...

  7. 自动论文生成器 python_python生成器

    python生成器 python高级特性 首先, 所有的生成器都是迭代器, 因为生成器完全实现了迭代器的接口. 在python中, 有两种不同的方式提供生成器: 1. 生成器表达式 2. 生成器函数 ...

  8. python生成器next_Python生成器生成next,python,yieldnext

    在实践keras网络模型的时候,发现keras fit_generator与flow_from_directory函数均有关于生成器的频繁使用:因此在本文中对其进行总结. Python 之所以要提供这 ...

  9. python小说自动生成器_python- generator生成器

    什么是生成器? 通过列表生成式,我们可以直接创建一个列表,但是,受到内存限制,列表容量肯定是有限的,而且创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后 ...

最新文章

  1. Android屏幕信息获取
  2. VTK:图片之ImageHybridMedian2D
  3. QUIC协议的演进之路
  4. 物流设计大赛优秀作品_中国外运杯第七届全国大学生物流设计大赛案例专家评审会在京召开...
  5. 作者:​林旺群(1983-),男,博士,北京系统工程研究所助理研究员。
  6. python email模块详解_Python使用email模块对邮件进行编码和解码的实例教程
  7. 华文行楷字帖欣赏_著名男演员姜文,8幅精品书法作品欣赏,专家:姜文的字还未入门...
  8. ARM开发7.5.1 基础实训( 5 ) 4×4 矩阵键盘和 2 路 LED 显示系统( 1)--LPC21XX
  9. 曙光超级计算机用的芯片是国产吗,真正中国芯片龙头是中科曙光
  10. 提高计算机CPU运行速度,提高cpu运行速度的方法
  11. linux下配置内网ip
  12. 第五天实验---MGRE环境下的OSPF实验
  13. 涉嫌一级强奸重罪之后,危险的刘强东和京东
  14. 关于基于kangle和EP面板使用CDN
  15. java宠物狗商店交流网站ssm框架
  16. 穷人要如何翻身?富人要如何更富?穷人应怎么做才能跟上时代实现“草根创业”?
  17. 全志H616开发板Orange Pi Zero2连接香橙派5寸TFT液晶屏的测试说明
  18. Google的Protobuf入门
  19. 达人评测 骁龙898参数
  20. iframe嵌套跨域名页面问题处理

热门文章

  1. SpringCloud-创建服务消费者-Ribbon方式(附代码下载)
  2. 数据库系统概念总结:第七章 数据库设计和E-R模型
  3. Flutter基础笔记
  4. dart语法中list相关详解
  5. python join_详解Python中的join()函数的用法
  6. C#学习小结(DAY1)
  7. linux设置证书登录密码修改,centos7 配置使用证书登录
  8. 动力节点老杜mysql文件_mysql主从复制+mysql主从复制延迟解决方案
  9. 图解+笔记-python语言-第5章:数字/5.3 内置数字工具/5.3.2 内置数学函数
  10. linux安全配置-将ssh服务隐藏于Internet(端口碰撞)