美文网首页
第014篇:三大神器之生成器

第014篇:三大神器之生成器

作者: yydafx | 来源:发表于2019-11-19 19:02 被阅读0次

    Python的三大神器:装饰器、迭代器、生成器

    1、生成器

    1.1、什么是生成器
    • 生成器就是迭代器的一种;生成器作为容器保存的不是数据,而是产生数据的算法。
    1.2、怎么创建生成器
    • 调用带有yield关键字的函数,就可以得到一个生成器。
      注意:函数中只要有yield,不管遇不遇到,调用这个函数都不会执行函数体,并且得到的是一个生成器对象
    def func1():
        print('=====')
        print('+++++')
        if False:
            yield
    
    re = func1()
    print(re)   # <generator object func1 at 0x00A94DF0> 得到生成器的对象
    
    1.3、生成器怎么产生数据(怎么确定生成器中的元素)
    • 一个生成器能够产生多少个数据和那些数据,看执行完生成器关联的函数的函数体会遇到几次yield。遇到几次yield生成器就可以产生多少个数据;每次遇到yield,yield后面的数据就是对应的元素
    def func2():
        print('===')
        yield 10
        yield 100
    
    gen1 = func2()
    for x in gen1:
        print('x:',x)
    
    1.4、生成器产生数据的规律

    生成器怎么获取元素:
    获取第一个元素的时候从函数的第一条语句开始执行,执行到第一个yield停下来,并且将yield后面的值作为当前获取到的元素;获取下一个元素的时候,接着上次结束的位置往后执行,直到遇到下一个yield为之。并且将yield的后面的值作为当前的元素,以此类推。
     如果从执行位置开始到函数结束没有遇到yield就会报StopIteration错误。

    def func3():
        print('+++++')
        yield 1
        print('+++++')
        yield 2
        print('======')
    
    gen2 = func3()
    print(next(gen2))
    print(gen2.__next__())
    # print(gen2.__next__())  # StopIteration
    
    
    def func4(n):
        for _ in range(n):
            yield 100
    
    gen3 = func4(4)
    print(next(gen3))
    for x in gen3:
        print('x:', x)
    

    写一个生成器,能够产生一个班所有学生的学号,班级人数自己定,前缀自己定

    • eg:121 --> 002 032 --> 01 23
    def cls_gen(stu_num, char):
        length = len(str(stu_num))
        for i in range(1, stu_num+1):
            yield char + str(i).zfill(length)
    
    
    cls_stu = cls_gen(23, 'st')
    for stu in cls_stu:
        print(stu)
    

    2、生成式

    2.1、什么是生成式
    • 生成式就是生成器;写法简洁,只有一行代码。

    1)语法一:

        生成器 = (表达式 for 变量 in 序列)
    
        展开如下:
            def 函数名:
             for 变量 in 序列:
    
    gen2 = (i for i in range(1, 11))
    print(next(gen2))
    
    def great_num():
        for num in range(1, 11):
            yield num
    
    gen1 = great_num()
    
    gen3 = ('str%d' % i for i in range(5))
    print(next(gen3))
    

    2)语法二:

        生成器 = (表达式 for 变量 in 序列 if 条件语句)
        
        展开如下:
            def 函数名():
                for 变量 in 序列:
                    if 条件语句:
                        yield 表达式
    
    gen3 = ('str%d' % i for i in range(1, 5) if i & 1)
    for i in gen3:
        print(i, end=', ')  # str1, str3,
    
    print()
    

    3)语法三:

        生成器 = (表达式 for 变量1 in 序列1 for 变量2 in 序列2)
        
        展开如下:
            for 变量1 in 序列1:
                for 变量2 in 序列2:
                    yield 表达式
    
    gen4 = (x for x in range(0, 10) if x % 2)
    for x in gen4:
        print(x, end=', ')  # 1, 3, 5, 7, 9,
    

    4)列表生成式

    • 将上面语法中的所有的小括号变成中括号,结果就会由原来的生成器变成列表
    1)语法一:
        生成器 = [表达式 for 变量 in 序列)]
    
        展开如下:
            def 函数名:
             for 变量 in 序列:
                yield 表达式
    

    相关文章

      网友评论

          本文标题:第014篇:三大神器之生成器

          本文链接:https://www.haomeiwen.com/subject/riegictx.html