一.生成器

  生成器的本质就是迭代器,它一个一个的创建对象.

  1.   在python中有三种方式获取生成器:
  2.  
  3.     1.通过生成器函数
  4.  
  5.     2.通过各种推导式来实现生成器
  6.  
  7.     3.通过数据的类型转换也可以获取生成器

二.生成器函数

  生成器函数中包含yield,返回数据和return差不多, return会立即结束这个函数的执行, yield 可以分段的执行一个函数

  生成器函数在执行的时候返回生成器,而不是直接执行此函数

  能向下执行的两个条件:  

    1.  __next__(),执行到下一个yield

    2.  send(),执行到下一个yield,给上一个yield位置传值

  注意:

    所有的生成器都是迭代器都可以使用for循环

    都可以使用list()函数来获取到生成器内所有的数据

    生成器中记录的代码而不是函数的运行

  优点: 节省内存, 生成器本身就是代码. 几乎不占用内存

  特点: 惰性机制, 只能向前. 不能反复

  1. def func():
  2. print('')
  3. yield 222
  4.  
  5. gen = func() # 创建生成器.此时运行会把生成器函数中的代码记录在内存当中
  6. ret = gen.__next__() # 当执行到__next__(),运行此空间中的代码,运行到yield结束
  7. print(ret)
  8.  
  9. #结果:
  10. 111
  11. 222

  由于函数中存在了yield,那么这个函数就是一个生成器函数.这个时候,再执行这个函数的时候,就不再是函数的执行了,而是获取这个生成器,直接使用__next__()来执行

  从这里可以看到,yield和return的效果是一样的,区别是yield是分段来执行一个函数,而return是直接停止函数

  1. def func():
  2. print('')
  3. yield 222
  4. print('')
  5. yield 444
  6. gen = func()
  7. ret = gen.__next__()
  8. print(ret)
  9.  
  10. ret2 = gen.__next__()
  11. print(ret2)
  12.  
  13. ret3 = gen.__next__() # 最后一个yield执行完毕.再次__next__()程序报错,也就是说,和return无关了
  14. print(ret3)
  15.  
  16. #结果:
  17. 111
  18. Traceback (most recent call last):
  19. File "D:/pyworkspace/练习.py", line 94, in <module>
  20. 222
  21. ret3 = gen.__next__()
  22. 333
  23. StopIteration
  24. 444

  程序运行完最后一个yield,后面继续进行__next__() 程序会报错

  接下来我们来看send方法, 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.  
  11. gen = eat() # 获取生成器
  12. ret1 = gen.__next__()
  13. print(ret1)
  14. ret2 = gen.send("胡辣汤")
  15. print(ret2)
  16. ret3 = gen.send("狗粮")
  17. print(ret3)
  18. ret4 = gen.send("猫粮")
  19. print(ret4)

 send和__next__()区别:
    1. send和next()都是让生成器向下走一次
    2. send可以给上一个yield的位置传递值, 不能给最后一个yield发送值. 在第一次执行生
 成器代码的时候不能使用send()

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

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

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

列表推导式:

  1.   列表推导式是通过一行来构建你要的列列表, 列表推导式看起来代码简单. 但是出现错误之后很难排查.

    列表推导式的常用写法:

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

  1. #给出一个列表,循环添加1到14
  2. lst = []
  3. for i in range(1, 15):
  4.   lst.append(i)
  5. print(lst)
  6.  
  7. 替换成列表推导式:
  8. lst = [i for i in range(1, 15)]
  9. print(lst)

  2.  我们还可以对列表中的数据进行筛选
    筛选模式:
       [ 结果 for 变量 in 可迭代对象 if 条件 ]

  1. # 获取1-100内所有的偶数
  2. lst = [i for i in range(1, 100) if i % 2 == 0]
  3. print(lst)

生成器表达式:

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

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

  打印的结果就是⼀一个生成器. 我们可以使用for循环来循环这个⽣成器:

  1. gen = ("麻花藤我第%s次爱你" % i for i in range(10))
  2. for i in gen:
  3.   print(i)

四. yield from

  yield from 是在Python3.3才出现的语法。所以这个特性在Python2中是没有的。

  yield from 后面需要加的是可迭代对象,它可以是普通的可迭代对象,也可以是迭代器,甚至是生成器。

  1. def func():
  2. lst = ["衣服%s" % i for i in range(500)]
  3. yield from lst # 可以把一个可迭代对象分别进行yield返回
  4.  
  5. lst1 = ["%s" % i for i in range(18)]
  6. yield from lst1
  7.  
  8. gen = func()
  9. print(gen.__next__())
  10. print(gen.__next__())

