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.
Материалы