Python每天3分钟 – #020yield和return

欢迎访问Python每天3分钟系列。

每天3分钟时间,学习或温习一个Python知识点。

图片

今天是第020篇:

yield

想用3分钟说清楚什么是yield关键词,有一定挑战。如果往深里说,就带出来迭代器,生成器,协程等等,可能要说3个小时。

我尽量用3分钟说清楚它的本质,来我们一起加油,看看3分钟能不能说清楚。

我直接说结论,然后再解释:

  • yield和return类似,在函数中用来返回值给调用者
  • 使用return的函数是没有状态的,一旦return了,函数就结束了。
  • 使用yield的函数是有状态的,返回一个值后,还可以继续调用,直到所有yield都被用完。

暂时不明白没关系,我们后面继续说。

yield和return

理解一个东西最好的办法就是找一个和它类似的东西,然后再搞清楚它们之间的区别。

yield最类似的东西就是return,因为他们起到了同样的作用:返回值。

看这个return的函数:

# 点外卖
def waimai(name):
  print('cooking ' + name)
  print('............')
  print('此处省略2022行做饭的语句')
  print('............')
  return f'美味的{name}好了'

print(waimai('蛋炒饭'))
print(waimai('胡辣汤'))

这个函数每次都是按照你的参数要求,为你制作饭菜,最后返回给你。

虽然它可能使用了分支语句,有多个return,但一旦遇到了return,函数执行就结束了。

下次再调用它,是一次全新的调用,和上一次调用是没有关系的。

所以我们说它是无状态的。可以理解吧?

yield

假设这样一个场景:我们去酒吧,开了一瓶名贵的啤酒,价值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

注意这个函数的特点:

  • 它没有return关键词,而是用了yield关键词
  • 如果剩下的酒大于200毫升,就用yield关键词返回200毫升
  • 如果剩下的酒小于200毫升,就一次性都返回,这样这个函数的生命周期就结束了

我们来调用一下这个函数,通过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的函数是有状态的函数,会记住上次运行的结果,再上次的基础上继续运行或者停止运行。

总结一下

我们再来总结一下:

  • yield类似于return,在函数中返回值给调用者
  • 使用了yield的函数是有状态的函数,后面的调用会基于前面的调用状态继续执行

原文链接:http://www.zsiss.com/5078.html,转载请注明出处。

0

评论0

请先

爱分享推出ChatGPT国内镜像,无需魔法直接用!写文章,写代码,做PPT,做网站原创软文效果好到爆炸 https://chat.gcrup.com

社交账号快速登录