• 生成器和Python的三个推导式


    一、生成器

    我们知道的迭代器有两种:一种是调用方法直接返回的,一种是可迭代对象通过执行iter方法得到的,迭代器有的好处就是节省内存

    如果某些情况下,我们需要节省内存,就只能自己写。我们自己写的这个能实现迭代器功能的东西就叫生成器。总而言之生成器就是我们自己写的迭代器。

    Python中提供的生成器:

      1.生成器函数:常见函数定义,但是使用yield语句而不是return语句返回结果。yield语句一次返回一个结果,在每个结果中间,挂起函数状态,以便下次从离开的地方继续执行。个人理解就是有一个记忆功能,会记住这次执行结束的状态,然后下次执行的时候从这里继续,每次都是以此往复。

      2.生成器表达式:类似于列表推导,但是生成器返回按需产生结果的一个对象,而不是一次构建一个结果列表。

      生成器Generator

        本质:迭代器(所以自带了__iter__和__next__方法)

        特点:惰性运算、开发者自定义

     二、生成器函数

    一个包含yield关键字的函数就是一个生成器函数。yield可以为我们从函数中返回值,但是yield又不同于return,return的执行意味着程序的结束,调用生成器函数不会返回具体的值,而是得到一个可迭代对象。每一次获得这个可迭代对象的值,就能推动函数的执行,获取新的返回值。直到函数结束。

    import time
    def genrator_fun1():
        a = 1
        print('现在定义了a变量')
        yield a
        b = 2
        print('现在又定义了b变量')
        yield b
    
    g1 = genrator_fun1()
    print('g1 : ',g1)       #打印g1可以发现g1就是一个生成器
    print('-'*20)   #我是华丽的分割线
    print(next(g1))
    time.sleep(1)   #sleep一秒看清执行过程
    print(next(g1))

    生成器有什么作用么?
    省内存

      三、send

    def generator():
        print(123)
        content = yield 1
        print('=======',content)
        print(456)
        yield2
    
    g = generator()
    ret = g.__next__()
    print('***',ret)
    ret = g.send('hello')   #send的效果和next一样
    print('***',ret)
    
    #send 获取下一个值的效果和next基本一致
    #只是在获取下一个值的时候,给上一yield的位置传递一个数据
    #使用send的注意事项
        # 第一次使用生成器的时候 是用next获取下一个值
        # 最后一个yield不能接受外部的值

    四、Python的三大推导式

      1.列表推导式和生成器表达式

    l = [i for i in range(10)]
    print(l)
    l1 = ['选项%s'%i for i in range(10)]
    print(l1)

        1.把列表推导式的[]换成()就得到了生成器表达式(generator)

        2.列表推导式与生成器表达式都是一种便利的编程方式,只不过生成器表达式更节省内存

        3.Python不但使用迭代器协议,让for循环变得更加通用。大部分内置函数,也是使用迭代器协议访问对象的。例如,sum函数是Python的内置函数,该函数使用迭代器协议访问对象,而生成器实现了迭代器协议,所以我们可以直接这样计算一系列值的和:

    sum(x ** 2 for x in range(4))

       2.字典推导式

        字典推导和列表推导的使用方法十分类似,只不过把[]改成了{}。上代码:

    dic_old = {'a':10, 'b':20}
    
    dic_new = {value:key for key,value in dic_old.items()} # 变key和value的位置
    print(dic_new)
    
    
    #执行结果
    #{10: 'a', 20: 'b'}

       3.集合推导式

        集合推导式有十分类似,唯一的区别就是集合使用{},上代码:

    set_test= {x**2 for x in [1, 1, 2, 2, 3, 4]}
    print(set_test)
    
    
    # 执行结果
    # {16, 1, 4, 9}
    
    
    #好像有问题哦,怎么6个元素求幂之后丢了两个,往下看↓

    #请不要忘记集合是无序的并且会自动去重哦
  • 相关阅读:
    《ORANGE'S一个操作系统的实现》第7章 TTY与键盘输入的关系。
    《将博客搬至CSDN》
    x86汇编分页模式实验 --《ORANGE'S一个操作系统的实现》中 pmtest8.asm解析
    LR(1)语法分析器生成器(生成Action表和Goto表)java实现(二)
    LR(1)语法分析器生成器(生成Action表和Goto表)java实现(一)
    LeetCode 85. 冗余连接 II
    2397
    机器学习入门(九)之----logistic回归(牛顿法)
    机器学习入门(八)之----logistic回归(番外篇感知机算法)
    机器学习入门(七)之----logistic回归(回归函数与概率模型)
  • 原文地址:https://www.cnblogs.com/gzying-01/p/10214354.html
Copyright © 2020-2023  润新知