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

0 投票
2 回答
4995 浏览
提问于 2025-04-16 21:16

我正在通过学习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 个回答

2

如果你不想让你的函数输出任何内容,最简单的办法就是在里面不要用 print。:P

第一次调用 deduct 时,它只会打印那条信息,实际上并没有其他作用,所以你可以直接把那行去掉,这样就没问题了。

不过,有一种稍微复杂的方法可以让打印的内容不显示。你可以暂时用一个不做任何事情的占位符来替换程序的输出文件。

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
7

打印“Hello world”被称为副作用——这是函数产生的结果,但并不体现在返回值上。你想知道的是如何调用这个函数两次,一次是为了产生副作用,另一次是为了获取函数的返回值。

其实你根本不需要调用两次——一次就足够了,可以同时得到这两个结果。只需在这一次调用中捕获返回值即可:

if input_user == "A":
    variable_a = deduct(variable_a)
else: 

撰写回答