python-yield关键字:还得是案例,理解起来更清晰。

# yield生成器函数执行时会一个一个逐步返回一个值,可以暂停和恢复执行,从而节省内存。
# 它可以实现类似于迭代器的效果,可以用for循环来遍历生成器函数的返回值。

# 案例1
print("案例1:")
def yield_demo(n):
    print("starting...")
    # 每次调用会运行到下一个yield并返回值
    # 然后暂停执行,直到下次调用
    for i in range(n):
        yield i, "我正在被执行yield i"
        # 由于yield的返回值是语句:" i, "我正在被执行yield i" "的执行结果,并且" i, "我正在被执行yield i" "的执行结果仍然是:" i, "我正在被执行yield i" ",
        # 所以yield的返回值是:" i, "我正在被执行yield i" ",所以for循环会打印:" i, "我正在被执行yield i" "
        print('我正在执行yield,i,print', i)


# 调用生成器函数
for x in yield_demo(5):
    print('for x in yield_demo(5):中,print x', x)


# 案例2:
print("案例2:")
def foo(num):
    print("starting...")
    while num < 10:
        num = num + 1
        print("我是while循环,当中的num:" + str(num))
        yield print("我是yield,当中的num:" + str(num))
        # 这里的yield会暂停执行,并返回值,请十分注意,yiel返回的是print函数的结果,而不是yield后面的表达式,而这里的print函数是直接输出并没有返回值,
        # 所以留给yield的返回值的是None
        # 请注意这里的yield暂停执行是指:yield所属的表达式执行完后,暂停执行,
        # 由于yield的返回值是print语句的执行结果的值,在print语句执行完后,print语句被没有留下什么可以需要返回的,这导致yield的返回值永远是None,
        # 所以for循环中,每次调用yield都会返回None,所以for循环不会打印任何值
        # yield是一个类似return的关键字,都会执行完所属表达式后返回,区别是yield只是中断,而return会立即返回,并终止函数的执行。
        yield num
        print("yielding...")
    print("ending...")


#
for n in foo(0):
    print("我是for循环,当中的num:" + str(n))

执行结果:

案例1:
starting...
for x in yield_demo(5):中,print x (0, '我正在被执行yield i')
我正在执行yield,i,print 0
for x in yield_demo(5):中,print x (1, '我正在被执行yield i')
我正在执行yield,i,print 1
for x in yield_demo(5):中,print x (2, '我正在被执行yield i')
我正在执行yield,i,print 2
for x in yield_demo(5):中,print x (3, '我正在被执行yield i')
我正在执行yield,i,print 3
for x in yield_demo(5):中,print x (4, '我正在被执行yield i')
我正在执行yield,i,print 4
案例2:
starting...
我是while循环,当中的num:1
我是yield,当中的num:1
我是for循环,当中的num:None
我是for循环,当中的num:1
yielding...
我是while循环,当中的num:2
我是yield,当中的num:2
我是for循环,当中的num:None
我是for循环,当中的num:2
yielding...
我是while循环,当中的num:3
我是yield,当中的num:3
我是for循环,当中的num:None
我是for循环,当中的num:3
yielding...
我是while循环,当中的num:4
我是yield,当中的num:4
我是for循环,当中的num:None
我是for循环,当中的num:4
yielding...
我是while循环,当中的num:5
我是yield,当中的num:5
我是for循环,当中的num:None
我是for循环,当中的num:5
yielding...
我是while循环,当中的num:6
我是yield,当中的num:6
我是for循环,当中的num:None
我是for循环,当中的num:6
yielding...
我是while循环,当中的num:7
我是yield,当中的num:7
我是for循环,当中的num:None
我是for循环,当中的num:7
yielding...
我是while循环,当中的num:8
我是yield,当中的num:8
我是for循环,当中的num:None
我是for循环,当中的num:8
yielding...
我是while循环,当中的num:9
我是yield,当中的num:9
我是for循环,当中的num:None
我是for循环,当中的num:9
yielding...
我是while循环,当中的num:10
我是yield,当中的num:10
我是for循环,当中的num:None
我是for循环,当中的num:10
yielding...
ending...

进程已结束,退出代码为 0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值