10-минутный экспресс-курс Python

Изучение Python по 10 минут в день #12

Попробуйте, кроме, наконец, и менеджеров контекста

Это серия коротких 10-минутных статей о Python, которые помогут вам расширить свои знания о Python. Я стараюсь публиковать статьи каждый день (никаких обещаний), начиная с самых основ и заканчивая более сложными идиомами. Не стесняйтесь обращаться ко мне в LinkedIn с вопросами или запросами по конкретным темам Python, о которых вы хотите узнать.

Когда вы пишете код на Python, вы (скорее всего) будете делать ошибки. Некоторые приводят к синтаксическим ошибкам, которые являются ошибками, потому что вы, скорее всего, написали какое-то слово с ошибкой, что приводит к недопустимому коду Python. Эти ошибки не сложно исправить. Другим типом ошибок в Python являются исключения. Это ошибки, которые совершенно нормальны при переводе вашего кода Python в байтовый код (без синтаксических ошибок), но при попытке выполнить что-то происходит что-то недопустимое. Например, вы не можете разделить строку на число Пи. На самом деле это не имеет для нас смысла, а также Python не знает, что делать, и вызывает исключение. Некоторые из этих исключений вполне очевидны. Например, открытие несуществующего файла для чтения вызывает исключение FileNotFound. Не все исключения так очевидны или даже по вашей вине. Например, попытка связаться с неработающим restAPI также может привести к исключению. Конечно, лучше стараться избегать всех ошибок и исключений, однако одна идиома в Python меня всегда поражала:

Легче попросить прощения, чем разрешения (EAFP)

Python имеет структуру для перехватаисключений, а именно блок try/except. Как следует из названия, он попытается выполнить все операторы в блоке try. В случае успеха все сделано. Если по какой-либо причине возникнет исключение, он выполнит блок исключений, и все ошибки будут подавлены. Хотя мы можем обсудить, хороший ли это способ программирования, он очень эффективен, так как намного быстрее, чем пытаться сначала проверить все возможные ошибки. Блок try-except может проверять множество определенных исключений, предоставляя тип исключения, или перехватывать любое исключение, оставляя тип исключения пустым. Исключение на самом деле является объектом типа Exception (вы удивлены?). Давайте начнем с примера того, как использовать эту конструкцию.

В примере у нас есть допустимая функция для деления двух чисел. Это будет работать нормально, за исключением случаев, когда второе число равно нулю. Все мы слышали, что деление на ноль не определено, нельзя разделить пять куки на ноль друзей, как мы узнали из Сири. Как показано в приведенном выше коде, деление на ноль приводит к ZeroDivisionError:

ZeroDivisionError — это объект, и с помощью конструкции try-except мы можем Поймать ошибку и предотвратить сбой нашего скрипта. В примере мы создали secure_divide, который попытается разделить значение. В первом операторе exclude мы специально перехватим ZeroDivisionError. Если мы разделим на ноль, Python в конечном итоге выполнит операторы в этом блоке. Будет ли другая проблема, например, если мы сошлемся на несуществующую переменную, она окажется во втором блоке, кроме блока, который перехватывает все (другие) исключения. Мы можем тестировать столько исключений, сколько нам нужно, или просто перехватывать их все, не предоставляя исключения.

Если вы видите ошибку (или исключение), мне проще всего прочитать ошибку снизу вверх. В последней строке показано исключение и очень краткое описание ошибки. Затем сообщения об ошибках показывают блоки кода вокруг строки с ошибкой впереди. Строка с ошибкой показывает, в какой строке произошла ошибка. Если ошибка произошла в функции, каждый раздел кода выше будет на уровень выше, пока первый блок не станет верхним уровнем кода. Иногда это может сбивать с толку, так как части этих блоков кода взяты из импортированных библиотек, то есть кода, который вы не создавали. Хитрость заключается в том, чтобы игнорировать их и двигаться выше, пока вы не достигнете уровня своего собственного кода. Хотя технически ошибка могла быть в пакете, гораздо чаще мы неправильно использовали код и вводили неверные параметры в импортируемую функцию.

Конструкция try-except — отличный метод для конкретных случаев, но я бы посоветовал использовать ее как минимум. Одна вещь, которая, однако, очень полезна, — это конструкция try-(except)-finally. Исключение находится между круглыми скобками, поскольку оно не является обязательным. Краткий пример:

В этом примере первый фрагмент кода показывает конструкцию try-finally. Он будет попытаться выполнить весь код в блоке try, и независимо от того, успешен код или нет, он всегда выполнит часть в блоке finally. Это продемонстрировано во второй части, в которой мы намеренно делаем блок try неработоспособным. В обоих случаях печатается строка «готово».

Конструкция try-finally чрезвычайно полезна и часто используется в Python, но, возможно, не видна напрямую. Например, при работе с файлами мы должны убедиться, что закрываем файл после того, как закончим. Это можно сделать с помощью конструкции try-finally:

Команда try-finally всегда гарантирует, что файл будет закрыт, независимо от успеха или неудачи. Это была такая замечательная концепция, что Гвидо решил создать специальную конструкцию, чтобы сделать ее более компактной (и не иметь еще одного или нескольких предложений finally, болтающихся в нижней части скрипта), а именно ключевое слово with . Ключевое слово with открывает (или соединяет, или…) объект и связывает его с идентификатором. В следующем блоке кода с отступом переменная доступна, и мы можем выполнять столько операторов, сколько захотим. Когда мы выходим из блока кода или когда возникает ошибка, файл (или соединение, или…) закрывается, что идентично нашей ранее созданной конструкции try-finally (только короче). Этот синтаксис в Python называется менеджером контекста и доступен не только для файлов. Он также регулярно используется вместе, например, с базами данных. Изменения в базах данных часто собираются до тех пор, пока вы их не зафиксируете. Контекстный менеджер может убедиться, что эти строки зафиксированы и соединение с базой данных закрыто нормально, независимо от ошибок. Постарайтесь помнить, что диспетчер контекста (используя ключевое слово with) следит за тем, чтобы последняя часть кода всегда выполнялась в конце раздела кода. Самый простой способ запомнить это пример с открытым файлом и закрытым файлом.

Практика на сегодня:

В Python самый простой способ получить интерактивный пользовательский ввод — использовать функцию input(). Пользователь может ввести значение и нажать клавишу ввода, чтобы отправить значение. Значение представляет собой строку.

input_value = input()  # this also works in a  Jupyter Notebook

Назначение:
спросите у пользователя его возраст и проверьте, меньше ли он 42 лет. Поскольку входное значение представляет собой строку, вам нужно преобразовать ее в целое число. Используйте принцип EAFP, чтобы поймать неверный ввод, например, если пользователь вводит строку вместо числа.

Если у вас есть какие-либо вопросы, не стесняйтесь обращаться ко мне через LinkedIn.