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