2014 dxdy logo

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

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




Начать новую тему Ответить на тему
 
 Связь между if и and/or
Сообщение30.12.2006, 18:38 


22/06/05
164
В статье 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 
Заслуженный участник
Аватара пользователя


17/10/05
3709
: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 


22/06/05
164
незваный гость писал(а):
В 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 
Заслуженный участник
Аватара пользователя


17/10/05
3709
: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 


22/06/05
164
незваный гость писал(а):
Возражение отметается: оператор if вообще не возвращает значения. Посему — считаем эквивалентными :)

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

Понятно.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 5 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group