【问题标题】:How is returning the output of a function different from printing it?返回函数的输出与打印它有何不同?
【发布时间】:2010-10-19 12:08:21
【问题描述】:

在我之前的question 中,Andrew Jaffe 写道:

除了所有其他提示和技巧之外,我认为您还遗漏了一些重要的东西:您的函数实际上需要返回一些东西。 当您创建 autoparts()splittext() 时,想法是这将是一个您可以调用的函数,并且它可以(并且应该)回馈一些东西。 一旦确定了您希望函数具有的输出,您需要将其放入 return 语句中。

def autoparts():
    parts_dict = {}
    list_of_parts = open('list_of_parts.txt', 'r')

    for line in list_of_parts:
        k, v = line.split()
        parts_dict[k] = v

    print(parts_dict)

>>> autoparts()
{'part A': 1, 'part B': 2, ...}

此函数创建一个字典,但它不返回任何内容。但是,由于我添加了print,因此在我运行该函数时会显示该函数的输出。 returning something 和 printing it 有什么区别?

【问题讨论】:

    标签: python return


    【解决方案1】:

    print 只是将结构打印到您的输出设备(通常是控制台)。而已。要从您的函数中返回它,您可以:

    def autoparts():
      parts_dict = {}
      list_of_parts = open('list_of_parts.txt', 'r')
      for line in list_of_parts:
            k, v = line.split()
            parts_dict[k] = v
      return parts_dict
    

    为什么要回来?好吧,如果您不这样做,那么该字典就会死掉(被垃圾收集)并且一旦此函数调用结束就不再可以访问。如果你返回这个值,你可以用它做其他事情。如:

    my_auto_parts = autoparts() 
    print(my_auto_parts['engine']) 
    

    看看发生了什么?调用了autoparts(),它返回了parts_dict,我们将它存储到了my_auto_parts 变量中。现在我们可以使用这个变量来访问字典对象,即使函数调用结束,它也会继续存在。然后我们打印出字典中的对象,键为'engine'

    如需好教程,请查看dive into python。它是免费的,而且非常容易上手。

    【讨论】:

      【解决方案2】:

      打印语句将向用户输出一个对象。返回语句将允许在函数完成后将字典分配给变量

      >>> def foo():
      ...     print "Hello, world!"
      ... 
      >>> a = foo()
      Hello, world!
      >>> a
      >>> def foo():
      ...     return "Hello, world!"
      ... 
      >>> a = foo()
      >>> a
      'Hello, world!'
      

      或者在返回字典的上下文中:

      >>> def foo():
      ...     print {'a' : 1, 'b' : 2}
      ... 
      >>> a = foo()
      {'a': 1, 'b': 2}
      >>> a
      >>> def foo():
      ...     return {'a' : 1, 'b' : 2}
      ... 
      >>> a = foo()
      >>> a
      {'a': 1, 'b': 2}
      

      (执行完一行后什么都不打印的语句表示最后一条语句返回None)

      【讨论】:

        【解决方案3】:

        我认为您很困惑,因为您是从 REPL 运行的,它会在您调用函数时自动打印出返回的值。在这种情况下,无论你有一个创建值、打印它并丢弃它的函数,还是有一个创建值并返回它的函数,让 REPL 打印它,你都会得到相同的输出。

        但是,这些并不是一回事,当您使用另一个函数调用 autoparts 时,您会意识到这些函数想要利用 autoparts 创造的价值做某事。

        【讨论】:

          【解决方案4】:

          你只需添加一个 return 语句...

          def autoparts():
            parts_dict={}
            list_of_parts = open('list_of_parts.txt', 'r')
            for line in list_of_parts:
                  k, v = line.split()
                  parts_dict[k] = v
            return parts_dict
          

          打印输出仅打印到应用程序的标准输出(屏幕)。您还可以通过用逗号分隔来返回多个内容:

          return parts_dict, list_of_parts
          

          使用它:

          test_dict = {}
          test_dict = autoparts()
          

          【讨论】:

            【解决方案5】:

            主要区别:

            调用 print 将立即让您的程序写出文本供您查看。当您想向人类展示价值时,请使用 print。

            return 是一个关键字。 当到达 return 语句时,Python 将停止当前函数的执行,将一个值发送到调用该函数的位置。当您想将值从代码中的一个点发送到另一个点时,请使用 return。

            使用 return 改变程序的流程。使用打印不会。

            【讨论】:

            • 这是一个很好的解释。可以缩短为“打印一些东西给人类看。返回一些东西给代码看”
            【解决方案6】:

            在基本级别上,函数是可以执行的代码块,不是在编写时执行,而是在调用时执行。所以假设我有以下一段代码,这是一个简单的乘法函数:

            def multiply(x,y):
                return x * y
            

            所以如果我用multiply(2,3) 调用函数,它会返回值 6。如果我修改函数,它看起来像这样:

            def multiply(x,y):
                print(x*y)
                return x*y
            

            ...然后输出如您所愿,打印数字 6。但是,这两个语句之间的区别在于 print 仅在控制台上显示某些内容,而 return 则“回馈”任何调用它的内容,这通常是一个变量。然后在它调用的函数中为该变量分配返回语句的值。这是python shell中的一个示例:

            >>> def multiply(x,y):
                    return x*y
            
            >>> multiply(2,3) #no variable assignment
            6
            >>> answer = multiply(2,3) #answer = whatever the function returns
            >>> answer
            6
            

            所以现在函数已经将调用函数的结果返回到调用它的地方,在这种情况下是一个名为'answer'的变量。

            这不仅仅是简单地打印结果,因为您可以再次访问它。下面是一个使用 return 语句的函数示例:

            >>> x = int(input("Enter a number: "))
            Enter a number: 5
            >>> y = int(input("Enter another number: "))
            Enter another number: 6
            >>> answer = multiply(x,y)
            >>> print("Your answer is {}".format(answer)
            Your answer is 30
            

            所以它基本上将调用函数的结果存储在一个变量中。

            【讨论】:

              【解决方案7】:

              不幸的是,有字符限制,所以这将在很多部分出现。首先要注意的是 return 和 print 是语句,而不是函数,但这只是语义。

              我将从一个基本的解释开始。 print 只是向人类用户显示一个字符串,表示计算机内部正在发生的事情。计算机无法使用该打印。 return 是函数返回值的方式。人类用户通常看不到这个值,但计算机可以在其他功能中使用它。

              更广泛地说,打印不会以任何方式影响功能。它只是为了人类用户的利益而存在。它对于理解程序的工作原理非常有用,并且可以在调试中用于检查程序中的各种值而不会中断程序。

              return 是函数返回值的主要方式。所有函数都会返回一个值,如果没有 return 语句(或 yield 但不要担心),它将返回 None。然后,函数返回的值可以进一步用作传递给另一个函数的参数,存储为变量,或者只是为了人类用户的利益而打印。 考虑这两个程序:

              def function_that_prints():
                  print "I printed"
              
              def function_that_returns():
                  return "I returned"
              
              f1 = function_that_prints()
              f2 = function_that_returns()
              

              print "现在让我们看看 f1 和 f2 的值是什么"

              打印 f1 --->无

              print f2---->“我回来了”

              function_that_prints 运行时,它会自动打印到控制台“我已打印”。但是,存储在 f1 中的值是 None,因为该函数没有 return 语句。

              当 function_that_returns 运行时,它没有向控制台打印任何内容。但是,它确实返回了一个值,并且该值存储在 f2 中。当我们在代码末尾打印 f2 时,我们看到“我返回了”

              【讨论】:

              • 对于未来的读者,请注意,此答案中说 print 是语句而不是函数的部分仅适用于 Python 2.x。在 Python 3.x 中,print 是一个函数,不再是语句。
              • 感谢您的补充说明
              【解决方案8】:

              下面的例子可能有助于理解:

              def add_nums1(x,y):
                  print(x+y)
              
              def add_nums2(x,y):
                  return x+y 
              
              #----Function output is usable for further processing
              add_nums2(10,20)/2
              15.0
              
              #----Function output can't be used further (gives TypeError)
              add_nums1(10,20)/2
              
              30
              ---------------------------------------------------------------------------
              TypeError                                 Traceback (most recent call last)
              <ipython-input-124-e11302d7195e> in <module>
              ----> 1 add_nums1(10,20)/2
              
              TypeError: unsupported operand type(s) for /: 'NoneType' and 'int'
              

              【讨论】:

                【解决方案9】:
                def add(x, y):
                    return x+y
                

                这样它就可以成为一个变量。

                sum = add(3, 5)
                
                print(sum)
                

                但如果“add”函数打印输出“sum”,则输出“sum”将是 None,因为在分配它之后就已经发生了操作。

                【讨论】:

                  猜你喜欢
                  • 2022-12-09
                  • 2021-04-28
                  • 1970-01-01
                  • 2023-01-03
                  相关资源
                  最近更新 更多