生成器的本质就是迭代器,写法和迭代器不一样,用法一样。

  获取方法:

    1、通过生成器函数

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

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

      例如:

         

          更改return 为 yield 即成为生成器 该函数就成为了一个生成器函数。再执行这个函数的时候,就不再是函数的执行了,而是获得这个生成器。执行生成器可以直接用__next__()来执行。

    return和yield的区别:

      yield是分段开执行一个函数,而return直接停止执行函数。

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

生成器的作用:

  例如:

    def cloth():

      lst = []

      for i in range(0,10000):

        lst.append('衣服'+strt(i))

      return lst

    cl = cloth()

  再看另一种方式:

    def cloth():

      for i in range(0,10000):

        yield'衣服'+str(i)

    cl = cloth()

    print(cl.__next__())

    print(cl.__next__())

    print(cl.__next__())

    print(cl.__next__())

两个案例的区别:第一种直接一次性全部拿出来,会很占用内存。第二种使用生成器,一次就一个。用多少生成多少,生成器是一个一个的指向下一个。不会回去,__next__()到哪,指针就指到哪。下一次继续获取指针指向的值。

生成器函数:函数中带有yield,执行生成器函数的时候返回生成器

生成器特点:

  1、节省内存,几乎不占用内存。应用于数据量比较大、而单次使用不会用太多数据量的场合

  2、惰性机制

  3、只能往前

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

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

  1、列表推导式;

    

    替换成列表推导式:

      

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

推导式的常用写法:

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

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

打印的结果就是一个生成器。可以使用for循环来循环这个生成器:

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

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

  b、得到的值不一样。列表推导式得到的是一个列表。生成器表达式获得的是一个生成器。

生成器的惰性机制:生成器只有在访问的时候才取值,即找他要才给值,不找他要,是不会执行的。

深坑==>生成器,要值的时候才拿值。

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

  2、字典推导式:

    例如:

在以下列表中,从lst1中获取的数据和lst2中相对应的位置的数据组成一个新字典。

lst1 = ['jay','jj','sylar']

lst2 = ['周杰伦','林俊杰','邱彦涛']

dic = {lst[i]:lst2[i] for i in range(len(lst1))}

print (dic)

  集合推导式:

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

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

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

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

转载于:https://www.cnblogs.com/f-g-f/p/9671135.html

day 012 生成器 与 列表推导式相关推荐

  1. python基础之生成器,生成器函数,列表推导式

    内容梗概: 1. 生成器和生成器函数. 2. 列表推导式. 1.生成器函数1.1 生成器函数. 就是把return换成yield def gen():print("爽歪歪")yie ...

  2. python中哪个函数能生成集合_神奇的python系列11:函数之生成器,列表推导式

    1.生成器 生成器的本质是迭代器. 在python中有三种方式来获取生成器 1.通过生成器函数 2.通过各种推到式来实现生成器 3.通过数据的转换也可以获取生成器 #函数 deffunc():prin ...

  3. python列表推导式实现从1加到100_python之生成器和列表推导式

    一.生成器函数 1.生成器:就是自己用python代码写的迭代器,生成器的本质就是迭代器(所以自带了__iter__方法和__next__方法,不需要我们去实现). 2.用以下两种方式构建一个生成器: ...

  4. python (八)迭代器、生成器、列表推导式

    一.迭代器 1.先来讲讲什么是可迭代对象 字符串.列表.元组.字典.集合都可以被for循环,说明他们都是可迭代的. 2.怎么判断是不是一个可迭代对象 判定方法:内部含有'__iter__'方法的数据就 ...

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

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

  6. Python:列表推导式、生成器、迭代器

    1. 列表推导式 列表推导式是通过旧的列表通过公式推导出新的列表 还有集合推导式.字典推导式,与列表推导式类似 格式为: [表达式 for 变量 in 旧列表] [表达式 for 变量 in 旧列表 ...

  7. 函数生成器、生成器表达式,列表推导式

    目录 一.生成器 ⼆.列表推导式,⽣成器表达式以及其他推导式 三.字典推导式 四.集合推导式 一.生成器 ⼀.⽣成器什么是⽣成器.⽣成器实质就是迭代器. def fun():print('111')r ...

  8. 第9条:用生成器表达式来改写数据量较大的列表推导式

    核心知识点: (1)当输入的数据量较大时,列表推导可能会因为占用太多内存而出问题. (2)由生成器表达式所返回的迭代器,可以逐次产生输出值,从而避免内存用量问题. (3)把某个生成器表达式所返回的迭代 ...

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

    一.三元表达式 语法:[成立1 if condition1 else成立2 if condition2 else ...if 成立N conditionN else 不成立] sex = 'man' ...

最新文章

  1. 求你了,不要再在对外接口中使用枚举类型了!
  2. 用MacBook对交换机进行初始化配置
  3. MySQL - 分页查询优化的两个案例解析
  4. 红外测距模块工作原理_共享单车里的通讯模块,工作原理是啥呢?
  5. 变身抓重点小能手:机器学习中的文本摘要入门指南 | 资源
  6. 【动态规划】LeetCode 62. Unique Paths
  7. linux更换输入法_一日一Linux之一:CentOS 8.1 王者荣耀
  8. MySQL基础知识思维导图大纲
  9. 后缀表达式(简单示例)
  10. NEO(小蚁)Seraph ID调研
  11. pdf加页码java_Java 添加页码到PDF文档
  12. 移动端以及 PC浏览器页面分享到朋友圈等的功能实现
  13. 学而思总裁曹允东谈创业:融资意识很重要
  14. are exo exo是什么歌 we_We Are One EXO!
  15. UEFI是什么意思?UEFI和BIOS的区别是什么?
  16. 小米MAX开发者选项 以及如何连接MAC开发RN
  17. 一劳永逸解决PPT中声音视频的路径难题
  18. X86汇编语言学习手记(1)
  19. 分享:Android 实验
  20. Tailwind Border

热门文章

  1. Android NDK各版本下载
  2. python中max函数用法_Python中max函数用法实例分析
  3. html5怎样实现信息抓取,HTML5获取定位简单方案
  4. sqoop mysql 乱码_请问一下,用sqoop导数据到mysql如果遇到字段编码是utf8mb4的情况怎么处理?...
  5. unity3d 大地图接壤_架空世界地图制作指南(六)气候带
  6. 求最高、最低、平均分
  7. java将图片变成圆角_android图片处理之让图片变成圆形
  8. 嵌入式基础之----C++
  9. 玩转GIT系列之【git submodule update出错提示子模组未对路径注册】
  10. MATLAB 中搭建MatConvNet运行环境(调用GPU运行)以及遇到的错误