【问题标题】:What does 'Return' do exactly, and where and when should I use it?'Return' 究竟做了什么,我应该在何时何地使用它?
【发布时间】:2019-01-22 05:27:23
【问题描述】:

我把'return'放在哪里有什么区别?它给了我一个不同的答案,我真的很困惑。

正确:

def grades_sum(scores):
  total=0
  for i in scores:
    total+=i
  return total
  print (total)

grades_sum(grades)

一个错误的答案:

def grades_sum(scores):
  total=0
  for i in scores:
    total+=i
    return total
  print (total)

grades_sum(grades)

另外,为什么在这个方差函数中包含一个返回给我错误的答案:

def grades_variance(scores):
  average=grades_average(scores)
  variance=0
  for score in scores:
    variance+=(average-score)**2
  return variance/len(scores)
print (grades_variance(grades))

这是正确的:

def grades_variance(scores):
  average=grades_average(scores)
  variance=0
  for score in scores:
    variance+=(average-score)**2
print (grades_variance(grades))

【问题讨论】:

  • 嗯,您发布的最后一个代码 sn-p 打印出 None。你确定这是正确的吗?
  • @meissner_Make Python 3。

标签: python for-loop return


【解决方案1】:

我把“退货”放在哪里有什么区别?它给了我一个不同的答案,我真的很困惑。

当你调用return时,你结束了函数并将执行流程返回给调用函数。你放在return 旁边的值可以被认为是函数的输出


这是一个示例函数,调用时返回 10(输出为 10):

def my_function():
    return 10

如果我像这样在控制台中调用函数:

my_function()

我将得到 10 的输出(返回值)

如果我像这样在函数中添加print 值:

def my_function():
    print ('This should work')
    return 10

然后该函数现在将在调用时打印。

但是,如果我将 print 语句放在 return 语句之后,如下所示:

def my_function():
    return 10
    print ('This should work')

然后该函数将像以前一样在控制台中输出 10 并且不会打印任何内容。这是因为函数在到达print 之前就结束了,所以它永远不会执行。


现在举个例子:

def grades_sum(scores):
    total=0
    for i in scores:
        total+=i
    return total
    print (total)

grades_sum(grades)

对于本例,您在函数中将print 放在return 之后。由于此时函数的执行已终止,因此不会调用print。如果您运行该函数,它将为您提供作为输出返回的值(正确答案,因为您允许该函数在您退出之前通过 for 循环的每个循环运行)。因此,如果您在控制台中运行它,您仍然会看到正确的答案。虽然这不是您致电print 的结果。

def grades_sum(scores):
  total=0
  for i in scores:
    total+=i
    return total
  print (total)

grades_sum(grades)

在本例中,return 被放置在 for 循环中。每个循环都重复调用 for 循环内的所有内容。但是,在这种情况下,在循环的第一个循环中,您调用 return,正如我所提到的,它结束了函数。在这种情况下,它将返回第一个分数的值(因为在返回之前只完成了一个循环循环)。同样,print 没有被调用,因为它在函数内部,而是放置在函数的退出点之后(return 之后)。

您的最后两个示例没有意义,因为最后一个代码 sn-p 不会打印任何内容(因为该函数没有返回值)。所以我实际上不确定你想从这个函数中得到什么。也许编辑问题,提供输入数据和所需输出数据的样本。

【讨论】:

    【解决方案2】:

    print() 函数在控制台中写入,即“打印”一个字符串。

    return 语句使您的函数退出并将一个值返回给它的调用者。

    一般来说,函数的意义在于接受输入并返回一些东西。

    return 语句在函数准备好向其调用者返回值时使用。

    例如,这是一个同时使用print()return 的函数:

    def foo():
        print("print foo")
        return "return from foo"
    

    现在您可以运行调用 foo 的代码,如下所示:

    if __name__ == '__main__':
        print("before foo")
        x = foo()
        print("after foo")
        print("foo returned - " + str(x))
    

    如果您将其作为脚本(例如 .py 文件)而不是在 Python 解释器中运行,您将获得以下输出:

    before foo
    print foo
    after foo   
    foo returned - return from foo
    

    在您的第一个代码 sn-p 中:

    def grades_sum(scores):
      total=0
      for i in scores:
        total+=i               #for loop definition
      return total             #return is after for loop completes. 
      print (total)
    
    grades_sum(grades)
    

    returnfor 循环完成之后。 for 循环在遇到 return 语句之前成功计算了一些,并且代码流返回到函数调用者 - 因此,它给出了正确的输出。

    在您的第二个 sn-p 中 - returnfor 循环内。这意味着代码流在第一次迭代本身之后返回(& 尚未完全计算总和) - 因此,这会给出不正确的输出。

    您的 3rd & 4th sn-p 示例不正确,因为 3rd sn-p 返回某些内容,而 4th 根本不返回任何内容 - 因此它不正确。

    【讨论】:

      【解决方案3】:

      return 做了什么?”

      return 语句将值返回给函数的调用者。这是一个简单的例子:

      def give_me_a_number():
          return 7
      

      现在,give_me_a_number 将始终返回 7,所以我们可以这样做:

      x = give_me_a_number()
      

      变量x 现在具有值7,因为这是give_me_a_number 返回的值。


      “我把return放在哪里有什么区别?”

      return 语句的放置位置很重要,因为语句是按顺序执行的,当遇到 return 时,函数结束。例如:

      def my_function():
          a = 1
          a = 2
          return a
          a = 3
      

      函数my_function 将返回值2,因为这是遇到returna 的值。请注意,a = 3 永远不会被执行。


      问题中的代码(for 循环内的return

      在您的情况下,如果return 语句被缩进,那么它在for 块内,并且将在第一次执行for 循环时执行,因此这意味着并非所有scores 都会被循环。

      def grades_sum(scores):
        total=0
        for i in scores:
          total+=i
          return total
        print (total)
      

      如果它没有缩进,那么它在for 循环之外并且将在所有scoresfor 循环循环之后执行。

      【讨论】:

        【解决方案4】:

        first sn-p 没有意义。因为您在打印前退货。没有打印任何内容。

        second 没有意义,因为您在第一次循环迭代中返回。结果可能不正确。

        我怀疑 第四个 打印的不是 None

        只有第三个 sn-p 返回任何可以打印的内容。

        【讨论】:

          猜你喜欢
          • 2022-01-19
          • 2013-08-06
          • 1970-01-01
          • 2011-12-28
          • 2013-07-28
          • 2013-09-15
          • 2016-08-10
          • 2016-07-18
          • 2016-05-27
          相关资源
          最近更新 更多