Использование логического оператора "not" в Python
Оглавление
- Работа с логической логикой в Python
- Начало работы с оператором not в Python
- Использование оператора not в логических контекстах
- Использование оператора not в логических контекстах
- Использование функционального оператора not
- Работа с оператором not в Python: Лучшие практики
- Заключение
Смотрите сейчас, к этому уроку прилагается соответствующий видеокурс, созданный командой Real Python. Посмотрите его вместе с письменным руководством, чтобы углубить свое понимание: Используя оператор Python not
Оператор not в Python позволяет инвертировать истинностное значение логических выражений и объектов. Вы можете использовать этот оператор в логических контекстах, таких как операторы if и циклы while. Это также работает в не логических контекстах, что позволяет вам инвертировать истинное значение ваших переменных.
Эффективное использование оператора not поможет вам писать точные отрицательные логические выражения для управления процессом выполнения ваших программ.
В этом уроке вы узнаете:
- Как работает оператор
notв Python - Как использовать оператор
notв логических и не логических контекстах - Как использовать функцию
operator.not_()для выполнения логического отрицания - Как и когда избежать ненужной негативной логики в вашем коде
Вы также приведете несколько практических примеров, которые позволят вам лучше понять некоторые основные варианты использования оператора not и рекомендации по его использованию. Чтобы извлечь максимальную пользу из этого руководства, вы должны иметь некоторые предварительные знания о логической логике, условных операторах и while петли.
Бесплатный бонус: 5 Размышления о мастерстве владения Python - бесплатный курс для разработчиков Python, который показывает вам план действий и мышление, с которым вы будете работать. вам нужно поднять свои навыки работы с Python на новый уровень.
Работа с логической логикой в Python
Джордж Буль создал то, что сейчас известно как Булева алгебра, которая опирается на true и значенияfalse. Он также определяет набор логических операций: AND, OR, и NOT. Эти логические значения и операторы полезны при программировании, поскольку они помогают вам определять порядок действий в ваших программах.
В Python логический тип , bool, является подклассом int:
>>> issubclass(bool, int) True >>> help(bool) Help on class bool in module builtins: class bool(int) bool(x) -> bool ...предварительно> кодовый блок>Этот тип имеет два возможных значения,
TrueиFalse, которые являются встроенными константами в Python и должны быть написаны с заглавной буквы. Внутренне Python реализует их в виде целых чисел:>>> type(True) <class 'bool'> >>> type(False) <class 'bool'> >>> isinstance(True, int) True >>> isinstance(False, int) True >>> int(True) 1 >>> int(False) 0предварительно> кодовый блок>Python внутренне реализует свои логические значения как
1дляTrueи0дляFalse. Продолжайте и запуститеTrue + Trueв своей интерактивной оболочке, чтобы посмотреть, что произойдет.В Python предусмотрены три логических оператора:
Operator Logical Operation andConjunction orDisjunction notNegation С помощью этих операторов вы можете создавать выражения, соединяя Логические выражения друг с другом, объекты друг с другом и даже логические выражения с объектами. Python использует английские слова для обозначения логических операторов. Эти слова являются ключевыми словами языка, поэтому вы не можете использовать их в качестве идентификаторов, не вызывая синтаксической ошибки.
В этом руководстве вы узнаете об операторе
notв Python, который реализует логическую операциюNOTили отрицание .Начало работы с оператором
notв PythonОператор
not- это логический оператор, который реализует отрицание в Python. Это унарный, что означает, что он принимает только один операнд. Операндом может быть логическое выражение или любой объект Python . Работают даже объекты, определенные пользователем. Задачаnotсостоит в том, чтобы перевернуть истинное значение своего операнда.Если вы примените
notк операнду, значение которого равноTrue, то в результате получитеFalse. Если вы применитеnotк ложному операнду, то получитеTrue:>>> not True False >>> not False Trueпредварительно> кодовый блок>Оператор
notотрицает истинностное значение своего операнда. Операнд true возвращаетFalse. Операнд false возвращаетTrue. Эти два утверждения раскрывают то, что обычно известно как таблица истинности изnot:
operandnot operandTrueFalseFalseTrueС помощью
notвы можете отменить значение истинности любого логического выражения или объекта. Эта функциональность оправдывает себя в нескольких ситуациях:
- Проверка невыполненных условий в контексте
ifинструкций иwhileциклов- Инвертирование истинного значения объекта или выражения
- Проверка, не находится ли значение в данном контейнере
- Проверка идентичности объекта
В этом руководстве вы найдете примеры, которые охватывают все эти варианты использования. Для начала вы узнаете, как оператор
notработает с логическими выражениями, а также с обычными объектами Python.Логическое выражение всегда возвращает логическое значение. В Python выражения такого типа возвращают
TrueилиFalse. Допустим, вы хотите проверить, является ли данная числовая переменная больше другой:>>> x = 2 >>> y = 5 >>> x > y False >>> not x > y Trueпредварительно> кодовый блок>Выражение
x > yвсегда возвращаетFalse, так что вы можете сказать, что это логическое выражение. Если вы поставитеnotперед этим выражением, то получите обратный результат,True.Примечание: Python вычисляет операторы в строгом порядке, обычно известном как приоритет операторов.
Например, Python сначала вычисляет математические операторы и операторы сравнения. Затем он вычисляет логические операторы, включая
not:>>> not True == False True >>> False == not True File "<stdin>", line 1 False == not True ^ SyntaxError: invalid syntax >>> False == (not True) Trueпредварительно> кодовый блок>В первом примере Python вычисляет выражение
True == False, а затем отрицает результат, вычисляяnot.Во втором примере Python сначала вычисляет оператор равенства (
==) и выдает значениеSyntaxError, потому что нет способа сравнитьFalseиnot. Вы можете заключить выражениеnot Trueв круглые скобки (()), чтобы устранить эту проблему. В этом кратком обновлении указано, что Python должен сначала вычислять заключенное в круглые скобки выражение.Среди логических операторов
notимеет более высокий приоритет, чем операторыandиor, которые имеют одинаковый приоритет.Вы также можете использовать
notс обычными объектами Python, такими как числа, строки, списки, кортежи, словари, наборы, определяемые пользователем объекты и т.д.:>>> # Use "not" with numeric values >>> not 0 True >>> not 42 False >>> not 0.0 True >>> not 42.0 False >>> not complex(0, 0) True >>> not complex(42, 1) False >>> # Use "not" with strings >>> not "" True >>> not "Hello" False >>> # Use "not" with other data types >>> not [] True >>> not [1, 2, 3] False >>> not {} True >>> not {"one": 1, "two": 2} Falseпредварительно> кодовый блок>В каждом примере
notотрицает истинностное значение своего операнда. Чтобы определить, является ли данный объект истинным или ложным, Python используетbool(),, который возвращаетTrueилиFalseв зависимости от значения истинности объекта под рукой.Эта встроенная функция внутренне использует следующие правила для определения истинного значения своих входных данных:
По умолчанию объект считается истинным, если только его класс не определяет либо
__bool__()метод, который возвращаетFalseили__len__()метод, который возвращает ноль при вызове с объектом. Вот большинство встроенных объектов, которые считаются ложными:
- константы, определенные как ложные:
NoneиFalse.- ноль любого числового типа:
0,0.0,0j,Decimal(0),Fraction(0, 1)- пустые последовательности и коллекции:
'',(),[],{},set(),range(0)( Источник)
Как только
notузнает истинное значение своего операнда, он возвращает противоположное логическое значение. Если значение объекта равноTrue, тоnotвозвращаетFalse. В противном случае он возвращаетTrue.Примечание: Всегда возвращающий
TrueилиFalseявляется важным отличиемnotот двух других логических операторов, которыеandоператор и операторor.Операторы
andиorвозвращают один из операндов в выражении, в то время как операторnotвсегда возвращает логическое значение:>>> 0 and 42 0 >>> True and False False >>> True and 42 > 27 True >>> 0 or 42 42 >>> True or False True >>> False or 42 < 27 False >>> not 0 True >>> not 42 False >>> not True Falseпредварительно> кодовый блок>Используя операторы
andиor, вы получаетеTrueилиFalseобратно из выражения, когда одно из этих значений явно является результатом вычисления операндов. В противном случае вы получите один из операндов в выражении. С другой стороны,notведет себя по-другому, возвращаяTrueилиFalseнезависимо от используемого операнда.Чтобы вести себя подобно оператору
andи операторуor, операторуnotпришлось бы создавать и возвращать новые объекты, что часто неоднозначно и не всегда просто. Например, что, если бы выражение типаnot "Hello"возвращало пустую строку ("")? Что бы вернуло выражение типаnot ""? Вот почему операторnotвсегда возвращаетTrueилиFalse.Теперь, когда вы знаете, как
notработает в Python, вы можете перейти к более конкретным вариантам использования этого логического оператора. В следующем разделе вы узнаете об использованииnotв логических контекстах.Использование оператора
notв логических контекстахКак и два других логических оператора, оператор
notособенно полезен в логических контекстах. В Python есть два оператора, которые определяют логические контексты:
ifинструкции позволяют выполнять условное выполнение и выполнять различные действия в зависимости от некоторых начальных условий.whileциклы позволяют выполнять условных итераций и запускать повторяющиеся задачи, пока выполняется заданное условие.Эти две структуры являются частью того, что вы бы назвали операторами потока управления. Они помогают вам определить путь выполнения программы. В случае с оператором
notвы можете использовать его для выбора действий, которые следует предпринять, если заданное условие не выполняется.
ifЗаявленияВы можете использовать оператор
notв оператореif, чтобы проверить, не выполнено ли заданное условие. Чтобы выполнить проверку оператораif, если что-то не произошло, вы можете поместить операторnotперед соответствующим условием. Поскольку операторnotвозвращает отрицательный результат, то значение true становитсяFalseи наоборот.Синтаксис оператора
ifс логическим операторомnotтаков:if not condition: # Do something...предварительно> кодовый блок>В этом примере
conditionможет быть логическим выражением или любым другим объектом Python, который имеет смысл. Например,conditionможет быть переменной, содержащей строку, список, словарь, набор и даже определенный пользователем объект.Если
conditionпринимает значение false, тоnotвозвращаетTrueи выполняется блок кодаif. Если значениеconditionравно true, тоnotвозвращаетFalseи блок кодаifне выполняется.Обычной ситуацией является использование предиката или логической функции в качестве
condition. Допустим, вы хотите проверить, является ли данное число простым, прежде чем выполнять дальнейшую обработку. В этом случае вы можете написать функциюis_prime():>>> import math >>> def is_prime(n): ... if n <= 1: ... return False ... for i in range(2, int(math.sqrt(n)) + 1): ... if n % i == 0: ... return False ... return True ... >>> # Work with prime numbers only >>> number = 3 >>> if is_prime(number): ... print(f"{number} is prime") ... 3 is primeпредварительно> кодовый блок>В этом примере
is_prime()принимает целое число в качестве аргумента и возвращаетTrue, если это простое число. В противном случае он возвращаетFalse.Вы также можете использовать эту функцию в отрицательном условном выражении, чтобы приблизиться к тем ситуациям, когда вы хотите работать только с составными числами:
>>> # Work with composite numbers only >>> number = 8 >>> if not is_prime(number): ... print(f"{number} is composite") ... 8 is compositeпредварительно> кодовый блок>Поскольку также возможно, что вам нужно работать только с составными числами, вы можете повторно использовать
is_prime(), объединив его с операторомnot, как вы это делали во втором примере.Другой распространенной ситуацией в программировании является определение того, находится ли число внутри определенного числового интервала. Чтобы определить, находится ли число
xв заданном интервале в Python, вы можете использовать операторandили соответствующим образом связать операторы сравнения:>>> x = 30 >>> # Use the "and" operator >>> if x >= 20 and x < 40: ... print(f"{x} is inside") ... 30 is inside >>> # Chain comparison operators >>> if 20 <= x < 40: ... print(f"{x} is inside") ... 30 is insideпредварительно> кодовый блок>В первом примере вы используете оператор
andдля создания составного логического выражения, которое проверяет, находится лиxмежду20и40. Во втором примере выполняется та же проверка, но с использованием связанных операторов, что является наилучшей практикой в Python.Примечание: В большинстве языков программирования выражение
20 <= x < 40не имеет смысла. Оно должно начинаться с вычисления20 <= x, что соответствует действительности. Следующим шагом было бы сравнить этот истинный результат с40, что не имеет особого смысла, поэтому выражение завершается ошибкой. В Python происходит нечто иное.Python внутренне переписывает выражение этого типа в эквивалентное
andвыражение, такое какx >= 20 and x < 40. Затем он выполняет фактическую оценку. Вот почему вы получаете правильный результат в приведенном выше примере.Вы также можете столкнуться с необходимостью проверить, не находится ли число за пределами целевого интервала. Для этого вы можете использовать оператор
or:>>> x = 50 >>> if x < 20 or x >= 40: ... print(f"{x} is outside") ... 50 is outsideпредварительно> кодовый блок>Это выражение
orпозволяет проверить, находится лиxза пределами интервала от20до40. Однако, если у вас уже есть рабочее выражение, которое успешно проверяет, находится ли число в заданном интервале, вы можете повторно использовать это выражение для проверки противоположного условия:>>> x = 50 >>> # Reuse the chained logic >>> if not (20 <= x < 40): ... print(f"{x} is outside") 50 is outsideпредварительно> кодовый блок>В этом примере вы повторно используете выражение, которое вы изначально закодировали, чтобы определить, находится ли число внутри целевого интервала. Используя
notперед выражением, вы проверяете, не находится лиxза пределами интервала от20до40.
whileПетлиВторой логический контекст, в котором вы можете использовать оператор
not, находится в ваших циклахwhile. Эти циклы повторяются до тех пор, пока не будет выполнено заданное условие или пока вы не выйдете из цикла, используяbreak, usingreturnили вызывая исключение. Использованиеnotв циклеwhileпозволяет выполнять итерацию, пока заданное условие не будет выполнено.Допустим, вы хотите закодировать небольшую игру на Python, чтобы угадать случайное число от 1 до 10. В качестве первого шага вы решаете использовать
input()для записи имени пользователя. Поскольку имя является обязательным условием для работы в остальной части игры, вам нужно убедиться, что вы его получили. Для этого вы можете использовать циклwhile, который запрашивает имя пользователя до тех пор, пока пользователь не введет действительное имя.Запустите свой редактор кода или IDE и создайте новый
guess.pyфайл для своей игры. Затем добавьте следующий код:1# guess.py 2 3from random import randint 4 5secret = randint(1, 10) 6 7print("Welcome!") 8 9name = "" 10while not name: 11 name = input("Enter your name: ").strip()предварительно> кодовый блок>В
guess.pyсначала необходимо импортироватьrandint()изrandom. Эта функция позволяет генерировать случайные целые числа в заданном диапазоне. В данном случае вы генерируете числа от1до10, включая оба. Затем вы печатаете приветственное сообщение для пользователя.Цикл
whileв строке 10 повторяется до тех пор, пока пользователь не введет действительное имя. Если пользователь не указывает имя, просто нажимая Введите, тоinput()возвращает пустую строку (""), и цикл выполняется снова, потому чтоnot ""возвращаетTrue.Теперь вы можете продолжить свою игру, написав код для обеспечения функции угадывания. Вы можете сделать это самостоятельно или развернуть поле ниже, чтобы ознакомиться с возможной реализацией.
Во второй части игры пользователь должен ввести число от 1 до 10 в качестве своего предположения. Игра должна сравнить введенное пользователем значение с текущим секретным номером и предпринять соответствующие действия. Вот возможная реализация:
while True: user_input = input("Guess a number between 1 and 10: ") if not user_input.isdigit(): user_input = input("Please enter a valid number: ") guess = int(user_input) if guess == secret: print(f"Congrats {name}! You win!") break elif guess > secret: print("The secret number is lower than that...") else: print("The secret number is greater than that...")предварительно> кодовый блок>Вы используете бесконечный цикл
while, чтобы принимать вводимые пользователем данные до тех пор, пока он не угадает числоsecret. На каждой итерации вы проверяете, совпадают ли входные данные сsecret, и предоставляете подсказки пользователю в соответствии с результатом. Продолжайте и попробуйте!В качестве упражнения вы можете ограничить количество попыток, прежде чем пользователь проиграет игру. В данном случае хорошим вариантом могут быть три попытки.
Каким был ваш опыт работы с этой небольшой игрой? Чтобы узнать больше о программировании игр на Python, ознакомьтесь с PyGame: Руководство по программированию игр на Python.
Теперь, когда вы знаете, как использовать
notв логических контекстах, пришло время узнать об использованииnotв не логических контекстах. Это то, что вы будете делать в следующем разделе.Использование оператора
notв не логических контекстахПоскольку оператор
notтакже может принимать обычные объекты в качестве операнда, вы также можете использовать его в не логических контекстах. Другими словами, вы можете использовать его вне инструкцииifили циклаwhile. Можно утверждать, что наиболее распространенным вариантом использования оператораnotв не логическом контексте является инвертирование истинного значения данной переменной.Предположим, вам нужно выполнить два разных действия в цикле поочередно. В этом случае вы можете использовать переменную flag для переключения действий на каждой итерации:
>>> toggle = False >>> for _ in range(4): ... print(f"toggle is {toggle}") ... if toggle: ... # Do something... ... toggle = False ... else: ... # Do something else... ... toggle = True ... toggle is False toggle is True toggle is False toggle is Trueпредварительно> кодовый блок>Каждый раз, когда выполняется этот цикл, вы проверяете истинностное значение
toggle, чтобы решить, какой курс действий предпринять. В конце каждого блока кода вы меняете значениеtoggle, чтобы можно было выполнить альтернативное действие на следующей итерации. Изменение значенияtoggleтребует от вас повторного выполнения аналогичной логики дважды, что может привести к ошибкам.Вы можете использовать оператор
not, чтобы преодолеть этот недостаток и сделать ваш код более чистым и безопасным:>>> toggle = False >>> for _ in range(4): ... print(f"toggle is {toggle}") ... if toggle: ... pass # Do something... ... else: ... pass # Do something else... ... toggle = not toggle ... toggle is False toggle is True toggle is False toggle is Trueпредварительно> кодовый блок>Теперь выделенная строка изменяет значение
toggleмеждуTrueиFalseс помощью оператораnot. Этот код более чистый, менее повторяющийся и менее подверженный ошибкам, чем в примере, который вы написали ранее.С использованием функционального оператора
notВ отличие от оператора
andи оператораor, операторnotимеет эквивалентную функциональную реализацию в модулеoperator. Вызывается функцияnot_(). Она принимает объект в качестве аргумента и возвращает тот же результат, что и эквивалентное выражениеnot obj:>>> from operator import not_ >>> # Use not_() with numeric values >>> not_(0) True >>> not_(42) False >>> not_(0.0) True >>> not_(42.0) False >>> not_(complex(0, 0)) True >>> not_(complex(42, 1)) False >>> # Use not_() with strings >>> not_("") True >>> not_("Hello") False >>> # Use not_() with other data types >>> not_([]) True >>> not_([1, 2, 3]) False >>> not_({}) True >>> not_({"one": 1, "two": 2}) Falseпредварительно> кодовый блок>Чтобы использовать
not_(), вам сначала нужно импортировать его изoperator. Затем вы можете использовать функцию с любым объектом или выражением Python в качестве аргумента. Результат будет таким же, как при использовании эквивалентного выраженияnot.Примечание: В Python также есть функции
and_()иor_(). Однако они отражают соответствующие им побитовые операторы, а не логические.Функции
and_()иor_()также работают с логическими аргументами:>>> from operator import and_, or_ >>> and_(False, False) False >>> and_(False, True) False >>> and_(True, False) False >>> and_(True, True) True >>> or_(False, False) False >>> or_(False, True) True >>> or_(True, False) True >>> or_(True, True) Trueпредварительно> кодовый блок>В этих примерах вы используете
and_()иor_()сTrueиFalseв качестве аргументов. Обратите внимание, что результат выполнения выражений соответствует таблице истинности операторовandиnotсоответственно.Использование функции
not_()вместо оператораnotудобно при работе с функциями более высокого порядка, такими какmap(),filter(), и тому подобное. Вот пример, в котором используется функцияnot_()вместе сsorted()для сортировки списка сотрудников путем размещения пустых имен сотрудников в конце списка:>>> from operator import not_ >>> employees = ["John", "", "", "Jane", "Bob", "", "Linda", ""] >>> sorted(employees, key=not_) ['John', 'Jane', 'Bob', 'Linda', '', '', '', '']предварительно> кодовый блок>В этом примере у вас есть начальный список с именем
employees, который содержит несколько имен. Некоторые из этих имен являются пустыми строками. Вызовsorted()используетnot_()в качестве функцииkeyдля создания нового списка, который сортирует сотрудников, перемещая пустые имена в конец списка.Работа с оператором Python
not: Лучшие практикиКогда вы работаете с оператором
not, вам следует придерживаться нескольких рекомендаций, которые могут сделать ваш код более читабельным, чистым и основанным на Python. В этом разделе вы узнаете о некоторых рекомендациях, связанных с использованием оператораnotв контексте членства и идентификации тесты.Вы также узнаете, как негативная логика может повлиять на читаемость вашего кода. Наконец, вы познакомитесь с некоторыми полезными приемами, которые помогут вам избежать ненужной негативной логики, что является передовой практикой программирования.
Проверка на членство
Тесты на принадлежность обычно полезны, когда вы определяете, существует ли определенный объект в данном типе данных контейнера, таком как список, кортеж, набор или словарь. Для выполнения такого рода тестов на Python вы можете использовать оператор
in:>>> numbers = [1, 2, 3, 4] >>> 3 in numbers True >>> 5 in numbers Falseпредварительно> кодовый блок>Оператор
inвозвращаетTrue, если объект с левой стороны находится в контейнере с правой стороны выражения. В противном случае он возвращаетсяFalse.Иногда вам может понадобиться проверить, находится ли объект не в данном контейнере. Как это можно сделать? Ответом на этот вопрос является оператор
not.В Python есть два разных синтаксиса для проверки того, находится ли объект не в данном контейнере. Сообщество Python считает первый синтаксис плохой практикой, поскольку его трудно читать. Второй синтаксис читается как обычный английский:
>>> # Bad practice >>> not "c" in ["a", "b", "c"] False >>> # Best practice >>> "c" not in ["a", "b", "c"] Falseпредварительно> кодовый блок>Первый пример работает. Однако из-за начального
notчитателю, читающему ваш код, сложно определить, работает ли оператор над"c"или над целым выражением,"c" in ["a", "b", "c"]. Эта деталь затрудняет чтение и понимание выражения.Второй пример гораздо понятнее. В документации по Python синтаксис во втором примере называется оператором
not in. Первый синтаксис может быть обычной практикой для людей, начинающих работать с Python.Теперь пришло время вернуться к примерам, в которых вы проверяли, находится ли число внутри числового интервала или за его пределами. Если вы работаете только с целыми числами, то оператор
not inпредоставляет более удобный способ выполнения этой проверки:>>> x = 30 >>> # Between 20 and 40 >>> x in range(20, 41) True >>> # Outside 20 and 40 >>> x not in range(20, 41) Falseпредварительно> кодовый блок>В первом примере проверяется, находится ли
xвнутри диапазона от20до40или интервала. Обратите внимание, что вы используете41в качестве второго аргумента дляrange()включения40в проверку.Примечание: Знаете ли вы, что тесты на членство с помощью
range()очень эффективны? Узнайте больше в разделе Почему тесты членства в Python проходят так быстро дляrange()?.Когда вы работаете с целыми числами, эта небольшая хитрость в отношении того, где именно вы используете оператор
not, может существенно повлиять на читаемость кода.Проверьте идентичность объектов
Еще одним распространенным требованием при написании кода на Python является проверка идентификатора объекта. Вы можете определить идентификатор объекта, используя
id(). Эта встроенная функция принимает объект в качестве аргумента и возвращает целое число, которое однозначно идентифицирует данный объект. Это число обозначает идентификатор объекта.Практичным способом проверки подлинности является использование оператора
is, который довольно полезен в некоторых условных операторах. Например, одним из наиболее распространенных вариантов использования оператораisявляется проверка того, является ли данный объектNone:>>> obj = None >>> obj is None Trueпредварительно> кодовый блок>Оператор
isвозвращаетTrue, если левый операнд имеет тот же идентификатор, что и правый. В противном случае он возвращаетFalse.В этом случае возникает вопрос: как проверить, не совпадают ли идентификаторы двух объектов? Опять же, вы можете использовать два разных синтаксиса:
>>> obj = None >>> # Bad practice >>> not obj is None False >>> # Best practice >>> obj is not None Falseпредварительно> кодовый блок>В обоих примерах вы проверяете, имеет ли
objтот же идентификатор, что и объектNone. Первый синтаксис несколько сложен для чтения и не является питоническим. Синтаксисis notнамного более явный и понятный. В документации по Python этот синтаксис называется операторомis notи рекомендуется использовать его в качестве наилучшей практики.Избегайте ненужной негативной логики
Оператор
notпозволяет изменить значение или логику данного условия или объекта на противоположную. В программировании такого рода функции известны как отрицательная логика или отрицание.Правильно использовать негативную логику может быть непросто, потому что эту логику трудно осмыслить и понять, не говоря уже о том, что ее трудно объяснить. В целом, негативная логика предполагает более высокую когнитивную нагрузку, чем позитивная логика. Поэтому, когда это возможно, вы должны использовать позитивные формулировки.
Вот пример функции
custom_abs(), которая использует отрицательное условие для возврата абсолютного значения входного числа:>>> def custom_abs(number): ... if not number < 0: ... return number ... return -number ... >>> custom_abs(42) 42 >>> custom_abs(-42) 42предварительно> кодовый блок>Эта функция принимает число в качестве аргумента и возвращает его абсолютное значение. Вы можете добиться того же результата, используя позитивную логику с минимальными изменениями:
>>> def custom_abs(number): ... if number < 0: ... return -number ... return number ... >>> custom_abs(42) 42 >>> custom_abs(-42) 42предварительно> кодовый блок>Вот и все! Ваш
custom_abs()теперь использует позитивную логику. Она стала более простой и понятной. Чтобы получить этот результат, вы удалилиnotи переместили отрицательный знак (-), чтобы изменить входное значениеnumber, когда оно меньше, чем0.Примечание: В Python предусмотрена встроенная функция с именем
abs(), которая возвращает абсолютное значение числового параметра . Цельcustom_abs()- облегчить изложение темы.Вы можете найти много похожих примеров, в которых изменение оператора сравнения может устранить ненужную негативную логику. Допустим, вы хотите проверить, равна ли переменная
xзаданному значению. Вы можете использовать два разных подхода:>>> x = 27 >>> # Use negative logic >>> if not x == 42: ... print("not 42") ... not 42 >>> # Use positive logic >>> if x != 42: ... print("not 42") ... not 42предварительно> кодовый блок>В этом примере вы удаляете оператор
not, изменяя оператор сравнения с равного (==) на другой (!=). Во многих случаях вы можете избежать негативной логики, выразив условие по-другому с помощью соответствующего оператора отношения или равенства.Однако иногда негативная логика может сэкономить ваше время и сделать ваш код более лаконичным. Предположим, вам нужен условный оператор для инициализации данного файла, который не существует в файловой системе. В этом случае вы можете использовать
not, чтобы проверить, не существует ли файл:from pathlib import Path file = Path("/some/path/config.ini") if not file.exists(): # Initialize the file here...предварительно> кодовый блок>Оператор
notпозволяет инвертировать результат вызова.exists()наfile. Если.exists()возвращаетFalse, то вам необходимо инициализировать файл. Однако при ложном условии блок кодаifне запускается. Вот почему вам нужен операторnot, чтобы инвертировать результат.exists().Примечание: В приведенном выше примере для обработки путей к файлам используется
pathlibиз стандартной библиотеки . Чтобы глубже погрузиться в эту классную библиотеку, ознакомьтесь с Модулем pathlib для Python: Укрощение файловой системы.Теперь подумайте, как превратить это отрицательное условие в положительное. До этого момента вам не нужно было выполнять никаких действий, если файл существует, поэтому вы можете подумать об использовании инструкции
passи дополнительного предложенияelseдля обработки инициализации файла:if file.exists(): pass # YAGNI else: # Initialize the file here...предварительно> кодовый блок>Несмотря на то, что этот код работает, он нарушает принцип “Он вам не понадобится” (YAGNI). Это особенно решительная попытка устранить негативную логику.
Идея этого примера состоит в том, чтобы показать, что иногда использование негативной логики является правильным решением. Итак, вам следует рассмотреть вашу конкретную проблему и выбрать подходящее решение. Хорошим практическим правилом было бы избегать негативной логики, насколько это возможно, не пытаясь избежать ее любой ценой.
Наконец, вам следует обратить особое внимание на то, чтобы избежать двойного отрицания. Допустим, у вас есть константа с именем
NON_NUMERIC, которая содержит символы, которые Python не может преобразовать в числа, такие как буквы и знаки препинания. Семантически эта константа сама по себе подразумевает отрицание.Теперь предположим, что вам нужно проверить, является ли данный символ числовым значением. Поскольку у вас уже есть
NON_NUMERIC, вы можете подумать о том, чтобы использоватьnotдля проверки условия:if char not in NON_NUMERIC: number = float(char) # Do further computations...предварительно> кодовый блок>Этот код выглядит странно, и вы, вероятно, никогда не будете делать ничего подобного в своей карьере программиста. Однако иногда выполнение чего-либо подобного может быть заманчивым, как, например, в примере выше.
В этом примере используется двойное отрицание. Оно опирается на
NON_NUMERIC, а также наnot, что затрудняет усвоение и понимание. Если вы когда-нибудь доберетесь до такого фрагмента кода, как этот, найдите минутку, чтобы попробовать написать его позитивно или, по крайней мере, попытаться убрать один слой отрицания.Заключение
notв Python - это логический оператор, который инвертирует значение истинности логических выражений и объектов. Это удобно, когда вам нужно проверить наличие невыполненных условий в условных операторах и циклахwhile.Вы можете использовать оператор
not, который поможет вам определить последовательность действий в вашей программе. Вы также можете использовать его для инвертирования значений логических переменных в вашем коде.В этом руководстве вы узнали, как:
- Работа с оператором Python
not- Используйте оператор
notв логических и не логических контекстах- Используйте
operator.not_()для выполнения логического отрицания в функциональном стиле- Избегайте ненужной негативной логики в вашем коде, когда это возможно
С этой целью вы написали несколько практических примеров, которые помогли вам понять некоторые основные варианты использования оператора
<статус завершения article-slug="python-не-оператор" class="btn-group mb-0" data-api-article-bookmark-url="/api/v1/articles/python-не-оператор/закладка/" data-api-article-завершение-статус-url="/api/v1/articles/python-not-operator/completion_status/"> статус завершения> <кнопка поделиться bluesky-text="Интересная статья на #Python от @realpython.com :" email-body="Ознакомьтесь с этой статьей о Python:%0A%0, в которой используется логический оператор "not" в Python"" email-subject="Статья о Python для вас" twitter-text="Интересная статья #Python статья от @realpython:" url="https://realpython.com/python-not-operator /" url-title='Использование логического оператора "not" в Python'> кнопка поделиться>not, так что теперь вы лучше подготовлены к его использованию в своем собственном коде.Смотрите сейчас, к этому уроку прилагается соответствующий видеокурс, созданный командой Real Python. Посмотрите его вместе с письменным руководством, чтобы углубить свое понимание: Используя оператор Python not
Back to Top