# 生成器的本质就是迭代器
"""
构建生成器的方式:
1生成器函数
2生成器表达式
3Python提供的一些内置函数,返回一个生成器
"""
def func():
print('hello world')
yield 'good'
ret = func() # 生成器对象,函数不执行
print(ret) # <generator object func at 0x0000027A22F72890>
# 只要函数中出现了yield那么它就不是普通函数了,它是生成器函数。
# 生成器本质是迭代器,所以通过next方法对其进行取值
print(next(ret)) # hello world good
# 一个yield对应一个next
def func1():
yield 'what'
yield 'who'
res = func1()
print(next(res)) # what
print(next(res)) # who
"""
return and yield
return: 结束函数,给函数的执行者返回值
yield: 不结束函数,对应着给next返回值
"""
# yield from:将一个可迭代对象的每一个元素返回给next;节省代码,提升效率(代替了for循环)
def func2():
l = [9, 8, 7]
yield from l
res2 = func2()
print(next(res2)) # 9
print(next(res2)) # 8
print(next(res2)) # 7
def func3(*args):
for i in args:
for j in i:
yield j
res3 = func3('hello', [1,2,3,6,7])
print(list(res3)) # ['h', 'e', 'l', 'l', 'o', 1, 2, 3, 6, 7]
def func4(*args):
for i in args:
# 代替了一个for循环
yield from i
res4 = func4('hello', [1,2,3,6,7])
print(list(res4)) # ['h', 'e', 'l', 'l', 'o', 1, 2, 3, 6, 7]
# 生成器表达式
obj = (i for i in range(10))
print(obj) # <generator object <genexpr> at 0x000002ECD2AC9C10>
print(next(obj)) # 0
print(next(obj)) # 1
"""
如何触发一个生成器(迭代器)取值:
1、next方法
2、for循环
3、将其转化为列表
"""
# 面试题
def add(n, i):
return n+i
def func5():
for i in range(4):
yield i
g = func5()
for n in [1, 10]:
g = (add(n, i) for i in g)
print(list(g))
Python 生成器
于 2022-02-17 11:25:39 首次发布