返回函数的输出与打印它有何不同?
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
,因此在我运行该函数时会显示该函数的输出。 return
ing something 和 print
ing 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,因为在分配它之后就已经发生了操作。
【讨论】:
以上是关于返回函数的输出与打印它有何不同?的主要内容,如果未能解决你的问题,请参考以下文章