Python Basics
Какой Python язык?
- Динамическая типизация, но можно статическую типизацию сделать с помощью mypy
- Мультипарадигмальный, общего назначения с верхнеуровневым и низкоуровневым апи
- Компилируемый - компилируется в байт-код -
.pyc
- Интерпретируемость - это ложь
Типы данных
| Immutable |
Mutable |
None |
list |
bool |
set |
int |
dict |
float |
|
str |
|
tuple |
|
== vs is
== - по значению / по методу __eq__
is - по адресу в памяти: id(a) == id(b)
- Для чисел и строк это равносильно
==, потому что Intering
Еще о Immutable
Что будет при изменении строки/тьюпла по индексу
- Ошибка
TypeError, напр. TypeError: 'str' object does not support item assignment
В чем плюс иммутабельных типов
- Быстрее
- Меньше памяти жрут
- Хешируемы - можно использовать в словарях/сетах
Как сделать класс - хешируемым
- Реализовать
__hash__, __eq__
copy
copy - не дип копирование
deepcopy - дип-копирование, включая списки и дикты
Скоуп переменных aka LEGB
- LEGB: Local, Enclosing, Global, Built-in
Local
- Переменная локальная только внутрии функции/класса
def f():
x = 1
print(x) # x = 1
Enclosing
def f():
x = 1
def g():
print(x) # x = 1
g()
Global
x = 1
def f():
print(x) # x = 1
global
x = 1
def f():
global x
print(x) # x = 1
x = 2
f()
print(x) # x = 2
Built-in
__name__ # '__main__'
__name__ = 'test'
print(__name__) # 'test'
Exceptions / Эксепшены / Ошибки
BaseException vs Exception
BaseException - для builtin-ошибок, в целом не должны использоваться в коде
Exception - базовый класс для ошибок, ловить/пользоваться нужно ими
Декораторы
import datetime
import functools
def timeit(func):
@functools.wraps(func)
def wrap(*args, **kwargs):
start = datetime.datetime.now()
res = func(*args, **kwargs)
end = datetime.datetime.now()
print(end - start)
return res
return wrap
Декоратор с параметрами
- Просто еще один слой враппинга:
def deco_w_params(param):
def timeit(func):
@functools.wraps(func)
def wrap(*args, **kwargs):
start = datetime.datetime.now()
res = func(*args, **kwargs)
end = datetime.datetime.now()
print(end - start)
return res
return wrap
return timeit
Итераторы / генераторы / итерируемый объект
- Итератор:
__iter__, __next__
- Генератор - объект, лениво отдающий свои данные
- Итерируемый объект - то что в for можно сунуть
Context Manager
Как сделать свой?
@contextmanager
class: __enter__, __exit__
Обработка ошибок
- Если в блоке
with пришла ошибка, то в __exit__ придет инфа об ошибке
- Если
__exit__ возвращает True, то ошибку обработали/засуспендили; иначе ошибка кидается дальше
class ManagedResource:
def __enter__(self):
print("Acquiring resource...")
return self
def __exit__(self, exc_type, exc_value, traceback):
if exc_type is not None:
print(f"Error caught in context manager: {exc_value}")
return False
print("Releasing resource...")
return True
Стандартная библиотека
- std: collections / itertools / etc.
Материалы