# 点外卖
def waimai(name):
print('cooking ' + name)
print('............')
print('此处省略2022行做饭的语句')
print('............')
return f'美味的{name}好了'
print(waimai('蛋炒饭'))
print(waimai('胡辣汤'))
这个函数每次都是按照你的参数要求,为你制作饭菜,最后返回给你。
虽然它可能使用了分支语句,有多个return,但一旦遇到了return,函数执行就结束了。
下次再调用它,是一次全新的调用,和上一次调用是没有关系的。
所以我们说它是无状态的。可以理解吧?
假设这样一个场景:我们去酒吧,开了一瓶名贵的啤酒,价值2022元。一次性喝不完,可以保存在酒吧,下次再来喝。
用一个函数来模拟这个开酒的过程:
# 喝点酒
def have_some_wine():
print('先开一瓶酒,共有700毫升')
wine = 700
while wine > 0:
# 取酒
if wine > 200:
get_wine = 200
wine = wine - 200
else:
get_wine = wine
wine = 0
# 把酒送给客人
print('您的酒来了:200毫升')
yield get_wine
注意这个函数的特点:
我们来调用一下这个函数,通过for循环可以多次来喝mywine:
# 开一瓶酒
mywine = have_some_wine()
# 可以多次来喝,直到喝光为止
for i in mywine:
print(f'我今天喝{i}毫升')
运行结果是这样的:
开了一瓶酒,共有700毫升
您的酒来了:200毫升
我今天喝200毫升
您的酒来了:200毫升
我今天喝200毫升
您的酒来了:200毫升
我今天喝200毫升
您的酒来了:200毫升
我今天喝100毫升
[Finished in 33ms]
如果我们再写一个for循环,会发现运行结果是一样的。第二次取酒不会有任何结果,因为酒已经喝光了(对应的是同一个参数)。
# 开一瓶酒
mywine = have_some_wine()
# 可以多次来喝,直到喝光为止
for i in mywine:
print(f'我今天喝{i}毫升')
# 可以多次来喝,直到喝光为止
for i in mywine:
print(f'我今天喝{i}毫升')
这就是我说的使用yield的函数是有状态的函数,会记住上次运行的结果,再上次的基础上继续运行或者停止运行。