8. Errors and Exceptions¶
Until now error messages haven’t been more than mentioned, but if you have tried out the examples you have probably seen some. There are (at least) two distinguishable kinds of errors: syntax errors and exceptions.
8.1. Syntax Errors¶
Syntax errors, also known as parsing errors, are perhaps the most common kind of complaint you get while you are still learning Python:
The parser repeats the offending line and displays a little ‘arrow’ pointing at the earliest point in the line where the error was detected. The error is caused by (or at least detected at) the token preceding the arrow: in the example, the error is detected at the function print() , since a colon ( ‘:’ ) is missing before it. File name and line number are printed so you know where to look in case the input came from a script.
8.2. Exceptions¶
Even if a statement or expression is syntactically correct, it may cause an error when an attempt is made to execute it. Errors detected during execution are called exceptions and are not unconditionally fatal: you will soon learn how to handle them in Python programs. Most exceptions are not handled by programs, however, and result in error messages as shown here:
The last line of the error message indicates what happened. Exceptions come in different types, and the type is printed as part of the message: the types in the example are ZeroDivisionError , NameError and TypeError . The string printed as the exception type is the name of the built-in exception that occurred. This is true for all built-in exceptions, but need not be true for user-defined exceptions (although it is a useful convention). Standard exception names are built-in identifiers (not reserved keywords).
The rest of the line provides detail based on the type of exception and what caused it.
The preceding part of the error message shows the context where the exception occurred, in the form of a stack traceback. In general it contains a stack traceback listing source lines; however, it will not display lines read from standard input.
Built-in Exceptions lists the built-in exceptions and their meanings.
8.3. Handling Exceptions¶
It is possible to write programs that handle selected exceptions. Look at the following example, which asks the user for input until a valid integer has been entered, but allows the user to interrupt the program (using Control — C or whatever the operating system supports); note that a user-generated interruption is signalled by raising the KeyboardInterrupt exception.
The try statement works as follows.
First, the try clause (the statement(s) between the try and except keywords) is executed.
If no exception occurs, the except clause is skipped and execution of the try statement is finished.
If an exception occurs during execution of the try clause, the rest of the clause is skipped. Then, if its type matches the exception named after the except keyword, the except clause is executed, and then execution continues after the try/except block.
If an exception occurs which does not match the exception named in the except clause, it is passed on to outer try statements; if no handler is found, it is an unhandled exception and execution stops with a message as shown above.
A try statement may have more than one except clause, to specify handlers for different exceptions. At most one handler will be executed. Handlers only handle exceptions that occur in the corresponding try clause, not in other handlers of the same try statement. An except clause may name multiple exceptions as a parenthesized tuple, for example:
A class in an except clause is compatible with an exception if it is the same class or a base class thereof (but not the other way around — an except clause listing a derived class is not compatible with a base class). For example, the following code will print B, C, D in that order:
Note that if the except clauses were reversed (with except B first), it would have printed B, B, B — the first matching except clause is triggered.
When an exception occurs, it may have associated values, also known as the exception’s arguments. The presence and types of the arguments depend on the exception type.
The except clause may specify a variable after the exception name. The variable is bound to the exception instance which typically has an args attribute that stores the arguments. For convenience, builtin exception types define __str__() to print all the arguments without explicitly accessing .args .
The exception’s __str__() output is printed as the last part (‘detail’) of the message for unhandled exceptions.
BaseException is the common base class of all exceptions. One of its subclasses, Exception , is the base class of all the non-fatal exceptions. Exceptions which are not subclasses of Exception are not typically handled, because they are used to indicate that the program should terminate. They include SystemExit which is raised by sys.exit() and KeyboardInterrupt which is raised when a user wishes to interrupt the program.
Exception can be used as a wildcard that catches (almost) everything. However, it is good practice to be as specific as possible with the types of exceptions that we intend to handle, and to allow any unexpected exceptions to propagate on.
The most common pattern for handling Exception is to print or log the exception and then re-raise it (allowing a caller to handle the exception as well):
The try … except statement has an optional else clause, which, when present, must follow all except clauses. It is useful for code that must be executed if the try clause does not raise an exception. For example:
The use of the else clause is better than adding additional code to the try clause because it avoids accidentally catching an exception that wasn’t raised by the code being protected by the try … except statement.
Exception handlers do not handle only exceptions that occur immediately in the try clause, but also those that occur inside functions that are called (even indirectly) in the try clause. For example:
8.4. Raising Exceptions¶
The raise statement allows the programmer to force a specified exception to occur. For example:
The sole argument to raise indicates the exception to be raised. This must be either an exception instance or an exception class (a class that derives from BaseException , such as Exception or one of its subclasses). If an exception class is passed, it will be implicitly instantiated by calling its constructor with no arguments:
If you need to determine whether an exception was raised but don’t intend to handle it, a simpler form of the raise statement allows you to re-raise the exception:
8.5. Exception Chaining¶
If an unhandled exception occurs inside an except section, it will have the exception being handled attached to it and included in the error message:
To indicate that an exception is a direct consequence of another, the raise statement allows an optional from clause:
This can be useful when you are transforming exceptions. For example:
It also allows disabling automatic exception chaining using the from None idiom:
For more information about chaining mechanics, see Built-in Exceptions .
8.6. User-defined Exceptions¶
Programs may name their own exceptions by creating a new exception class (see Classes for more about Python classes). Exceptions should typically be derived from the Exception class, either directly or indirectly.
Exception classes can be defined which do anything any other class can do, but are usually kept simple, often only offering a number of attributes that allow information about the error to be extracted by handlers for the exception.
Most exceptions are defined with names that end in “Error”, similar to the naming of the standard exceptions.
Many standard modules define their own exceptions to report errors that may occur in functions they define.
8.7. Defining Clean-up Actions¶
The try statement has another optional clause which is intended to define clean-up actions that must be executed under all circumstances. For example:
If a finally clause is present, the finally clause will execute as the last task before the try statement completes. The finally clause runs whether or not the try statement produces an exception. The following points discuss more complex cases when an exception occurs:
If an exception occurs during execution of the try clause, the exception may be handled by an except clause. If the exception is not handled by an except clause, the exception is re-raised after the finally clause has been executed.
An exception could occur during execution of an except or else clause. Again, the exception is re-raised after the finally clause has been executed.
If the finally clause executes a break , continue or return statement, exceptions are not re-raised.
If the try statement reaches a break , continue or return statement, the finally clause will execute just prior to the break , continue or return statement’s execution.
If a finally clause includes a return statement, the returned value will be the one from the finally clause’s return statement, not the value from the try clause’s return statement.
A more complicated example:
As you can see, the finally clause is executed in any event. The TypeError raised by dividing two strings is not handled by the except clause and therefore re-raised after the finally clause has been executed.
In real world applications, the finally clause is useful for releasing external resources (such as files or network connections), regardless of whether the use of the resource was successful.
8.8. Predefined Clean-up Actions¶
Some objects define standard clean-up actions to be undertaken when the object is no longer needed, regardless of whether or not the operation using the object succeeded or failed. Look at the following example, which tries to open a file and print its contents to the screen.
The problem with this code is that it leaves the file open for an indeterminate amount of time after this part of the code has finished executing. This is not an issue in simple scripts, but can be a problem for larger applications. The with statement allows objects like files to be used in a way that ensures they are always cleaned up promptly and correctly.
After the statement is executed, the file f is always closed, even if a problem was encountered while processing the lines. Objects which, like files, provide predefined clean-up actions will indicate this in their documentation.
8.9. Raising and Handling Multiple Unrelated Exceptions¶
There are situations where it is necessary to report several exceptions that have occurred. This is often the case in concurrency frameworks, when several tasks may have failed in parallel, but there are also other use cases where it is desirable to continue execution and collect multiple errors rather than raise the first exception.
The builtin ExceptionGroup wraps a list of exception instances so that they can be raised together. It is an exception itself, so it can be caught like any other exception.
By using except* instead of except , we can selectively handle only the exceptions in the group that match a certain type. In the following example, which shows a nested exception group, each except* clause extracts from the group exceptions of a certain type while letting all other exceptions propagate to other clauses and eventually to be reraised.
Note that the exceptions nested in an exception group must be instances, not types. This is because in practice the exceptions would typically be ones that have already been raised and caught by the program, along the following pattern:
8.10. Enriching Exceptions with Notes¶
When an exception is created in order to be raised, it is usually initialized with information that describes the error that has occurred. There are cases where it is useful to add information after the exception was caught. For this purpose, exceptions have a method add_note(note) that accepts a string and adds it to the exception’s notes list. The standard traceback rendering includes all notes, in the order they were added, after the exception.
For example, when collecting exceptions into an exception group, we may want to add context information for the individual errors. In the following each exception in the group has a note indicating when this error has occurred.
Интерпретация Python. Выполнение условного кода
Когда я представил концепцию переменных в Python, я говорил о том, как она позволяет вам сделать более абстрактным ваш сценарий, ваш язык программирования, ваш код. Вы можете написать один-единственный бит кода, но в зависимости от значения в этих переменных он может работать по-разному каждый раз, когда этот код выполняется. Условные выражения попадают в ту же категорию, что и способы обобщения вашего кода.
Условные выражения реализуются с помощью так называемого if утверждения. Утверждение if позволяет определить строку кода или блок кода, который выполняется только при выполнении определенного условия.
Если это условие основано на значении переменной, которая подгружается из некоторого внешнего источника данных, ваш код может никогда не работать. Или он может иногда работать. Или он всегда может работать. Вы не узнаете наверняка. Вы определяете код, который будет запускаться только при выполнении этого условия. И поэтому каждый раз, когда этот код выполняется, вы не знаете, запустится он или нет.
Утверждение if в Python читается почти так же, как и в английском языке. Вы вводите ключевое слово if и после определяете то, что мы называем “condition” (условие). Condition — это просто утверждение, которое оценивается как истинное (true) или ложное (false).
Если условие оценивается как true, то будет выполнен весь код, находящийся под if. Если условие оценивается как false, то код будет искать дополнительный (необязательный) элемент else. И если он его найдет, то запустит код, находящийся под ним.
Написать условное выражение довольно просто. Обычно это просто переменная, за которой следует if, за которым следует другая переменная. Если я скажу, что x >= y, то >= будет моим условием, знаком вопроса ? Выражение x >= y вернет либо истину, либо ложь, что, в свою очередь, проинформирует if и скажет ему, что делать.
Есть ряд различных условных утверждений:
== — двойной знак равенства, который задает вопрос: равны ли эти два значения?
>, >= — знак больше, или больше или равно.
<,<= — знак меньше, или меньше или равно.
Вы также можете сказать «не равно» двумя разными способами:
<> — знак меньше и больше.
!= — восклицательный знак и равно.
Есть способ объединения утверждений if вместе, создания длинного списка операторов if. Вы можете объединить несколько утверждений if вместе с помощью так называемого elif, E-L-I-F, что означает yes, else if. Когда вы используете команду elif, вместо того, чтобы писать else, вы пишете elif, за которым следует другое условие. Это выглядит примерно так:
У нас здесь есть начальное if и ниже код, который он будет запускать, если условие истинно. Если это не так, он проверит следующее условие после elif и запустит код под ним, если оно истинно.
Нет ограничений на количество elif, которые вы можете связать вместе. Таким образом, у вас может быть длинный список elif. В конце, если хотите — опять же, необязательно — это утверждение else.
Итак, если ни одно из утверждений не равно true, тогда оператор else будет выполняться. Это может выглядеть как switch case, о котором вы слышали в других языках программирования (C или Java). В Python нет switch case. Вы должны использовать if, elif, чтобы реализовать эту функцию.
Теперь давайте посмотрим на это в коде.
Здесь я просто собираю значение от пользователя с помощью функции ввода. После я могу сказать, если направление равно n, то <. >.
Это очень распространенная структура. Компьютер задаст вам вопрос в каком направлении вы хотите идти. И в зависимости от вашего ответа выведет разные print. Верный путь здесь только один и это North.
Запустим и проверим.
Если мы хотим обрабатывать все эти направления, то нам нужно стереть else и заменил его серией if, верно?
Мы могли бы вставить это в большой loop, сделать из них кучу различных вариантов и, если бы захотели, создали себе симпатичную маленькую приключенческую игру.
Но одна, возможно, не столь очевидная неэффективность здесь заключается в том, что каждый раз, когда этот код запускается, он будет проверять все эти if. Каждый if будет запускаться каждый раз.
Нам не нужно проверять это еще три раза. Тут-то и пригодится elif.
При использовании elif, когда программа обнаруживает, что одно из этих утверждений if является истинным, то она не будет проверять остальные утверждения else и elif.
В сочетании с переменными и с чтением внешнего ввода условные утверждения позволят вам писать очень и очень гибкий код. Каждый раз, когда этот код будет запускается, то он может делать разные вещи, что на самом деле составляет основу возможностей программирования.
Все операторы Python. Синтаксис и примеры кода
Оператор – один из ключевых терминов языка Python. Они бывают разными: арифметическими, логическими и так далее. Они нужны для того, чтобы выполнять определенное действие с информацией, которая введена пользователем или возвращена другой функцией. Сегодня мы подробно рассмотрим, какие бывают операторы в языке Python и продемонстрируем примеры их использования.
Что такое оператор?
Под оператором в любом языке программирования подразумевают символ, который выполняет определенную операцию с частями информации – переменными или значениями. Такие данные называются операндами.
В Python есть 7 базовых типов операторов:
- Арифметические. Предназначены для выполнения стандартных операций типа сложения, вычитания, умножения или деления. Также есть ряд других арифметических операторов, которые будут рассмотрены далее.
- Операторы сравнения. Они берут операнд 1, операнд 2 (и так далее) и сравнивают их между собой. Например, этот оператор может сказать, является ли первая переменная больше второй, или же они равны и так далее.
- Операторы присваивания. Один из самых часто используемых типов операторов в Python. С его помощью осуществляется целый комплекс операций как самых простых (присваивание значения переменной), так и более сложных (возврат вывода функции в переменную).
- Логические операторы. С их помощью программист может соединить несколько условий, или сравнивать их между собой по логическому признаку.
- Операторы принадлежности. Выполняют простую проверку, относится ли конкретное значение определенному объекту (например, кортежу или списку).
- Операторы тождественности. С помощью этих операторов также выполняется сравнение операнд на предмет того, являются ли они одинаковыми. Но это немного отличается от операторов сравнения, поскольку проверка выполняется на предмет того, занимают ли они одно и то же место в памяти.
- Битовые. Эти операторы во многом работают так же, как другие, только выполняют операции по битам.
А теперь перейдем к рассмотрению каждого из этих типов операторов более подробно.
Арифметические операторы
Самые классические арифметические операторы – это сложение, вычитание, умножение и деление. Также рассмотрим ряд других, которые также выполняют арифметические действия.
Сложение . Соответствует математическому знаку +. Выполняет стандартную арифметическую операцию сложения. Синтаксис функции такой же, как и в математике: операнд 1 + операнд 2.
Вычитание . Выполняет стандартную арифметическую операцию вычитания. Первый операнд – это первое число, а второй – это второе число соответственно. Сам оператор выглядит точно так же, как и математический знак минуса.
Умножение. Умножает первое число на такое количество раз, которое указано во втором числе.
Также в качестве операнд, как и во всех остальных случаях, могут использоваться переменные . В этом случае осуществляется умножение переменной 1 на переменную 2.
Деление . Последовательность действий такая же самая, как и с умножением: сначала идет операнд 1, потом знак деления (/), а потом – операнд 2.
Возведение в степень . Берет число 1 и возводит в степень числа 2.
Деление без остатка. Все мы знаем, что после деления может оставаться остаток, если не получается разделить число на другое число непосредственно. С помощью этого оператора мы можем получить целое число, если разделить напрямую не получается. Например.
Деление по модулю . Выполняет похожую операцию на предыдущий пример, только возвращает как раз остаток. Этот оператор – знак процента, который находится между операндами. Например:
Операторы сравнения
С помощью операторов сравнения, как мы уже поняли, мы сравниваем между собой несколько операндов. Приведем операторы сравнения и примеры их использования.
Меньше. Соответствует математическому знаку «меньше». С его помощью программа сравнивает два значения. Если первое оказывается меньше второго, то выдает логическое значение True .
Больше . Этот оператор выполняет ту же самую операцию. Но возвращает значение True только в том случае, если первый операнд больше второго. То есть, противоположный предыдущему оператор.
Меньше или равно . Проверяет два условия:
- Левая часть меньше правой, или нет?
- Являются ли левая и правая части одинаковыми.
Если да, она возвращает True . То есть, должно соблюдаться или первое условие или второе.
В этом примере мы видим, что число 7 равняется числу 7. Соответственно, программа выводит результат «истина». Ничего удивительного!
Больше или равно . Противоположный предыдущему оператор, возвращающий значение «истина» при соблюдении одного из этих условий:
- Два операнда являются одинаковыми.
- Первый операнд больше второго.
Синтаксис такой же самый, только вместо знака < используется знак >. Приведем пример для наглядности.
Равно. В Python знак «равно» отличается от математического, поскольку последний выглядит так же, как оператор присваивания, о котором поговорим немного позже. В Python этот оператор выглядит, как два знака равно, которые идут друг за другом.
Проверка очевидна: этот оператор возвращает значение «истина» в случае, если оба операнда являются одинаковыми. При этом 1 и 0 могут выполнять роль логических операторов. То есть, их можно сравнивать между собой.
Давайте приведем несколько примеров, чтобы было более понятно, как этот оператор работает с различными операндами. Сначала пишется строка кода, а сразу вслед за ней – вывод.
Не равно . Этот арифметический символ также не выглядит, как зачеркнутый знак равно, как в математике. Этот оператор состоит из двух частей – восклицательного знака и математического знака «равно». То есть, он выглядит, как !=.
Полностью противоположный оператору «равно» символ. Если этот оператор обнаруживает, что операнды одинаковые, он возвращает значение «ложь», а не «истина», как в случае с оператором равенства.
Раньше была еще одна версия этого оператора – <>. Но сейчас она не используется, поскольку была убрана в Python третьей версии.
Операторы присваивания
Теперь перейдем к рассмотрению операторов присваивания. Они предназначены для того, чтобы передавать переменной определенные значения как принадлежащие другим переменным, так и появившиеся вследствие их обработки. Операторы присваивания нужны еще и для того, чтобы назначать переменным объекты, с которыми можно дальше выполнять определенные действия.
Таким образом, спектр применений операторов этого типа довольно обширный.
Присваивание . Выглядит, как математический знак «равно». Это классический оператор, типичный пример применения которого – присваивание значения переменной. Давайте приведем такой пример.
Сложение и присваивание. Этот оператор не просто присваивает правую часть левой, но и увеличивает её на определённое значение.
Выглядит он, как знак плюса и равно вместе (+=).
Чтобы было более понятно, давайте рассмотрим этот код.
После выполнения соответствующих арифметических действий интерпретатор выдаст значение 9 при условии, что значение переменной a было 7.
То есть, этот оператор идентичен выражению a = a + 2 .
Вычитание и присваивание. Противоположный предыдущему оператор. Если мы используем выражение a -= 2, это будет значить то же самое, что и выражение a = a – 2 .
Деление и присваивание. Выполняет операцию деления между двумя операндами. После этого получившееся значение присваивается соответствующей переменной. Позволяет два действия: деление и присваивание запрограммировать всего одной строчкой кода. Можно также использовать переменные, объекты и другие значения, которые можно присвоить левой части, в правой.
Умножение и присваивание . Выполняет аналогичную последовательность действий для двух операндов. Сначала выполняется арифметическая операция с двумя операндами, а потом получившееся значение присваивается левому. В данном случае такой арифметической операцией служит умножение.
Деление по модулю и присваивание . Этот оператор выполняет сразу три действия:
- Делит первый операнд на второй.
- Определяет целое число.
- Присваивает это целое число той переменной, которая находится в правом операнде.
Эта программа выполняет три описанных выше действия, после чего получившийся результат печатает в консоли или нижней строке онлайн-интерпретатора. Например, если переменная a = 10, то будет выведено число 3.
Возведение в степень и присваивание . Этот оператор выполняет два действия:
- Берет левый операнд и возводит его в степень, равная числу справа.
- Получившееся число сразу становится значением переменной слева.
Здесь, как и в других операторах, можно использовать переменные в качестве правого операнда. Например, если в левой части находится переменная с числом 4, а в правой – число 2, то на вывод будет отправлено число 16.
Деление с остатком и присваивание . В принципе, вы уже поняли, как работает и записывается выражение с этим оператором. Он может получать остаток от деления первого числа на второе и возвращать его в ту переменную, которая стоит справа. Например, эта программа выводит остаток от деления на экран.
Логические операторы
Логические операторы – одни из самых важных, поскольку позволяют управлять потоком выполнения программы. В Python предусмотрено три оператора этого типа – and , or, not. Их легко запомнить, потому что они идентичны аналогичным словам на английском языке. Соответственно, они обозначают «и», «или», «не» соответственно. Рассмотрим эти операторы подробнее.
И (and). Оператор, выполняющий следующий алгоритм:
- Сравнивает между собой два операнда.
- Если оба выражения являются истинными, возвращается значение True . Если же хотя бы одно из них ложное, то возвращается False .
Приведем пример использования выражения.
Аналогично примерам, приведенным выше, здесь программа печатает результат выполнения своих операций по предыдущей строчке. Поскольку после обработки обнаружится результат «Ложь», то консоль также выдаст значение False .
Или (or). В этом случае истиной будет считаться тот результат, когда хотя бы одно из условий в операндах является истинным. Если же оба из них ложные, то выдается значение False .
Не (not). Этот оператор осуществляет инверсию значений. То есть, если на входе находится «Истина», то на выходе будет «Ложь». И наоборот. Так, в примере, который будет чуточку ниже, цифра 0 используется в качестве аргумента функции not . Соответственно, в консоли было выведено обратное значение – True ( Ведь 0 – это «ложь» в классификации этого языка).
Операторы принадлежности
С помощью этих операторов можно определить, входят ли значения в определенную последовательность. Она может быть любой – строкой, списком или кортежем. К этой категории относится всего два оператора – in и not in.
In. С английского переводится, как «В». Соответственно, с помощью этого оператора осуществляется проверка, является ли определенное значение частью последовательности списка, кортежа или строки.
Хотя принцип прост, покажем пример для наглядности.
Попробуйте определить, какое значение будет возвращено в этой ситуации. Правильный ответ – «False». Почему? Да, fox – это действительно лиса, и она является животным. Но она не входит в список домашних питомцев, куда относятся только собаки, коты и хорьки. Поэтому возвращается значение «ложь».
Если же написать такую строку, то будет возвращено «истина».
Почему? Потому что кот есть в списке питомцев.
Теперь приведем пример проверки вхождения фразы в строку.
Какой вывод будет у этой фразы? Правильно, «истина», потому что слог «me» в этом слове есть.
Not in. Этот оператор выполняет противоположное действие. Оно возвращает значение «истина» исключительно в случае, если не входит в состав последовательности та конструкция, которая находится в первом операнде.
Если бы мы в примерах выше использовали этот оператор, то были бы выданы такие результаты:
- Если бы мы проверяли вхождение лисы в перечень домашних питомцев, то было бы выдано значение True , потому что она не входит.
- Если бы мы проверяли вхождение кота в этот список, было бы возвращено значение false , поскольку он также не входит.
- Если бы мы проверяли факт вхождения слога «me» в слово «disappointment», то был бы выдан ответ false .
То есть, эти операторы работают полностью противоположным друг другу образом.
Операторы тождественности
Разберем более подробно операторы тождественности, поскольку они – наименее очевидны для новичка.
Это (is). Этот оператор проверяет тождественность. Если это так, то возвращается значение True . Если же нет, False. Давайте для демонстрации этого оператора приведем несколько примеров.
Здесь сравниваются числа 2 и 20. Они не являются одинаковыми, поэтому вернулось значение False .
А здесь сравниваются две двойки. При этом кавычки не учитываются, поскольку они не меняют объекты, это лишь системный символ, который позволяет людям и интерпретатору ориентироваться в коде. А поскольку кавычки этого не делают, то и возвращается значение True . Ведь они – идентичны.
Это не (is not). Как и любой обратный оператор, этот показывает полностью противоположное предыдущему значение.
Есть один нюанс. Оба оператора проверяют, являются ли объекты одинаковыми. То есть, если ввести первый операнд 1 и второй операнд ‘1’, то результат будет True в данном случае. Если говорить про предыдущую – False.
Почему так? Дело в том, что единица не тождественна ‘1’, поскольку эти значения представляют разные типы данных. В прошлом примере кавычки не учитывались, поскольку и в первом операнде, и во втором стоят кавычки. Здесь же мы видим, что первый операнд не имеет кавычки. И в этом случае они не будут считаться идентичными, даже если внешне выглядят одинаково.
Битовые операторы
На практике, используются довольно редко. Но применяются. И знать их тоже надо.
Для начала надо раскрыть, что такое побитовые операции в целом. Они выполняются над разрядами числа по специальным формулам, каждая из которых зависит от операторов.
Поэтому важно рассмотреть их более подробно.
Бинарное И (&) . Полный аналог оператора and , только который работает с битами. Точно так же, как и любой другой битовый оператор, он выполняет операции с каждой парой битов по отдельности, осуществляя с ними действия в соответствии с этой таблицей.
То есть, если первый бит в первой последовательности будет 0 и во второй последовательности битов первый бит будет 0, то после выполнения этой операции получится значение 0.
Точно так же и с каждым последующим битом. Предположим, у нас есть две последовательности:
После того, как каждая из этих последовательностей битов будет обработана оператором, получится следующая последовательность:
Естественно, передавать значения можно и в десятичной форме. В таком случае они будут преобразованы в двоичную и выполнены соответствующие вычисления. А потом они снова будут преобразованы в десятичную систему.
Например, если выполнить побитовое «И» с числами 2 и 3, то получится две последовательности битов в двоичной форме:
Если сопоставить с таблицей выше, то после побитового И будет выдан следующий результат:
То есть, на вывод уйдет цифра 2, поскольку после выполнения операции побитового И 1 и 1 дали 1, а 0 и 1 дали 0. В результате, получилось значение 10, что соответствует 2.
По аналогичному принципу работают и другие бинарные операторы.
Бинарное ИЛИ (|) . Соответствует побитовой операции or .
Общая таблица сопоставления битов с использованием этого оператора следующая.
То есть, если ввести такую строку кода, получится на выходе 3.
Почему? Потому что эти две десятичные цифры переводятся в следующие две последовательности.
1 на 1 дает 1, и 0 на 1 дает 1. Соответственно, получилось число 11 в двоичной форме, что соответствует 3 в десятичной. Поэтому такой вывод.
Бинарное ИЛИ НЕТ (^) . С помощью этой функции выполняется исключающее между двумя операндами, переведенными в двоичную форму. Сопоставление осуществляется по таким правилам.
Таким образом, если выполнить соответствующую операцию с теми же самыми числами, то получится в результате 1. Ведь цифра 2 у нас 10, а 11 – это 3. Таким образом, если сопоставить разряды по правилам, получится в итоге 01.
Инвертирующий оператор . С его помощью пользователь может инвертировать 0 в 1 и наоборот.
Например, если применить его к 2, то получится в результате -3. Почему? Потому что в двоичном формате цифра 2 – это 00000010. Если же ее инвертировать, то получится 11111101, что соответствует двоичной -3. Таким образом, получится в итоге обычная 2.
Естественно, работает все и абсолютно наоборот. Ведь если 11111101 заменить на противоположные значения, то получится на выходе та же цифра 3.
Бинарный сдвиг влево и вправо . Осуществляет сдвиг левого оператора на ту позицию, которая есть справа. Например, если попробовать сдвинуть вправо бинарную 3 (то есть, 11) на два положения влево, то в результате получится число 00, поскольку единицы ушли за пределы разряда.
И такой принцип дальше. То есть, первый операнд – это то число, сдвиг которого надо осуществить. Второй же операнд – количество бит, на которое необходимо его выполнить.
Операторы Equal и Not Equal в Python
Not Equal в Python – это оператор сравнения в Python, используемый для проверки, не равны ли два значения.
Для оператора Not Equal используется символ !=. Между восклицательным знаком и знаком равенства не должно быть разделителя.
Not Equal в основном используется в логических выражениях условных операторов, таких как If, If-Else, Elif, While и т.д.
Синтаксис
Ниже приведен синтаксис оператора сравнения:
Где, операнд_1 и операнд_2 – значения любого типа данных.
Оператор возвращает логическое значение, True – если операнд_1 и операнд_2 не равны, в противном случае он возвращает false.
Пример применения !=
В этом примере мы возьмем два целых числа и проверим, не равны ли они, используя !=.
a и b не равны, поэтому a != b вернул True.
a и c равны, поэтому a != b вернул False.
Пример 2: с оператором if
Мы уже знаем, что команда not equal возвращает логическое значение. Следовательно, это можно использовать в условиях принятия решений.
В следующем примере мы будем использовать оператор не равно в условии оператора IF.
a% 2 != 0 возвращает True для a = 11, поэтому, если блок выполняется.
Пример 3: со строками
В этом примере мы будем использовать Not Equal, чтобы проверить, не равны ли две строки.
Ясно, что две строки не равны, и результат a != b true. Итак, в Python выполняет код блока if.
Пример 4: в условии while
Вы можете использовать команду not equal в условии цикла while в Python.
Пример 5: в сложном условии
Команда может использоваться для объединения простых условий и формирования сложных условий или логических выражений.
(a == 1) и (b == 5) два простых условия, и мы должны использовать оператор неравенства, чтобы объединить их и сформировать составное условие.
Оператор сравнения Equal
Equal в Python – это оператор сравнения, используемый для проверки равенства двух значений.
Символ, используемый для оператора равенства Python, – ==. Оператор равенства в основном используется в логических выражениях условных операторов, таких как If, If-Else, Elif, While и т.д.
Синтаксис
Ниже приведен синтаксис:
Где, операнд_1 и операнд_2 – значения любого типа данных. Оператор равенства возвращает true, если операнд_1 и операнд_2 равны, иначе возвращает false.
Пример 1
В этом примере мы возьмем два целых числа и проверим, равны ли они, используя ==.
Пример 2: с оператором IF
В следующем примере мы будем использовать оператор равенства в условии IF.
a% 2 == 0 возвращает true для a = 10.
Пример 3: со строками
В этом примере мы будем использовать оператор равенства, чтобы проверить, равны ли две строки.
Пример 4: в условии while
Вы можете использовать оператор равенства в условии while.
Заключение
В этом руководстве Python мы узнали, что такое операторы сравнения Equal и Not Equal в Python, как использовать их, чтобы определить, равны или не равны два значения, с помощью подробных примеров программ.