一、生成器与yield
-
生成器是一种特殊的迭代器,使用yield语句来生成数据。生成器可以一次生成一个元素,而不是在一次性生成所有元素。
-
创建Python生成器的方法是使用yield关键字来代替return关键字。在函数中使用yield语句生成每个元素,当函数被调用时,它会返回一个生成器对象,可以逐个迭代生成器中的元素。
例如 :
def index():
print('123')
print('123')
print('123')
yield 456
print('789')
print('789')
print('789')
yield # 函数体代码中如果有yield关键字那么函数名加括号并不会执行函数体代码会生成一个生成器对象(迭代器对象)
res = index() # 使用加括号之后的结果调用__next__才会执行代码函数体
print(res.__next__())
print(res.__next__()) # 每执行完__next__代码都会停在yield位置,下次基于该位置继续往下寻找第二个yield
生成器练习题
编写实现range方法功能
def index(start, stop=None, step=1):
if not stop:
stop = start
start = 0
while start < stop:
yield start
start += step
for i in index(5,100,5):
print(i)
yield其他用法
def eat(name):
print('%s正在吃羊' % name)
while True:
food = yield
print('%s正在吃%s' % (name, food))
res = eat('MCQ')
res.__next__()
res.send('羊枪')
res.send('羊蛋')
res.send('羊炮')
二、生成器表达式
说白了就是生成器的简化写法
# l1 = [i ** 2 for i in range(100)]
# print(l1)
l1 = (i ** 2 for i in range(100)) # 生成器对象
print(l1) # <generator object <genexpr> at 0x000001DFC07F7E40>
for i in l1:
print(i)
"""
面试题(有难度)
大致知道流程即可
"""
def add(n, i): # 普通函数 返回两个数的和 求和函数
return n + i
def test(): # 生成器
for i in range(4):
yield i
g = test() # 激活生成器
for n in [1, 10]:
g = (add(n, i) for i in g)
"""
第一次for循环
g = (add(n, i) for i in g)
第二次for循环
g = (add(10, i) for i in (add(10, i) for i in g))
"""
res = list(g)
print(res)
#A. res=[10,11,12,13]
#B. res=[11,12,13,14]
C. res=[20,21,22,23]
#D. res=[21,22,23,24]
yield和return的对比
yield
1. 代码遇到yield不会停止,而是停住
2. yield也可以有返回值,并且还支持多个,以元组的形式返回
3. yield可以把一个函数变成生成器,next取值
return
1. 代码遇到return就会停止
2. return可以有返回值并且还支持多个,以元组的形式返回