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

  获取方法:

    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 222
g = func() #此处生成一个生成器g
g1 = (i for i in g) # 生成器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

  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 循环 生成器具有惰性机制

day 012 生成器 与 列表推导式的更多相关文章

  1. Python进阶(四)----生成器、列表推导式、生成器推导式、匿名函数和内置函数

    Python进阶(四)----生成器.列表推导式.生成器推导式.匿名函数和内置函数 一丶生成器 本质: ​ 就是迭代器 生成器产生的方式: ​ 1.生成器函数

  2. Python-02 生成器表达式,列表推导式

    列表推导式和生成器表达式 列表推导式,生成器表达式1,列表推导式比较直观,占内存2,生成器表达式不容易看出内容,省内存. [ 变量(加工后的数据) for  变量i  in 可迭代的数据类型 ] 列表 ...

  3. python之生成器和列表推导式

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

  4. 【python】 迭代器、生成器、列表推导式

    一.可迭代对象.迭代器 1.可以被for循环的数据类型(可迭代对象): 字符串(str).列表(list).字典(dict).元祖(tuple).range() 2.迭代器 2.1 将可迭代对象==& ...

  5. Python_迭代器、生成器、列表推导式,生成器表达式

    1.迭代器 (1)可迭代对象 s1 = ' for i in s1: print(i) 可迭代对象 示例结果: D:\Python36\python.exe "E:/Python/课堂视频/ ...

  6. python全栈开发day13-迭代器、生成器、列表推导式等

    昨日内容:函数的有用信息.带参数的装饰器.多个装饰器修饰一个函数 迭代器 可迭代对象:内部含有__iter__方法 迭代器 定义:可迭代对象.__iter__()就是迭代器,含有__iter__且__ ...

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

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

  8. day5--装饰器函数的信息打印,迭代器,生成器,列表推导式,内置函数

    本文档主要内容: 一 装饰器函数的信息打印 二 迭代器 三 生成器 四 生成器表达式和列表推导式 五 内置函数 一 装饰器函数的信息打印 一个函数一旦被装饰器给装饰后,这个函数的信息使用原来的命令打印 ...

  9. python基础学习Day12 生成器、列表推导式、字典的表达式、字典键值对的互换、集合推导式

    一.生成器 1.1 生成器:就是(python)自己用代码写的迭代器,生成器的本质就是迭代器. 1.2 生成器函数 def func1(x): x += print() yield x print() ...

随机推荐

  1. return()函数

    在函数中,执行完return()函数后,下面的语句就不会再执行了.例子: <?php function fn() { echo "you are awsome"; retur ...

  2. go 语言介绍

    特点1. 静态类型,编译开源语言 2. 脚本化的语法,支持多种编程范式(函数式,面向对象) 3. 原生,给力的并发支持并发编程 Go语言的优势: 1.脚本化的语法:开发效率高,容易上手 2.静态类型+ ...

  3. matlab 修改文件夹下所有文件名大写为小写

    1. path = './DIR/';Files = dir(fullfile(path,'*.m'));LengthFiles = length(Files);for count_i = 1 : L ...

  4. 64位系统中fatal error: stdio.h: 没有那个文件或目录的错误的解决方法

    Ubuntu系统中可输入如下命令,安装开发环境: sudo apt-get install build-essential https://blog.csdn.net/yygydjkthh/artic ...

  5. jQuery的事件处理方法

    .on()方法用来处理事件 $("li").on("click",function(){ $(this).addClass("complete&quo ...

  6. CodeForces 478D Red-Green Towers (DP)

    题意:给定 n 块红砖,m 块绿砖,问有多少种方式可以建造成最高的塔,每一层颜色必须一样. 析:首先要确定最高是多少层h,大约应该是用 h * (h+1) <= (m+n) * 2,然后dp[i ...

  7. POJ 3411 Paid Roads (状态压缩+BFS)

    题意:有n座城市和m(1<=n,m<=10)条路.现在要从城市1到城市n.有些路是要收费的,从a城市到b城市,如果之前到过c城市,那么只要付P的钱, 如果没有去过就付R的钱.求的是最少要花 ...

  8. Windows7 安装TensorFlow(本人试了好多方法后的成果)

    本人机器为64位win7 首先安装python,版本一定要注意,TennsorFlow要使用 Python3.0 系列版本不能使用2.0系列版本,但是TensorFlow 的安装包目前windows版 ...

  9. Ubuntu学习小结(一) 基础知识,系统安装,软件安装,解压缩

    这段时间,抽空研究了一下Ubuntu,虽然也有过到目前为止使用计算机最作死的经历,但目前已经学会了一些最基本的操作.在这里简单的记录一下,算是吸取的教训,供其他人借鉴. 1.装Ubuntu系统.装Ub ...

  10. Mysql union

    union简单来说就是多表链接,主要是用于(模糊)查询,全库搜索 多表搜索需要先将需要查询的表用union连接,然后在每一个union后面添加上相同的where条件 菜鸟教程