Уведомления

Группа в Telegram: @pythonsu

#1 Май 25, 2010 12:56:04

Dimka665
От:
Зарегистрирован: 2008-09-19
Сообщения: 177
Репутация: +  0  -
Профиль   Отправить e-mail  

Функция, соответствующая оператору OR

Хочу передать в качестве параметра функцию, которая соответствовала бы выражению X or Y, то есть вернуть первый операнд, если bool(X) - True, иначе второй.
в модуле operator полно различный функций, но аналогов логических нет! почему они отсутствуют?



Офлайн

#2 Май 25, 2010 14:04:01

regall
От: Киев
Зарегистрирован: 2008-07-17
Сообщения: 1583
Репутация: +  3  -
Профиль   Отправить e-mail  

Функция, соответствующая оператору OR

А зачем они там, если можна, например, так:

myOr = lambda x,y: x or y



Офлайн

#3 Май 25, 2010 14:40:52

ZZZ
От: Москва
Зарегистрирован: 2008-04-03
Сообщения: 2161
Репутация: +  26  -
Профиль   Адрес электронной почты  

Функция, соответствующая оператору OR

regall
А зачем они там, если можна, например, так:
Ну так и всё остальное из модуля operator можно так написать…
Тоже не очень понимаю, зачем это надо… Разве что для функциональщины.



Офлайн

#4 Май 25, 2010 15:44:01

veon
От:
Зарегистрирован: 2010-04-26
Сообщения: 5
Репутация: +  0  -
Профиль   Отправить e-mail  

Функция, соответствующая оператору OR

Они работают быстрее, чем лямбды, если применять их, например, в reduce.

>>> timeit.timeit("reduce(lambda x,y: x|y, range(1000))", number=1000)
0.4297667419650395
>>> timeit.timeit("reduce(operator.or_, range(1000))", "import operator", number=1000)
0.15156629485321105
Но вот так даже ещё лучше
>>> timeit.timeit("a=0\nfor x in range(1000): a|=x", number=1000)
0.14097952174410011



Офлайн

#5 Май 25, 2010 15:49:06

ZZZ
От: Москва
Зарегистрирован: 2008-04-03
Сообщения: 2161
Репутация: +  26  -
Профиль   Адрес электронной почты  

Функция, соответствующая оператору OR

Хм… Интересно… Буду иметь в виду.

veon
operator.or_
А вот и ответ на первоначальный вопрос! :-)



Офлайн

#6 Май 25, 2010 15:53:18

Dimka665
От:
Зарегистрирован: 2008-09-19
Сообщения: 177
Репутация: +  0  -
Профиль   Отправить e-mail  

Функция, соответствующая оператору OR

ZZZ
veon
operator.or_
А вот и ответ на первоначальный вопрос! :-)
это побитовое ИЛИ. совсем другое.



Офлайн

#7 Май 25, 2010 16:03:31

ZZZ
От: Москва
Зарегистрирован: 2008-04-03
Сообщения: 2161
Репутация: +  26  -
Профиль   Адрес электронной почты  

Функция, соответствующая оператору OR

Ну ладно, сорри… Невнимательный я сегодня…



Офлайн

#8 Май 25, 2010 17:29:28

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Функция, соответствующая оператору OR

Оператор or нельзя переопределить. У него нет имени магического метода.
Поэтому в operators он не доступен (как и логические and, not)



Офлайн

#9 Май 25, 2010 18:49:06

ZZZ
От: Москва
Зарегистрирован: 2008-04-03
Сообщения: 2161
Репутация: +  26  -
Профиль   Адрес электронной почты  

Функция, соответствующая оператору OR

Т.е. он просто спрашивает bool(obj.__nonzero__()), bool(obj.__len__())… и сравнивает?
А почему нельзя было сделать методом?



Офлайн

#10 Май 25, 2010 19:40:25

Андрей Светлов
От:
Зарегистрирован: 2007-05-15
Сообщения: 3137
Репутация: +  14  -
Профиль   Адрес электронной почты  

Функция, соответствующая оператору OR

Потому что это ленивый оператор, и он работает немного иначе, чем вы указали.
Гляньте-ка на http://www.python.org/dev/peps/pep-0335/



Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version