Оглавление
Как создать собственное исключение?
Виды исключений
KeyboardInterrupt — порождается при прерывании программы пользователем (обычно сочетанием клавиш Ctrl + C).
import time
try:
time.sleep(100)
except KeyboardInterrupt:
print('KeyboardInterrupt')
Чтобы вызвать исключение KeyboardInterrupt, нужно запустить код выше и нажать комбинации клавиш Ctrl + C.
StopIteration
порождается встроенной функцией next, если в итераторе больше нет элементов. Также иногда можно вызвать это исключение вручную, когда необходимо оставить итерацию внутри итератора.
ZeroDivisionError
деление на ноль.
AttributeError
class SomeClass:
pass
obj = SomeClass()
obj.unknown_field
ImportError
не удалось импортировать модуль.
import timeeeee
IndexError
индекс не входит в диапазон элементов списка.
arr = []
print(arr[1])
KeyError
несуществующий ключ в словаре.
arr = {}
print(arr['key'])
SyntaxError
синтаксическая ошибка в коде.
class A {
b: int
}
IndentationError
неправильные отступы. Может возникнуть, например, если написать тело цикла с разными отступами. Таких ошибок можно избежать, если пользоваться современными IDE, например PyCharm или Visual Code.
for _ in range(10):
print(1)
print(2)
print(3)
TabError
смешивание в отступах табуляции и пробелов.
TypeError
операция применена к объекту неправильного типа. Такое исключение может возникнуть, например, если складывать числа и строки.
1 + ''
ValueError
1. функция получает аргумент правильного типа, но некорректного значения. Рассмотрим функцию int, с помощью нее можно преобразовать строку в число.
i = int('123')
Код выполнится корректно, в переменной i окажется число 123. Но если вызвать int и передать строку,
которую невозможно преобразовать в число, например:
int('dfdf')
Будет вызвано искл
Как вызвать исключение?
Для вызова исключения нужно использовать ключевое слово raise:
raise ValueError
Необходимо помнить, что ValueError является классом, поэтому можно создавать исключение с параметрами. Например, передать сообщение:
raise ValueError('some message')
Как обработать исключение?
Этот код обработает исключение деления на 0 и выведет сообщение “I caught it”. Достаточно часто возникает потребность обработать несколько исключений. Это можно сделать двумя способами: 1. Этот способ применяется, если нужно обрабатывать ошибку KeyError
Для обработки исключения нужно использовать ключевые слова try catch.
try:
1 / 0
except ZeroDivisionError:
print("I caught it")
Этот способ применяется, если нужно обработать несколько ошибок с помощью одинаковой логики.
try:
value = int(d["key"])
except KeyError:
print("key was not found")
except ValueError:
print("key has incorrect value")
Для того чтобы перехватить все исключения, нужно использовать конструкцию без указания исключения:
try:
value = int(d["key"])
except (KeyError, ValueError):
print("something wrong")
Или указав исключение-родителя:
try:
value = int(d["key"])
except:
print("all")
try:
value = int(d["key"])
except Exception:
print("all")
Как создать собственное исключение?
Необходимо создать класс-наследник от базового класса Exception.
class SomeErr(Exception):
pass
raise SomeErr
Объявленное исключение будет обладать такими же свойствами,
что и стандартные исключения
Генераторы и итераторы
Итератор — любой объект, в котором есть два метода: __iter__ и __next__.
class Counter:
def __init__(self):
self.n = 0
def __iter__(self):
return self
def __next__(self):
y = self.n
self.n += 1
return y
Стоит избегать прямого вызова __iter__ и __next__. При использовании for или list comprehension Python вызывает эти методы сам. Если все-таки необходимо вызвать методы напрямую, используйте встроенные функции iter и next. В параметры нужно передать итера
c = Counter()
it = iter(c)
print(next(it))
print(next(it))
print(next(it))
print(next(it))
Стандартные итераторы
Списки
a = [1, 2, 3]
print(iter(a))
for item in a:
print('arr item', item)
Кортежи
b = [1, 2, 3]
print(iter(b))
for item in b:
print('tuple item', item)
Словари
Все вышеперечисленные объекты являются итераторами, они реализуют методы __iter__ и __next__
c = {'var1': 1}
print(iter(c))
for item in c:
print(item)
Генераторы
Генераторы — функции, которые внутри используют выражение yield. Каждый вызов метода __next__ у объекта-генератора возвращает следующее значение. Метод __iter__ также реализуется автоматически. То есть генераторы можно использовать везде, где требуются и
def counter():
n = 0
while True:
yield n
n += 1
c = counter()
it = iter(c)
print(next(it))
print(next(it))
print(next(it))
print(next(it))
List comprehensions
Синтаксический «сахар», который позволяет свернуть стандартные конструкции языка (циклы и условия) до одной строки.
Списки
lst = [item for item in arr]
Генераторы
gen = (item for item in arr)
Словари
Во всех типах list comprehensions можно использовать условия. Например:
dct = {item: item**2 for item in arr}
lst = [item for item in arr if item % 2 == 0]
В результирующем списке lst будут только элементы, которые делятся на 2.
Тернарные операции
Синтаксис, который эквивалентен обычному условию if, но при этом его можно использовать внутри одной строки. То есть, например, использовать внутри вызова функции, что позволяет сделать код более компактным.
res = 'четное' if a % 2 else 'нечетное'
эквивалентно
res = 'четное'
if a % 2:
res = 'четное'
else:
res = 'нечетное'