Форум сайта python.su
Хочу передать в качестве параметра функцию, которая соответствовала бы выражению X or Y, то есть вернуть первый операнд, если bool(X) - True, иначе второй.
в модуле operator полно различный функций, но аналогов логических нет! почему они отсутствуют?
Офлайн
А зачем они там, если можна, например, так:
myOr = lambda x,y: x or y
Офлайн
regallНу так и всё остальное из модуля operator можно так написать…
А зачем они там, если можна, например, так:
Офлайн
Они работают быстрее, чем лямбды, если применять их, например, в 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
Офлайн
Хм… Интересно… Буду иметь в виду.
veonА вот и ответ на первоначальный вопрос! :-)
operator.or_
Офлайн
ZZZэто побитовое ИЛИ. совсем другое.veonА вот и ответ на первоначальный вопрос! :-)
operator.or_
Офлайн
Ну ладно, сорри… Невнимательный я сегодня…
Офлайн
Оператор or нельзя переопределить. У него нет имени магического метода.
Поэтому в operators он не доступен (как и логические and, not)
Офлайн
Т.е. он просто спрашивает bool(obj.__nonzero__()), bool(obj.__len__())… и сравнивает?
А почему нельзя было сделать методом?
Офлайн
Потому что это ленивый оператор, и он работает немного иначе, чем вы указали.
Гляньте-ка на http://www.python.org/dev/peps/pep-0335/
Офлайн