Возможно ли что-либо вернуть из функции в python?

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

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

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

Ответ 1

Функции всегда возвращают что-то (по крайней мере, None, когда во время выполнения не было достигнуто выражение return), а конец функции достигнут).

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

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

  • Если у вас есть что-то вернуть, тогда сделайте это, а если нет, то нет.
  • Если вы полагаетесь на возвращаемое то, что имеет определенный тип, но вы не можете вернуть ничего значимого в этом типе, тогда None сообщит вызывающему, что это так ( Нет лучшего способа сообщить вызывающему, что "ничего" не возвращается, а затем None, поэтому проверьте его, и все будет в порядке)

Ответ 2

Нет. Если инструкция return не была достигнута до конца функции, возвращается неявный None.

Ответ 3

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

def set_x():
    x = 2

Ответ 4

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

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)

EDIT: Вот хорошее введение в итераторы и генераторы в Python. http://www.learningpython.com/2009/02/23/iterators-iterables-and-generators-oh-my/

Ответ 5

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

def foo(input):
    pass

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