У меня есть несколько функций, все функции что-то делают и возвращают либо True, либо False. Тогда у меня есть следующая структура:
if function_1(myarg):
pass
elif function_2(myarg):
pass
elif function_3(myarg):
pass
elif function_4(myarg):
pass
elif function_5(myarg):
pass
elif function_6(myarg):
pass
else:
do_something_else()
Если функция возвращает True, то код функции уже выполнен, и я могу передать остальную часть оператора if-elif-else. В противном случае я тестирую другую функцию и т. д. до утверждения else. Верна ли эта структура в Python? Если это правильно, но не «питоновский», то какой более «питоновский» способ?
Представляет ли «myarg» один и тот же аргумент (ы) для всех функций?
Вы ожидаете, что будут запущены все функции или только первая, которая вернет false?
@МайклБучер Да
@Sayse Нет, просто запустите функцию, которая возвращает True
Это утверждение верно. Вы также можете прочитать об операторе match-case в Python.
Оператор Который верен? Как можно применить match-case?






Вероятно, самый питонический способ состоит в том, чтобы содержать ваши функции в списке и перебирать их с помощью any() следующим образом:
functions = [function_1, function_2, function_3]
if not any(func(myarg) for func in functions):
do_something_else()
Имеет ли значение порядок функций в списке?
Да, они будут выполняться в том порядке, в котором они определены в списке, и после того, как любой из них вернет True, остальные не будут выполняться. Как и в вашем исходном примере. Вот как работает any с выражениями генератора.
То, что у вас есть, безусловно, работает, но не будет поддерживаться в долгосрочной перспективе.
Более питоническим способом было бы создать набор функций (при условии, что все они принимают один аргумент myarg)
functions = [function_1, function_2, function_3, function_4, function_5, function_6]
for f in functions:
if f(myarg):
break
else:
do_something_else()
Почему бы не перебрать функции и
breakцикл, когда одна из них возвращает true?