- 生成器:生成器与迭代器可以看成一种,生成器的本质就是迭代器。
- 唯一区别,生成器是我们自己用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))
# 卫龙
# 老冰棍
# 北冰洋
# 牛羊配
# 包子
# 馒头
# 花卷
# 大饼