返回函数的输出与打印它有何不同?

Posted

技术标签:

【中文标题】返回函数的输出与打印它有何不同?【英文标题】: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 有什么区别?

【问题讨论】:

【参考方案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,因为在分配它之后就已经发生了操作。

【讨论】:

以上是关于返回函数的输出与打印它有何不同?的主要内容,如果未能解决你的问题,请参考以下文章

热键的输出与预期不同

vector<int>v的v.at(100)函数与v[100] 有何不同

无法在 C 中打印返回数组指针的函数的输出

有哪些不同类型的 Windows 令牌以及它们有何不同?

回归与分类器 predict_proba

php 一些常用函数