g = (i for i in range(5))
print(g) # 这个长得像元组推导式的叫“生成器表达式”,这里输出:<generator object <genexpr> at 0x009EBDB8>
# 获取推导式里面的数据
# 1.比较麻烦的用next
print(g.__next__()) # 0
print(g.__next__()) # 1
print(g.__next__()) # 2
print(g.__next__()) # 3
# 2.用for循环
# 生成器 → 迭代器 → 可迭代对象 → for循环
for i in g:
print(i)
输出:
0
1
2
3
4
# 3.使用list,tuple,set直接把生成器拿空
print(list(g)) # 输出: [0, 1, 2, 3, 4]
print(set(g)) # 输出:{0, 1, 2, 3, 4}
print(tuple(g)) # 输出:(0, 1, 2, 3, 4)
一个例子
def func(): # 生成器函数
print(111)
yield 222 # 买票的
g = func() # 创建生成器 黄牛1
g1 = (i for i in g) # g1也是生成器 黄牛2
g2 = (i for i in g1) # g2还是生成器 黄牛3
print(list(g2)) # 输出
print(list(g))
print(list(g1))
输出:
111
[222]
[]
[]
yield from 的使用
def func():
l1 = ['name1','name2','namee3']
l2 = ['name4','name5','name6']
for i in l1:
yield i
for i in l2:
yield i
g= func()
print(list(g))
输出:
['name1', 'name2', 'namee3', 'name4', 'name5', 'name6']
# 可以用这样写
def func():
l1 = ['name1','name2','namee3']
l2 = ['name4','name5','name6']
# for i in l1:
# yield i
#
# for i in l2:
# yield i
yield from l1 # 把一个可迭代对象中的每一项分别返回
yield from l2
g= func()
print(list(g))
# 输出:
['name1', 'name2', 'namee3', 'name4', 'name5', 'name6']