python--生成器,生成器推导式, yield from的更多相关文章

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

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

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

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

  3. python的各种推导式

    python的各种推导式(列表推导式.字典推导式.集合推导式) 推导式comprehensions(又称解析式),是Python的一种独有特性.推导式是可以从一个数据序列构建另一个新的数据序列的结构体 ...

  4. 百万年薪python之路 -- 推导式

    2.1列表推导式 首先我们先看一下这样的代码,给出一个列表,通过循环,想列表中添加1~10: li = [] for i in range(1,11): li.append(i) print(li) ...

  5. Python 入门之 推导式

    Python 入门之 推导式 推导式就是构建比较有规律的列表,生成器,字典等一种简便的方式 1.推导式 (1)列表推导式 : <1> 普通循环: [变量 for循环] print([i f ...

  6. python基础——列表推导式

    python基础--列表推导式 1 列表推导式定义 列表推导式能非常简洁的构造一个新列表:只用一条简洁的表达式即可对得到的元素进行转换变形 2 列表推导式语法 基本格式如下: [expr for va ...

  7. Python基础-列表推导式

    python中列表推导式有三种数据类型可用:列表,字典,集合 列表推导式书写形式: [表达式 for 变量 in 列表]    或者  [表达式 for 变量 in 列表 if 条件] 1,列表推导式 ...

  8. python 3列表推导式的的一点理解!

    python 3列表推导式的的一点理解! Python的列表推导式对于新手来说一般都难以理解,简单看个例子: [x * x for x in range(1,100)] 上面是一个很简单的列表推导式, ...

  9. python基础之 迭代器回顾,生成器,推导式

    1.迭代器回顾 可迭代对象:Iterable 可以直接作用于for循环的对象统称为可迭代对象:Iterable.因为可迭代对象里面存在可迭代协议,所以才会被迭代 可迭代对象包括: 列表(list) 元 ...

  10. python note 12 生成器、推导式

    1.生成器函数 # 函数中如果有yield 这个函数就是生成器函数. 生成器函数() 获取的是生成器. 这个时候不执行函数# yield: 相当于return 可以返回数据. 但是yield不会彻底中 ...

随机推荐

  1. Rhythmk 一步一步学 JAVA (22) JAVA 网络编程

    1.获取主机信息 @Test public void GetDomainInfo() throws UnknownHostException { String domain = "www.b ...

  2. javascript客户端遍历控件与获取父容器对象

    javascript客户端遍历控件与获取父容器对象示例代码 1,遍历也面中所有的控件function findControlAll()    {        var inputs=document. ...

  3. leetcode877

    public class Solution { public bool StoneGame(int[] piles) { return true; } } 这问题很不好...

  4. np的归纳总结

    1. np.sqrt(input)    # 求数的开方 import numpy as np print(np.sqrt(2)) 2. np.square(3)   # 求数的平方 import n ...

  5. C#流对象使用完后不立即释放的问题

    public class testwriter : MonoBehaviour { // Use this for initialization void Start () { } [MenuItem ...

  6. 【322】python控制键盘鼠标:pynput

    参考:python实战===python控制键盘鼠标:pynput 参考:[Python Study Notes]pynput实现对鼠标控制 参考:pynput doc 参考:pynput Packa ...

  7. Html生成控件

    HtmlHelper:获取或设置 System.Web.Mvc.HtmlHelper 对象,该对象用于呈现 HTML 元素. 以下是Html的写法与生成的结果的对比 @Html.Label(" ...

  8. python 安装pyqt4

    yum install PyQt4-devel yum install qtwebkit-devel pip install PySide

  9. git的基础操作-入门

    本文是根据廖雪峰的git教程写的笔记:https://www.liaoxuefeng.com/wiki/0013739516305929606dd18361248578c67b8067c8c017b0 ...

  10. python:dist-packages && site-packages

    先简单描述下问题.我用的ubuntu,源码编译安装的python3.我安装一些库,需要通过apt-get方式安装,这个时候就会遇到python找不到这些库的问题. 有个文章可以简单看看:http:// ...