我正在尝试通过Python学习编程,我想知道是否可以获得函数的返回值而不是其他部分。这是代码:
让我们说,这是主要功能:
variable_a = 5
while variable_a > 0 :
input_user = raw_input(": ")
if input_user == "A":
deduct(variable_a)
variable_a = deduct(variable_a)
else:
exit(0)
然后这是扣除功能:
def deduct(x):
print "Hello world!"
x = x - 1
return x
会发生什么,它会进行计算并扣除,直到variable_a达到0.然而,“Hello world!”得到印刷两次,我认为因为 variable_a = deduct(variable_a)(如果我错了,请纠正我)。所以我在想,我可以只捕获deduct()的返回值而不是捕获其余的值吗?所以在这种情况下,在经过deduct()之后,variable_a只有一个普通值2(没有“Hello world!”)。
我错过了什么吗? :
编辑注释:我删除了空白行,因此可以将其粘贴到REPL。
答案 0 :(得分:7)
“Hello world”的打印是所谓的副作用 - 由函数产生的东西,它不会反映在返回值中。您要求的是如何调用该函数两次,一次产生副作用,一次捕获函数返回值。
事实上,你根本不需要两次调用它 - 一旦足以产生两个结果。只需捕获一个的返回值,并且只能调用:
if input_user == "A":
variable_a = deduct(variable_a)
else:
答案 1 :(得分:2)
如果您不希望您的功能打印输出,正确的解决方案是不要在其中使用print
。 :P
第一次拨打deduct
时,除了打印该消息外,它不会执行任何操作,因此您可能只需删除该行即可。
然而, 是一种稍微混乱的方式来抑制print语句。您可以使用不执行任何操作的占位符临时替换程序的输出文件。
import sys
class FakeOutput(object):
def write(self, data):
pass
old_out = sys.stdout
sys.stdout = FakeFile()
print "Hello World!" # does nothing
sys.stdout = old_out
print "Hello Again!" # works normally
你甚至可以建立一个上下文管理器来使这更方便。
import sys
class FakeOutput(object):
def __enter__(self):
self.out_stdout = sys.stdout
sys.stdout = self
return self
def __exit__(self, *a):
sys.stdout = self.out_stdout
def write(self, data):
pass
print "Hello World!" # works
with FakeOutput():
print "Hello Again!" # doesn't do anything
print "Hello Finally!" # works