return语句的作用是什么?与打印有什么不同?
return
语句的作用是什么?在Python中应该怎么使用它?
return
和print
有什么不同?
另见
很多人会在函数里用print
来循环输出多个值,想要在外部使用这些结果。其实这些结果需要用return
返回,但return
第一次执行时就会退出函数。可以参考我怎么才能用`return`从循环中返回多个值?可以把它们放在一个列表里吗?。
初学者常常会写一个函数,最后用print
输出某个东西,而不是用return
返回,然后又试图去print
这个结果,结果却意外地输出了None
。可以参考为什么我的函数输出后会打印"None"?。
在Python 3.x中,有时人们会试图把print
的结果赋值给一个变量,或者在其他表达式中使用它,比如input(print('prompt:'))
。在3.x中,print
是一个函数,所以这不是语法错误,但它返回的是None
而不是显示的内容。可以参考为什么print函数返回None?。
有时人们会写代码,试图从一个递归调用中print
结果,而不是正确地用return
返回。就像只是调用这个函数一样,这样做无法将值通过递归传递回来。可以参考为什么我的递归函数返回None?。
可以考虑查看我怎么从一个函数中得到结果(输出)?我怎么能在之后使用这个结果?,这个问题主要是关于如何使用 return
,而不涉及print
。
15 个回答
把打印语句想象成一种副作用,它让你的函数把一些文字输出给用户,但这个输出不能被其他函数使用。
我会通过一些例子和维基百科上的几个定义来更好地解释这个概念。
这是维基百科对函数的定义:
在数学中,函数将一个量(函数的参数,也称为输入)与另一个量(函数的值,也称为输出)关联起来。
想一想,这句话是什么意思?当你说一个函数有值时,这意味着什么呢?
这意味着你实际上可以用一个普通的值来替代函数的值!(前提是这两个值是同类型的)
你可能会问,为什么要这样做呢?
那其他函数可能也接受同类型的值作为输入呢?
def square(n):
return n * n
def add_one(n):
return n + 1
print square(12)
# square(12) is the same as writing 144
print add_one(square(12))
print add_one(144)
#These both have the same output
有一个很酷的数学术语来描述那些只依赖输入来产生输出的函数:可引用透明性。再一次,来自维基百科的定义。
可引用透明性和可引用不透明性是计算机程序某些部分的特性。如果一个表达式可以用它的值替换而不改变程序的行为,那么这个表达式就被称为可引用透明。
如果你刚接触编程,这个概念可能有点难以理解,但我相信你经过一些实验后会明白的。一般来说,你可以在一个函数中使用打印,也可以在最后有一个返回语句。
只要记住,当你使用返回时,你基本上是在说“调用这个函数就等于写出返回的值”。
如果你不自己提供返回值,Python会自动为你插入一个返回值,这个值叫做“None”,它是一种特殊的类型,表示什么都没有,或者说是空值。
print()
函数的作用是把一段文字“打印”到控制台上。return
语句则是让你的函数结束,并把一个值返回给调用它的地方。函数的主要目的就是接收输入,然后返回一些东西。当函数准备好要返回一个值时,就会用到 return
语句。
比如,下面这个函数同时使用了 print()
和 return
:
def foo():
print("hello from inside of foo")
return 1
现在你可以运行调用 foo 的代码,像这样:
if __name__ == '__main__':
print("going to call foo")
x = foo()
print("called foo")
print("foo returned " + str(x))
如果你把这个作为脚本运行(比如一个 .py
文件),而不是在 Python 解释器里运行,你会看到以下输出:
going to call foo
hello from inside foo
called foo
foo returned 1
希望这样能让你更明白。解释器会把返回值写到控制台上,所以我能理解为什么有人会感到困惑。
这里还有一个来自解释器的例子,展示了这一点:
>>> def foo():
... print("hello within foo")
... return 1
...
>>> foo()
hello within foo
1
>>> def bar():
... return 10 * foo()
...
>>> bar()
hello within foo
10
你可以看到,当 foo()
从 bar()
被调用时,1 并没有被写到控制台上。相反,它是用来计算从 bar()
返回的值。
print()
是一个会产生副作用的函数(它会在控制台上写一段文字),但执行会继续进行到下一条语句。而 return
则会让函数停止执行,并把一个值返回给调用它的地方。