2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




 
 Связь между if и and/or
Сообщение30.12.2006, 18:38 
В статье David Mertz "Functional Programming in Python" (вот оригинал и перевод) утверждается, будто следующие выражения эквивалентны:
Код:
# Normal statement-based flow control
if <cond1>:   func1()
elif <cond2>: func2()
else:         func3()

# Equivalent "short circuit" expression
(<cond1> and func1()) or (<cond2> and func2()) or (func3())

Насколько понимаю, в некоторых случаях эти выражения будут иметь разные значения. Например, если cond1 равно True, func1() возвращает False, cond2 равно True, func2() возвращает True. Вот более простой пример (без elif):
Код:
>>> if True: 0
... else: 5
...
0
>>> True and 0 or 5
5

:) Упражнение на классы Поста: доказать, что булевская функция f(x,y,z)=x?y:z (где оператор ?: понимается в сишном смысле) не выражается только через конъюнкцию и дизъюнкцию.

 
 
 
 
Сообщение30.12.2006, 22:13 
Аватара пользователя
:evil:
Вы правы. В статье D. Mertz приводит пример с функцией, результат которой всегда интерпретируется как «истина». Это особенно грешно, поскольку функция без явного результата возвращает None, что в данном случае приведет к ошибке.

Выражение, конечно, можно поправить, но становится скучно:
Код:
# Normal statement-based flow control
if <cond1>:   func1()
elif <cond2>: func2()
else:         func3()

# Equivalent "short circuit" expression
(<cond1> and (func1() or True)) or (<cond2> and (func2() or True)) or (func3())

Количество скобочек начинает напоминать Lisp :)

В Python 2.5 было введено условное выражение:
Код:
true-part if cond else false-part
Используя его, все еще проще и еще менее наглядно:
Код:
func1() if <cond1> else (func2() if <cond2> else func3())
.

 
 
 
 
Сообщение30.12.2006, 22:54 
незваный гость писал(а):
В Python 2.5 было введено условное выражение:
Код:
true-part if cond else false-part

Спасибо, не знал. Если часть elif не требуется, то с новым условным выражением вполне читабельно. Хотя условие на первом месте (как в Lisp, C и Haskell) в некоторых ситуациях смотрится лучше.
незваный гость писал(а):
Выражение, конечно, можно поправить, но становится скучно:
Код:
# Normal statement-based flow control
if <cond1>:   func1()
elif <cond2>: func2()
else:         func3()

# Equivalent "short circuit" expression
(<cond1> and (func1() or True)) or (<cond2> and (func2() or True)) or (func3())


Выражения всё же не совсем эквивалентны. Функи теперь вызываются такие же, как в if/elif/else, но результирующее значение в некоторых случаях получается другое (например, когда cond1 = True и func1 возвращает False).

 
 
 
 
Сообщение31.12.2006, 04:21 
Аватара пользователя
:evil:
Егор писал(а):
Выражения всё же не совсем эквивалентны.

Возражение отметается: оператор if вообще не возвращает значения. Посему — считаем эквивалентными :)

Вот Вам другой пример функциональной записи (возвращающей результат вызванной функции):
Код:
((<cond1> and (func1(),)) or (<cond2> and (func2(),)) or (func3(),))[0]


Добавлено спустя 9 минут 43 секунды:

Егор писал(а):
Хотя условие на первом месте (как в Lisp, C и Haskell) в некоторых ситуациях смотрится лучше.

Мотивация такого синтаксиса довольно любопытна. После анализа большого количества текстов GvR заявил, что в большинстве случаев true-part — это нормально выбираемая часть, а false-part — обработка ошибки, исключения. Поскольку исключения редки, то стоит подчеркнуть основное значение:
Код:
a/b if b != 0 else 0

Традиционный же подход подчеркивает скорее условие:
Код:
(b != 0? a/b: 0)
Особенно это заметно при сложных условиях и простых значениях.

Мне это тоже показалось сперва нетрадиционным, непривычным. Для меня одним из аргументов является обратный порядок вычисления, в целом не свойственный языку. С другой стороны, я не склонен вообще использовать условное выражение, если его части не просты.

 
 
 
 
Сообщение02.01.2007, 20:20 
незваный гость писал(а):
Возражение отметается: оператор if вообще не возвращает значения. Посему — считаем эквивалентными :)

Действительно. :?
незваный гость писал(а):
Мотивация такого синтаксиса довольно любопытна. После анализа большого количества текстов GvR заявил, что в большинстве случаев true-part — это нормально выбираемая часть, а false-part — обработка ошибки, исключения. Поскольку исключения редки, то стоит подчеркнуть основное значение:

Понятно.

 
 
 [ Сообщений: 5 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group