@Jungles
Молодой и зелёный

В чем разница между 'AND' и '&'?

Работал с Pandas.
И когда пытался ввести,допустим,такое условие
a=data[(data.Age > 20) and (data.Wage > 10)]. count()

выходила ошибка. Я не мог понять,ведь вроде все в порядке.
Потом от скуки написал
a=data[(data.Age > 20) & (data.Wage > 10)]. count()

СРАБОТАЛО!
Я полез в интернет за информацией,
кто-то уже задавал такой вопрос-"https://stackoverflow.com/questions/21415661/logic..."
Но я плохо догнал объяснение(наверное,сказался уровень английского)
поискав еще в интернете уже не про Pandas,кое к чему пришел.
AND - логический элемент,который сравнивет True и False,или 1 и 0, если хотя бы 1 элемент Fаlse,то он возвращает ответ-False.
False and True
False

&-это логическое "И"-то есть умножение,
255 & 1
1

И что бы не париться,что есть булево значение или не было запутанности Fаlse ответ или же True, разработчики Pandas вообще убрали эту команду.
А какой на самом деле правильный ответ?
  • Вопрос задан
  • 1450 просмотров
Решения вопроса 1
trapwalker
@trapwalker Куратор тега Python
Программист, энтузиаст
разница в том, что `and` - это логическая операция, её нельзя перекрыть, то есть нельзя у объекта реализовать метод, который будет реализовывать свой алгоритм вычисления результата операции.
Связано это со стандартными оптимизациями логических выражений, которые (оптимизации) есть почти во всех языках.
Грубо говоря операция `and` (конъюнкция) принимает два аргумента (слева и справа) и возвращает значение первого попавшегося ложного или последнего истинного, если все истины.
Например:
'one' and 0  # вернёт 0
'' and 13  # вернёт ''
3 and 5  # вернёт 5

Дезъюнкция (or) работает похожим образом, но возвращает первый попавшийся истинный рагумент, или последний ложный, если ложны оба:
3 or 5  # вернёт 3
'' or 'hello'  # вернёт 'hello'
None or 0 # вернёт 0

При этом, если возвращается первый попавшийся подходящий аргумент, второй вообще вычисляться не будет. Там может быть целое выражение с вызовом функций, но вычисляться оно не будет, поскольку это значение не нужно. На самом деле это очень удобно и позволяет лаконично записывать многие вещи.

Операции & | по своему принципу работы ничем не отличаются от сложения, вычитания, умножения, деления, проверки на равенство и неравенство и многих других операций. Все эти операции могут быть перекрыты. То есть написав такой класс:
Class MyClass:
    def __and__(self, right_argument):
        result = 'что угодно'
        print(f'Фигасе: {self} & {right_argument} -> {result}')
        return result

a = MyClass()
b = MyClass()
print('Вот так вот:\n', a & b)

Фигасе: <__main__.MyClass object at 0x7f3df1aeb588> & <__main__.MyClass object at 0x7f3df1aeb438> -> что угодно
Вот так вот:
 что угодно


pandas использует перекрытие, чтобы, фактически, сформировать функцию, которая будет применяться потом к большому количеству аргументов по очереди. Само собой логические операции для этого не годятся.

Я просто уверен, что автор вопроса не поймёт до конца то, что я тут объяснял, но, возможно, кому-то пригодится.

Удручает, что люди не хотят учиться, а хотят сразу быть готовыми программистами и писать в прод.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы