Python生成器

一、生成器与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可以有返回值并且还支持多个,以元组的形式返回

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值