Я провел интервью на прошлой неделе, в котором я узнал несколько вещей о питоне, о котором я не знал (или, скорее, о том, как их можно использовать), сначала и содержание этого вопроса - использование 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). Мой мыслительный процесс заключается в том, что одним из аспектов функционального программирования является использование кусочно определенных функций в коде для управления ветвью (и если вы можете управлять им, рекурсия хвоста).
Итак, мои вопросы:
- Является ли это "функциональным"? Похоже, что и мои интервьюеры сказали, что у них есть опыт в функциональном программировании, но это не соответствовало тому, что я считал функциональным. Я не вижу причин, по которым у вас не может быть логического оператора как части функции - он, похоже, хорошо поддается понятию функций более высокого порядка. Я просто не думал, что использование логических операторов заключается в том, как функциональные программисты добились управления филиалом. Правильно? Неправильно? Я вижу, что схемы используют логические ворота для управления ветвью, поэтому я думаю, что это аналогичная (связанная) концепция?
- Есть ли какое-то преимущество в использовании этой техники? Является ли это просто сжатием языка или проблемой синтаксиса, или есть ли смысл в построении интерпретатора для использования этой конструкции?
- Существуют ли какие-либо варианты использования этого метода? Или он не используется очень часто? Используется ли вообще? Будучи самоучкой, я никогда не видел ее раньше, хотя это само по себе не обязательно удивительно.
Я прошу прощения за прыжок на стольких языках; Я просто пытаюсь связать свое понимание через них. Не стесняйтесь отвечать на любом языке. Я также извиняюсь, если я неправильно понял какие-либо определения или упустил что-то важное здесь, я никогда официально не изучал информатику.