На прошлой неделе я взял интервью, в ходе которого я узнал несколько вещей о питоне, о которых я не знал (или точнее понял, как их можно использовать), в первую очередь, и содержание этого вопроса - использование or
для целей отраслевого контроля.
Так, например, если мы запустим:
def f():
# do something. I'd use ... but that's actually a python object.
def g():
# something else.
f() or g()
Затем, если f()
оценивает какое-либо истинное условие, возвращается это значение, если нет, g()
оценивается и всеВозвращаемое значение возвращается, истина или ложь.Это дает нам возможность реализовать оператор if
с использованием or
ключевых слов.
Мы также можем использовать and
, так что f() and g()
вернет значение g()
, если f()
истиннои значение f()
, если g()
равно false.
Мне сказали, что это (использование or
для управления ветвлением) является распространенным явлением в таких языках, как lisp (отсюда и тег lisp).В настоящее время я следую SICP Схеме обучения, поэтому я вижу, что (or (f x) (g x))
вернет значение (g x)
при условии, что (f x)
равно #f
.
Я в замешательствеотносительно того, есть ли какое-либо преимущество этой техники.Ясно, что он обеспечивает управление ветвями, но мне кажется, что встроенные ключевые слова более понятны.
Я также не уверен, является ли это "функциональным" или нет?Мое понимание чистого функционального программирования заключается в том, что вы используете конструкции, подобные этой (пример из моих недавних экспериментов с эрлангом):
makeeven(N,1) -> N+1;
makeeven(N,0) -> N;
makeeven(N) -> makeeven(N,N rem 2).
Или более лучший, более сложный пример использования шаблонного метапрограммирования в C ++ (обнаружено через cpp-next.com).Мой мыслительный процесс состоит в том, что один аспект функционального программирования сводится к использованию кусочно определенных функций в коде для управления ветвями (и, если вы можете управлять им, хвостовой рекурсией).
Итак, мойвопросы:
- Это "функционал"?Похоже, мои интервьюеры сказали, что у них есть опыт функционального программирования, но это не соответствовало тому, что я считал функциональным.Я не вижу причин, по которым у вас не может быть логического оператора как части функции - он, похоже, прекрасно подходит для концепции функций более высокого порядка.Я просто не думал, что использование логических операторов - это то, как функциональные программисты достигают управления ветвями.Правильно?Неправильно?Я вижу, что схемы используют логические вентили для управления ветвлением, поэтому я думаю, что это похожая (связанная) концепция?
- Есть ли какое-то преимущество в использовании этой техники?Это просто языковая лаконичность / синтаксическая проблема, или есть какие-то последствия с точки зрения построения интерпретатора для использования этой конструкции?
- Есть ли варианты использования для этой техники?Или это не очень часто используется?Это вообще используется?Как парень-самоучка, я никогда не видел его раньше, хотя это само по себе не обязательно удивительно.
Я прошу прощения за то, что перепрыгнул через столько языков;Я просто пытаюсь связать свое понимание между ними.Не стесняйтесь отвечать на любом языке, упомянутом.Я также прошу прощения, если я неправильно понял какие-либо определения или упустил здесь что-то жизненно важное, я никогда официально не изучал информатику.