一.生成器

  什么是生成器,生成器的实质就是迭代器

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

    1.通过生成器函数

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

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

  1. 1 def func()
  2. 2 print("111")
  3. 3 yield 222
  4. 4 ret = func()
  5. 5 print(ret)
  6. 6
  7. 7 结果:
  8. 8 <generator object func at 0x10567ff68>

   send方法和__next__()

   send和__next__()一样都可以让生成器执行到下一个yield.

  1. def eat():
  2. print("我吃什么啊")
  3. a = yield "馒头"
  4. print("a=",a)
  5. b = yield "大饼"
  6. print("b=",b)
  7. c = yield "韭菜盒子"
  8. print("c=",c)
  9. yield "GAME OVER"
  10. gen = eat() # 获取生成器器
  11. ret1 = gen.__next__()
  12. print(ret1)
  13. ret2 = gen.send("胡辣汤")
  14. print(ret2)
  15. ret3 = gen.send("狗粮")
  16. print(ret3)
  17. ret4 = gen.send("猫粮")
  18. print(ret4)

    send和__next__() 的区别:

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

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

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

  1. def func():
  2. print(111)
  3. yield 222
  4. print(333)
  5. yield 444
  6. print(555)
  7. yield 666
  8. gen = func()
  9. for i in gen:
  10. print(i)
  11.  
  12. 结果:
  13. 111
  14. 222
  15. 333
  16. 444
  17. 555
  18. 666

二.列表推导式,生成器表达式以及其他推导式

  首先给出如下代码

  1. lst = []
  2. for i in range(1,15)
  3. lst.append(i)
  4. print(lst)

  替换成列表推导式:

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

  语法:

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

  列表推导式可对结果进行筛选:

  1. lst = [i for i in range(1,15) if i%2 ==0]
  2. print(lst)

  生成器表达式与列表推导式的语法是一致的,只是把[]替换成了()

  1. gen = (i for i in range(1,15))
  2. print(gen)
  3.  
  4. 结果:
  5. <generator object <genexpr> at 0x106768f10>

  打印的结果是一个生成器,我们可以通过for循环来循环这个生成器:

  1. gen = (i for i in range(10))
  2. for i in gen:
  3. print(i)

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

  1. #获取1-100内能被3整除的数
  2. gen = (i for i in range(1,100) if i %3 == 0)
  3.  
  4. for num in gen:
  5. print(num)

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

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

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

  生成器的惰性机制:

  1. def func()
  2. print("")
  3. yield 222
  4.  
  5. g = func() #生成器g
  6. g1 = (i for i in g) #生成器g1,但是生成器的数据来源于g
  7. g2 = (i for i in g1) #生成器g2,来源于g1
  8.  
  9. print(list(g)) #获取g中的数据,这时func()才会被执行,打印,获取到222,g完毕
  10. print(list(g1)) #获取g1中的数据,g1的数据来源于g,但是g已经取完,g1也没有数据
  11. print(list(g2)) #与g1同理

  字典推导式:

  

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

  集合推导式:

    集合推导式可以帮我们直接生成一个集合,集合的特点:无序,不重复,所以集合推导式自带去重功能

  1. lst = [1, -1, 8, -8, 12]
  2. # 绝对值去重
  3. s = {abs(i) for i in lst}
  4. print(s)

  生成器表达式:

  1. def add(a, b):
  2. return a + b
  3.  
  4. def test():
  5. for r_i in range(4):
  6. yield r_i
  7. g = test()
  8.  
  9. for n in [2, 10]:
  10. g = (add(n, i) for i in g)
  11.  
  12. print(list(g))
  13.  
  14. 结果:
    [20,21,22,23]

  生成器的惰性机制

