zoukankan      html  css  js  c++  java
  • 14生成器

    • 生成器:生成器与迭代器可以看成一种,生成器的本质就是迭代器。
    • 唯一区别,生成器是我们自己用python代码构建的数据结构,迭代器是系统提供的或者转化得来的。
    • 获取生成器的三种方式:
      • 生成器函数
      • 生成器表达式
      • python内部提供的一些

    生成器函数获得生成器

    def func(): # 普通函数
        print(111)
        print(222)
        return 3
    ret = func()
    print(ret)
    # 111
    # 222
    # 3
    
    def func(): #生成器函数
        print(111)
        print(222)
        yield 3
        a = 1
        b = 2
        c = a + b
        print(c)
        yield 4
    ret = func()
    
    print(ret)  # <generator object func at 0x0000020147426ED0>
    print(next(ret))
    # 111
    # 222
    # 3
    print(next(ret))  # 一个next对应一个yield
    # 3
    # 4
    
    • return和yield的区别:
      • return:函数中只存在一个return结束函数,并且给函数的执行者返回值
      • yield:只要函数中有yield那么他就是生成器函数而不是函数
    • 生成器函数中可以存在多个yield,yield不会结束生成器函数,一个yield对应一个next
    def func():
        lst = []
        for i in range(10000):
            lst.append("数据%s"% i)
            if i % 10 == 0:
                yield lst
                lst = []
    #
    g = func()
    print(next(g))
    #['数据0']
    print(next(g))
    # #['数据1', '数据2', '数据3', '数据4', '数据5', '数据6', '数据7', '数据8', '数据9', '数据10']
    print(next(g))
    # #['数据11', '数据12', '数据13', '数据14', '数据15', '数据16', '数据17', '数据18', '数据19', '数据20']
    
    def gen():
        for i in range (10):
            yield i
    
    g = gen() # 生成器
    a = g.__next__()
    print (a)
    a = g.__next__()
    print (a)
    a = g.__next__()
    print (a)
    # 0
    # 1
    # 2
    for i in gen():
        print (i)
     # 0 1 2 3 4 5 6 7 8 9
    #
    lst = list(g)
    print (lst)
    # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    
    def func():
        for i in range(1,5001):
            yield f'{i}号数据'
    ret = func()
    for i in range(200):
        print(next(ret))
    # 1号数据
    # 2号数据
    # 3号数据
    #  ......
    # 200号数据
    
    def func():
        l1 = [1,2,3,4,5]
        yield l1
    
    ret = func()
    print(next(ret)) #[1, 2, 3, 4, 5]
    
    def func():
        l1 = [1,2,3,4,5]
        yield from l1   # 将l1 这个列表变成了迭代器返回
    
    ret = func()
    print(next(ret)) # 1
    print(next(ret)) # 2 
    
    def func():
        lst1 = ["卫龙","老冰棍","北冰洋","牛羊配"]
        lst2 = ["包子","馒头","花卷","大饼"]
        yield from lst1
        yield from lst2
    
    g = func()
    for i in range(8):
        print(next(g))
        # 卫龙
        # 老冰棍
        # 北冰洋
        # 牛羊配
        # 包子
        # 馒头
        # 花卷
        # 大饼
    
  • 相关阅读:
    练习44-继承和组合
    CF 1329B Dreamoon Likes Sequences
    CF 1362C Johnny and Another Rating Drop
    CF 1391D 505
    CF 1383B GameGame
    CF1360F Spy-string(暴力)
    Java 之 关键字与标识符
    Java 之 Java 注释与 API
    Java 之 第一个Java程序
    Java 之 Java开发环境
  • 原文地址:https://www.cnblogs.com/gemoumou/p/13635321.html
Copyright © 2011-2022 走看看