如何从Python中的函数获取返回值?

时间:2011-07-11 15:32:10

标签: python function loops

我正在尝试通过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。

2 个答案:

答案 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