Возможно ли что-либо вернуть из функции в 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
Это ничего не вернет.