Python-2.16 生成器

在函数内一旦存在yield关键字,调用函数并不会执行函数体代码
会返回一个生成器对象,生成器即自定义的迭代器
触发函数体代码的运行,遇到yield停下来,将yield后的值,当做本次调用的结果返回

def func():
    print('一')
    yield 1
    print('二')
    yield 2
    print('三')
    yield 3
    print('四')


f = func()
print(f)  # <generator object func at 0x00000221EF4D6148>

res1 = f.__next__()
print(res1)

res2 = f.__next__()
print(res2)

res3 = f.__next__()
print(res3)

res4 = f.__next__()

结果:

<generator object func at 0x0000019772DCEC48>
一
1
二
2
三
3
四
Traceback (most recent call last):
  File "D:/test_1/Day18.py", line 174, in <module>
    res4 = f.__next__()
StopIteration
def func_range(start, stop, step=1):
    while start < stop:
        yield start
        start += step


func = func_range(1, 5, 2)
print(next(func))
print(next(func))
print(next(func))

结果:

1
3
Traceback (most recent call last):
  File "D:/test_1/Day18.py", line 185, in <module>
    print(next(func))
StopIteration
for n in range(1, 5, 2):
    print(n)

示例1:

# x=yield 返回值
def dog(name):
    print(f'{name}准备吃东西啦。。。')
    while True:
        # x拿到的是yield接收到的值
        x = yield  # x=''
        print(f'{name}吃了{x}')


g = dog('allen')
g.send(None)  # 相当于next(g)

g.send(['骨头', '猪肉'])
g.send('羊排')
g.send('牛肉')
g.close()
# g.send('qqqq')

结果:

allen准备吃东西啦。。。
allen吃了['骨头', '猪肉']
allen吃了羊排
allen吃了牛肉

示例2:

def dog(name):
    food_list = []
    print(f'{name}准备吃东西啦。。。')
    while True:
        # x拿到的是yield接收的值
        x = yield food_list
        print(f'{name}吃了{x}')
        food_list.append(x)


g = dog('allen')
res = g.send(None)  # next(g)
print(res)

res = g.send('骨头')
print(res)

res = g.send('羊排')
print(res)
g.send('猪肉')

结果:

allen准备吃东西啦。。。
[]
allen吃了骨头
['骨头']
allen吃了羊排
['骨头', '羊排']
allen吃了猪肉

示例3:

def func():
    print('start......')
    x = yield 111
    print('hahahahahaha')
    print('hahahahahaha')
    print('hahahahahaha')
    print('hahahahahaha')
    yield 222


g = func()
res = next(g)
print(res)

res = g.send('hhhhhhhhhhhh')
print(res)

结果:

start......
111
hahahahahaha
hahahahahaha
hahahahahaha
hahahahahaha
222

总结:
yield关键字,就是自定义迭代器的实现方式;
yield可以返回值,不同于return,函数一旦遇到return就结束了;
而yield可以保存函数的运行状态挂起函数,用来返回多次值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值