- Как получить противоположное (отрицание) логического значения в Python?
- 6 ответов
- not оператор (логическое отрицание)
- Логическое отрицание как функция
- Не используйте оператор побитового инвертирования ~ в логических значениях
- Отрицание с массивами NumPy (и подклассами)
- Настройка ваших собственных классов
- Как использовать операторы AND, OR и NOT в IF в Python
- Пример 1: с оператором If
- Пример 2: с оператором If-Else
- Пример 3: с оператором elif
- Оператор OR
- Пример 1: с оператором If
- Пример 2: с оператором If-Else
- Пример 3: с оператором elif
- Оператор NOT
- Синтаксис
- Пример 4
- Пример 5: для печати строки
- Пример 6: для печати списка
- Пример 7: для печати словаря
- Пример 8: для печати набора
- Пример 9: для печати кортежа
Как получить противоположное (отрицание) логического значения в Python?
Есть ли способ пропустить второе выражение if? Просто сказать компьютеру вернуть противоположное логическое значение bool ?
6 ответов
Вы можете просто использовать:
Принятый ответ здесь является наиболее правильным для данного сценария.
Это заставило меня задуматься о простом инвертировании логического значения в целом. Оказывается, что принятое решение здесь работает как один вкладыш, и есть еще один вкладыш, который также работает. Предполагая, что у вас есть переменная «n», которая, как вы знаете, является логическим значением, простейшие способы ее инвертирования:
Каким было мое первоначальное решение, а затем принятый ответ на этот вопрос:
Последнее более понятно, но я задумался над производительностью и решил ее через timeit — и оказалось, что n = not n также является БЫСТРЫМ способом инвертировать логическое значение.
Если вы пытаетесь реализовать переключатель , чтобы каждый раз, когда вы повторно запускаете постоянный код, который отменяется, вы можете добиться этого следующим образом:
try: toggle = not toggle except NameError: toggle = True
Запуск этого кода сначала установит toggle в True , и каждый раз, когда вызывается этот фрагмент, переключение будет отменено.
Вы можете просто сравнить логический массив. Например
В Python есть оператор not, верно? Разве это не просто «нет»? Как в,
not оператор (логическое отрицание)
Вероятно, лучший способ — использовать оператор not :
>>> value = True >>> not value False >>> value = False >>> not value True
if bool == True: return False else: return True
Логическое отрицание как функция
В модуле operator также есть две функции operator.not_ и его псевдоним operator.__not__ на тот случай, если он вам понадобится как функция, а не как оператор:
>>> import operator >>> operator.not_(False) True >>> operator.not_(True) False
Это может быть полезно, если вы хотите использовать функцию, которая требует функции-предиката или обратного вызова.
>>> lst = [True, False, True, False] >>> list(map(operator.not_, lst)) [False, True, False, True] >>> lst = [True, False, True, False] >>> list(filter(operator.not_, lst)) [False, False]
Конечно, то же самое может быть достигнуто с помощью эквивалентной функции lambda :
>>> my_not_function = lambda item: not item >>> list(map(my_not_function, lst)) [False, True, False, True]
Не используйте оператор побитового инвертирования ~ в логических значениях
Может возникнуть соблазн использовать побитовый оператор инвертирования ~ или эквивалентную операторную функцию operator.inv (или один из трех других псевдонимов там). Но поскольку bool является подклассом int , результат может быть неожиданным, поскольку он не возвращает «обратное логическое значение», он возвращает «обратное целое число»:
Это потому, что True эквивалентно 1 и False к 0 , а побитовая инверсия работает с поразрядным представлением целых чисел 1 и 0 .
Поэтому их нельзя использовать для «отрицания» bool .
Отрицание с массивами NumPy (и подклассами)
Если вы имеете дело с массивами NumPy (или подклассами вроде pandas.Series или pandas.DataFrame ), содержащими логические значения, вы можете фактически использовать побитовый обратный оператор ( ~ ), чтобы отрицать все логические значения в массиве:
>>> import numpy as np >>> arr = np.array([True, False, True, False]) >>> ~arr array([False, True, False, True])
Или эквивалентная функция NumPy:
>>> np.bitwise_not(arr) array([False, True, False, True])
Вы не можете использовать оператор not или функцию operator.not в массивах NumPy, поскольку они требуют, чтобы они возвращали один bool (не массив логических значений), однако NumPy также содержит логическую функцию not это работает поэлементно:
>>> np.logical_not(arr) array([False, True, False, True])
Это также может быть применено к небулевым массивам:
>>> arr = np.array([0, 1, 2, 0]) >>> np.logical_not(arr) array([ True, False, False, True])
Настройка ваших собственных классов
not работает, вызывая bool для значения и отменяя результат. В простейшем случае истинное значение просто вызовет > на объекте.
Так что, реализовав __bool__ (или __nonzero__ в Python 2) вы можете настроить значение истинности и, таким образом, результат not :
class Test(object): def __init__(self, value): self._value = value def __bool__(self): print('__bool__ called on '.format(self)) return bool(self._value) __nonzero__ = __bool__ # Python 2 compatibility def __repr__(self): return '()'.format(self=self)
Я добавил оператор print , чтобы вы могли убедиться, что он действительно вызывает метод:
>>> a = Test(10) >>> not a __bool__ called on Test(10) False
Аналогичным образом вы можете реализовать __invert__ для реализации поведения. когда ~ применяется:
class Test(object): def __init__(self, value): self._value = value def __invert__(self): print('__invert__ called on '.format(self)) return not self._value def __repr__(self): return '()'.format(self=self)
Снова с print вызовом, чтобы увидеть, что это на самом деле называется:
>>> a = Test(True) >>> ~a __invert__ called on Test(True) False >>> a = Test(False) >>> ~a __invert__ called on Test(False) True
Однако реализация __invert__ подобного рода может привести к путанице, поскольку ее поведение отличается от «нормального» поведения Python. Если вы когда-нибудь сделаете это, четко документируйте это и убедитесь, что у него довольно хороший (и распространенный) вариант использования.
Как использовать операторы AND, OR и NOT в IF в Python
Вы можете объединить несколько условий в одно выражение в условных операторах в Python, таких как if, if-else и elif. Это позволяет избежать ненужного написания нескольких вложенных операторов if.
В следующих примерах мы увидим, как мы можем использовать логический оператор AND для формирования составного логического выражения.
Пример 1: с оператором If
В следующем примере мы узнаем, как использовать логический оператор and в операторе If, чтобы объединить два логических условия для формирования составного выражения.
Чтобы продемонстрировать преимущества команды and, мы сначала напишем вложенный оператор if, а затем простой оператор, где он реализует ту же функциональность, что и вложенный оператор.
a = 5 b = 2 #nested if if a==5: if b>0: print('a is 5 and',b,'is greater than zero.') #or you can combine the conditions as if a==5 and b>0: print('a is 5 and',b,'is greater than zero.')
Здесь наш вариант использования состоит в том, что мы должны напечатать сообщение, когда a равно 5, а b больше 0. Без использования команды and мы можем написать только if, чтобы запрограммировать функциональность. Когда мы использовали логический оператор и обычный мы могли сократить количество if до одного.
a is 5 and b is greater than zero. a is 5 and b is greater than zero.
Пример 2: с оператором If-Else
В следующем примере мы будем использовать оператор and для объединения двух основных условных выражений в логическое выражение оператора If-Else.
a = 3 b = 2 if a==5 and b>0: print('a is 5 and',b,'is greater than zero.') else: print('a is not 5 or',b,'is not greater than zero.')
a is not 5 or 2 is not greater than zero.
Пример 3: с оператором elif
В следующем примере мы будем использовать функцию and для объединения двух основных условных выражений в логическое выражение оператора elif.
Мы узнали, как использовать логический оператор and с условными операторами: if, if-else и elif с хорошо подробными примерами.
Оператор OR
Вы можете объединить несколько условий в одно выражение в операторах if, If-Else или Elif.
В следующих примерах мы увидим, как мы можем использовать OR для формирования составного логического выражения.
Логический оператор OR возвращает True, если один из двух предоставленных ему операндов имеет значение true.
Пример 1: с оператором If
В следующем примере мы узнаем, как использовать OR для соединения двух логических условий для формирования логического выражения.
today = 'Saturday' if today=='Sunday' or today=='Saturday': print('Today is off. Rest at home.')
Today is off. Rest at home.
Пример 2: с оператором If-Else
В следующем примере мы будем использовать оператор OR для объединения двух основных условных выражений в логическое выражение.
today = 'Wednesday' if today=='Sunday' or today=='Saturday': print('Today is off. Rest at home.') else: print('Go to work.')
Пример 3: с оператором elif
В следующем примере мы будем использовать OR для объединения двух основных условных выражений в логическое выражение операторов elif.
today = 'Sunday' if today=='Monday': print('Your weekend is over. Go to work.') elif today=='Sunday' or today=='Saturday': print('Today is off.') else: print('Go to work.')
Мы узнали, как использовать оператор OR логический оператор с условным оператором Python: if, if-else и elif с хорошо подробными примерами.
Оператор NOT
Мы можем использовать логический оператор not с условием IF. Операторы внутри блока if выполняются только в том случае, если значение (логическое) равно False или если значение (коллекция) не пусто.
Синтаксис
Где, значение может иметь тип boolean, string, list, dict, set и т.д.
Если значение имеет логический тип, NOT действует как оператор отрицания. Если значение равно False, значение not будет True, и операторы в блоке if будут выполняться. Если value равно True, not value будет False, и операторы в блоке if не будут выполняться.
Если значение имеет строковый тип, то операторы в блоке if будут выполняться, если строка пуста.
Если значение имеет тип list, тогда операторы в блоке if будут выполняться, если список пуст. Такое же объяснение справедливо для значений других типов данных коллекции: dict, set и tuple.
Таким образом, мы можем использовать if not expression для условного выполнения блока операторов, только если значение не пустое или не False.
Пример 4
В этом примере мы будем использовать нелогический оператор NOT в логическом выражении IF.
a = False if not a: print('a is false.')
Пример 5: для печати строки
В этом примере мы будем использовать if not expression для печати строки, только если строка не пуста.
string_1 = '' if not string_1: print('String is empty.') else: print(string_1)
Пример 6: для печати списка
В этом примере мы будем использовать if not expression для печати списка только в том случае, если список не пуст.
a = [] if not a: print('List is empty.') else: print(a)
Пример 7: для печати словаря
В этом примере мы будем использовать if not expression для печати словаря, только если словарь не пуст.
a = dict(<>) if not a: print('Dictionary is empty.') else: print(a)
Пример 8: для печати набора
В этом примере мы будем использовать if not expression для печати набора, только если набор не пуст.
a = set(<>) if not a: print('Set is empty.') else: print(a)
Пример 9: для печати кортежа
В этом примере мы будем использовать if not expression для печати кортежа, только если кортеж не пуст.
a = tuple() if not a: print('Tuple is empty.') else: print(a)
Мы научились использовать оператор not вместе с условным оператором if с помощью примеров программ.