python 生成器函数.推导式.生成器表达式的更多相关文章

  1. Python_Mix*生成器,生成器函数,推导式,生成器表达式

    生成器: 生成器的本质就是迭代器 生成器一般由生成器函数或者生成器表达式来创建,其实就是手写的迭代器 def func(): print('abc') yield 222 #由于函数中有了yield ...

  2. Day12--Python--生成器,生成器函数,推导式,生成器表达式

    一.昨日内容回顾 惰性机制(只有执行__next__()才会取值)二.今日主要内容 1.生成器 生成器:本质是迭代器,写法和迭代器不一样.用法和迭代器一样. ※生成器记录的是代码 2.生成器函数 生成 ...

  3. day13 python生成器函数 推导式 生成器

    day13 python   一.生成器     生成器的本质就是迭代器     生成器的特点和迭代器一样. 取值方式和迭代器一样(__next__())     由生成器函数或生成器表达式来创建   ...

  4. python全栈开发 生成器 :生成器函数,推导式及生成器表达式

    python 全栈开发 1.生成器函数 2.推导式 3.生成器表达式 一.生成器函数 1.生成器: 生成器的本质就是迭代器 (1)生成器的特点和迭代器一样.取值方式和迭代器一样(__next__(), ...

  5. python之生成器(~函数,列表推导式,生成器表达式)

    一.生成器 概念:生成器的是实质就是迭代器 1.生成器的贴点和迭代器一样,取值方式也和迭代器一样. 2.生成器一般由生成器函数或者声称其表达式来创建,生成器其实就是手写的迭代器. 3.在python中 ...

  6. Python生成器、推导式之前襟后裾

    生成器 函数体内有yield选项的就是生成器,生成器的本质是迭代器,由于函数结构和生成器结构类似,可以通过调用来判断是函数还是生成器,如下: def fun(): yield "我是生成器& ...

  7. python基础学习笔记——生成器与推导式

    生成器 首先我们来看看什么是个生成器,生成器本质就是迭代器 在python中有三种方式来获取生成器 1.通过生成器函数 2.通过各种推到式来实现生成器 3.通过数据的转换也可以获取生成器 首先,我们先 ...

  8. Learn day5 迭代器\生成器\高阶函数\推导式\内置函数\模块(math.time)

    1.迭代器 # ### 迭代器 """能被next调用,并不断返回下一个值的对象""" """ 特征:迭代器会 ...

  9. Python【day 12】生成器和推导式

    一.生成器和生成器函数1.生成器和生成器函数的概念 1.生成器的本质是迭代器 2.函数中包含yield,就是生成器函数 2.生成器函数的写法 def func(): a =10 yield 20 ge ...

随机推荐

  1. 【tips】xadmin - django第三方后台管理系统

    Django 为大家提供了一个完善的后台管理系统—admin,但是这个后台管理系统总体来说不太适合国人的习惯,所以有大神就使用 bootstrap 和 jQuery,为我们开发了一个第三 方的 Dja ...

  2. 【15】AngularJS 输入验证

    AngularJS 输入验证 AngularJS 表单和控件可以验证输入的数据. 输入验证 AngularJS 表单和控件可以提供验证功能,并对用户输入的非法数据进行警告.   客户端的验证不能确保用 ...

  3. C#中的定制特性(Attributes)

    C#中的定制特性(Attributes) 介绍 Attributes是一种新的描述信息,我们既可以使用attributes来定义设计期信息(例如:帮助文件.文档的URL),还可能用attributes ...

  4. HDU 1085 多重背包转化为0-1背包问题

    题目大意: 给定一堆1,2,5价值的硬币,给定三个数表示3种价值硬币的数量,任意取,找到一个最小的数无法取到 总价值为M = v[i]*w[i](0<=i<3) 那么在最坏情况下M个数都能 ...

  5. Extended symmetrical multiprocessor architecture

    An architecture for an extended multiprocessor (XMP) computer system is provided. The XMP computer s ...

  6. Linux下汇编语言学习笔记72 ---

    这是17年暑假学习Linux汇编语言的笔记记录,参考书目为清华大学出版社 Jeff Duntemann著 梁晓辉译<汇编语言基于Linux环境>的书,喜欢看原版书的同学可以看<Ass ...

  7. 27、Java并发性和多线程-CAS(比较和替换)

    以下内容转自http://ifeve.com/compare-and-swap/: CAS(Compare and swap)比较和替换是设计并发算法时用到的一种技术.简单来说,比较和替换是使用一个期 ...

  8. Android中apk动态载入技术研究(2)android插件化及实现

    了解了android中类载入的前期知识点后,来看看android中DexClassLoader详细的实现     详细载入流程例如以下:     宿主程序会到文件系统比方SD卡中去载入APK[1],然 ...

  9. javascript 将中文符号转换成英文符号

      javascript 将中文符号转换成英文符号 CreateTime--2018年3月30日09:01:29 Author:Marydon /** * 将中文符号转换成英文符号 */ functi ...

  10. 负载均衡算法,轮询方式 大话设计模式之工厂模式 C#

    负载均衡算法,轮询方式 2018-04-13 17:37 by 天才卧龙, 13 阅读, 0 评论, 收藏, 编辑 学无止境,精益求精 十年河东,十年河西,莫欺少年穷 学历代表你的过去,能力代表你的现 ...