【问题标题】:How is returning the output of a function different from printing it? [duplicate]返回函数的输出与打印它有何不同? [复制]
【发布时间】:2022-12-09 09:15:00
【问题描述】:

在我之前的question,Andrew Jaffe writes

除了所有其他提示和技巧之外,我认为您还遗漏了一些重要的东西:您的函数实际上需要返回一些东西。 当您创建 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 有什么区别?

【问题讨论】:

  • 这个问题正在meta 上讨论。

标签: python return output


【解决方案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】:

        你只需添加一个返回声明......

        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】:

          主要区别:

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

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

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

          【讨论】:

          • 这是一个很好的解释。可以缩短为“打印一些东西给人类看。返回一些东西给代码看”
          【解决方案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 将“返回一些东西”给调用它的任何东西,这通常是一个变量。然后,该变量被赋予其调用的函数中的 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】:
            def add(x, y):
                return x+y
            

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

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

            但是如果'add'函数打印输出'sum'然后是None,因为在它被分配后动作已经发生了。

            【讨论】:

              【解决方案8】:

              不幸的是,有字符限制,所以这将分为很多部分。首先要注意的是 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()
              

              打印“现在让我们看看 f1 和 f2 的值是多少”

              打印 f1 ---> 无

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

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

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

              【讨论】:

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

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

              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'
              

              【讨论】:

                猜你喜欢
                • 2010-10-19
                • 2021-04-28
                • 1970-01-01
                • 2023-01-03
                相关资源
                最近更新 更多