14

Вопрос по python – Можно ли ничего не возвращать из функции в Python?

с простым фильтром, который проверяет входные данные в диапазоне 0-100.

def foo(foo_input):
    if 0 <= foo_input <= 100:
        return f_input

Это не возвращает ничего, еслиfoo_input is > 100, Но может ли это на самом деле «не»? вернуть что-нибудь? или функция всегда должна что-то возвращать?

  • Error: User Rate Limit Exceeded[x for x in sequence if 0 <= x <= 100].

    от
  • Error: User Rate Limit Exceeded>>>Error: User Rate Limit Exceededhelp(filter)Error: User Rate Limit Exceededfilter()Error: User Rate Limit Exceededitertools.ifilter()Error: User Rate Limit Exceededyield.

    от
  • Error: User Rate Limit Exceeded

    от beoliver
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit ExceededfilterError: User Rate Limit Exceededfiltered_list = filter(foo_filter, unfiltered_sequence)

    от
  • use969617: Что произойдет, если не будет возвращен результат? Если это было пропущено выполнение, то вы можете получить ту же функциональность, используя оператор if для проверкиNone - хотя если с большей вероятностью вы получите результат, чем None, то перехват исключений - лучшая идея, поскольку Python следуетask for forgiveness, not permission принцип.

    от Gareth Latty
  • функции цепочки, и если я собирался написать, попробуйте попробовать: кроме предложений для каждой из них (из-за того, что не передается)

    от beoliver
  • Хорошо, помните, что исключения проваливаются, поэтому, если вы хотите поймать ошибку из-заNone в любом месте процесса, вы можете просто обернуть весь блок в улов дляTypeErrors. Очевидно, что только обернуть сегмент, для которого это необходимо, но нет необходимости в той же тоннеtry ... except ... блоки

    от Gareth Latty
  • Мне было интересно, смогу ли я уйти, даже не используя выражения if :)

    от beoliver
  • Почему это беспокоит вас, функция возвращаетNone?

    от Sven Marnach
5 ответов
  • 0

    Мы можем использовать def foo(input): pass

    Мы можем использоватьpass:

    def foo(input):
        pass
    

    Это ничего не вернет.

  • 14

    Если

    return оператор не достигнут до конца функции, то неявныйNone возвращается

  • 6

    Если оператор возврата не достигнут, функция возвращает

    None.

    def set_x():
        x = 2
    

  • 19

    Функции всегда что-то возвращают (по крайней мере

    None, когда во время выполнения не было достигнуто оператора возврата и достигнут конец функции).

    Другой случай, когда они прерываются исключениями. В этом случае обработка исключений будет «доминировать над стеком». и вы вернетесь к соответствующемуexcept или получите какую-нибудь неприятную ошибку :)

    Что касается вашей проблемы, я должен сказать, что есть две возможности: Либо вам есть что вернуть, либо вас нет.

    If you have something to return then do so, if not then don't. If you rely on something being returned that has a certain type but you cannot return anything meaningful of this type then None will tell the caller that this was the case ( There is no better way to tell the caller that "nothing" is returned then by None, so check for it and you will be fine)

  • 3

    Я не уверен

    что вы действительно пытаетесь сделать. Вот несколько вещей, которые вам могут понравиться:

    def foo(foo_input, foo_default):
        if 0 <= foo_input <= 100:
            return f_input
        else:
            return foo_default
    
    
    def foo(foo_input):
        if 0 <= foo_input <= 100:
            return f_input
        raise ValueError, "foo_input was not in range [0, 100]"
    

    Подожди, ты сказал "фильтр". Вы фильтруете ряд значений и хотите извлечь те, которые соответствуют критериям? Это легко в Python:

    def foo_check(x):
        return 0 <= x <= 100
    
    filtered_list = [x for x in unfiltered_sequence if foo_check(x)]
    

    И вы сказали «функции цепочки». Опять же, это легко, если мы говорим о фильтрации последовательности:

    def foo_filter(seq):
        for x in seq:
            if 0 <= x <= 100:
                yield x
    
    def other_filter(seq):
        for x in seq:
            if meets_criterion(x):
                yield x
    
    
    def do_the_task(seq):
        for x in other_filter(foo_filter(seq)):
            do_something(x)
    

    РЕДАКТИРОВАТЬ: Вот хорошее введение в итераторы и генераторы в Python.http://www.learningpython.com/2009/02/23/iterators-iterables-and-generators-oh-my/