zoukankan      html  css  js  c++  java
  • 生成器 与 列表推导式

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

      获取方法:

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

  • 相关阅读:
    Zookeeper服务器启动
    BeanFactoryPostProcessor
    ZK简介
    自定义标签解析
    高性能MySQL
    Redis原理
    ApplicationContext
    ThreadPoolExecutor
    NW.js构建PC收银端安装程序的指南
    NW.js安装原生node模块node-printer控制打印机
  • 原文地址:https://www.cnblogs.com/f-g-f/p/9671135.html
Copyright © 2011-2022 走看看