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))
    # 卫龙
    # 老冰棍
    # 北冰洋
    # 牛羊配
    # 包子
    # 馒头
    # 花卷
    # 大饼
原文地址:https://www.cnblogs.com/gemoumou/p/13635321.html