Как получить только возвращаемое значение из функции в Python? - PullRequest
0 голосов
/ 11 июля 2011

Я пытаюсь научиться программировать через 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 () переменная _a будет просто иметь простое значение 2 (без «Hello world!»).

Я что-то упускаю?:?

Примечание редактора : Я удаляю пустые строки, чтобы их можно было вставить в REPL.

Ответы [ 2 ]

7 голосов
/ 11 июля 2011

Печать «Hello world» - это то, что известно как побочный эффект - то, что создается функцией и не отражается в возвращаемом значении.Вы спрашиваете, как вызвать функцию дважды, один раз, чтобы вызвать побочный эффект, и один раз, чтобы получить возвращаемое значение функции.

Фактически вам не нужно вызывать ее дважды вообще - один раздостаточно для получения обоих результатов.Просто запишите возвращаемое значение в одном вызове:

if input_user == "A":
    variable_a = deduct(variable_a)
else: 
2 голосов
/ 11 июля 2011

Если вы не хотите, чтобы ваша функция печатала вывод, правильное решение - не использовать 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...