• 生成器、列表推导式、生成器表达式


    知识要点:
    1、生成器
    定义:就是自己用Python代码写的迭代器,生成器的本质就是迭代器。
    可以用以下两种方法构建一个生成器:
    1、通过生成器函数
    2、生成器表达式
     
    一、生成器函数:
    我们之前学的一般的函数:
    def fun(x):
      x+=1
      return x
    fun(5)  # 函数名+()是函数的执行命令,并且接受函数的返回值。
     
    生成器函数:
    def fun(x):
      x+=1
      print(666)
      yield x
      x+=3
      yield 'alex'
    g=fun(5) #这个执行的结果是生成器的对象
    print(g.__next__())  #每一个netx执行对应的yield上面的所有语句
    print(g.__next__())   #一个next对应一个yield,写多了会报错
    yield的作用:yield将值返回给:生成器对象.__next__()
     
    yeild和return的不同
    1、return结束函数,给函数执行者返回值
    2、yield不会结束函数,一个next对应一个yield,给生成器对象.__next__()返回值。
     
    生成器函数VS迭代器
    区别一:自定制的区别
    def fun(x): #可以制定制取得什么值
        x+=5
        yield x
        x+=3
        yield x
        x+=1
        yield x
    g=fun(3)
    print(g.__next__())
     
    区别二:内存级别的区别
    1、迭代器是需要可迭代对象进行转化。可迭代对象非常占内存。
    2、生成器直接创建,不需要转化,从本质就节省内存。
    def fun():
        for i in range(10000000):
            yield i
    g=fun()
    for j in range(50): #虽然有很多数,但是我只生成50个!
        print(g.__next__())    
    send 与 next
    1、send与next一样,也是对生成器取值(执行一个yield)的方法
    2、send可以给上一个yield传值
    3、第一次取值永远都是next,不能使用send否则报错,因为send是第一个的话它无法找到第一个
    4、最后一个yield永远得不到send的值
    send可以给上一个yield传值:
    def fun():
        count=yield 6
        print(count)
        yield 7
        yield 8
    g=fun()
    next(g)
    g.send('alex')
    next(g)
     
    最后一个yield永远得不到send的值
    def fun():
        count=yield 6
        print(count)
        count1=yield 7
        print(count1)
        yield 8
    g=fun()
    next(g)
    g.send('alex')
    g.send('wusir')
    二、生成器表达式,列表推导式
    列表推导式:一行代码搞定你需要的任何列表
    1、循环模式,变量(加工后的变量)for 变量 in iterable
    l=[i for i in range(100)]
    print(l)
    l2 = ['python{}期'.format(i) for i in range(1,16)]
    print(l2)
    2、筛选模式,变量(加工后的变量)for 变量 in iterable if 条件
    print([i for i in range(1,31) if i % 3 == 0])
    print([i**2 for i in range(1,31) if i % 3 == 0])
    列表推导式:
    优点:一行解决,方便
    缺点,不易排错,不能超过3次循环
    列表推导式不能解决所有的列表的问题,所以不要太刻意使用
     
    生成器表达式:将列表推导式的[] 换成()即可
    g=(i for i in range(100000))
    print(next(g))
    print(next(g))
    print(next(g))
    或者使用for循环取出需要的那一部分的值:
    g=(i for i in range(100000))
    for j in range(20):
        print(next(g))
    大数据使用生成器表达式
    小数据使用列表生成器表达式
     
     
     
     
     
     
     
     
     
  • 相关阅读:
    Java8 Stream
    一个轻量级的基于RateLimiter的分布式限流实现
    常用限流算法与Guava RateLimiter源码解析
    Java学习之socket网络编程篇
    Java学习之文件io流篇
    Java学习之异常篇
    Java学习之多线程篇
    Java学习之集合篇
    Java学习之常用类篇
    Java学习之final与匿名内部类篇
  • 原文地址:https://www.cnblogs.com/banjh/p/9512915.html
Copyright © 2020-2023  润新知