воскресенье, 7 мая 2023 г.

Памятка по Python

Сравнение объектов

== - сравнивает содержимое
is - сравнивает указатель на объект
аналог between в sql:
>>> 0 <= a <= 10

Итерирование объектов

foreach
for country in ["Denmark", "Finland", "Norway", "Sweden"]:
    print(country)

обход мапы:
for name, email in emails.items():
items() - преобразовывает мапу в список туплов

обход списка с условием
[expression for item in iterable if condition]

реализация итерируемого объекта:
class Repeater:
    def __init__(self, value):
        self.value = value
    def __iter__(self):
        return self
    def __next__(self):
        return self.value
что делает for:
repeater = Repeater('Привет')
iterator = repeater.__iter__()
while True:
    item = iterator.__next__()
    print(item)

Метод итератор через yield
def letter_range(a, z):
    while ord(a) < ord(z):
        yield a
        a = chr(ord(a) + 1)

Добавление и извелечение

добавление элемента в список (список мутирует)
>>> seeds = ["sesame", "sunflower"]
>>> seeds += ["pumpkin"]
объединение словарей (3,5+):
zs = {**xs, **ys}
substr
seq[start:end:step]
reverse str
s[::-1]
кроме regex есть встроенные проверки на разные типы у строки:
s.isdigit()

Интерполяция и подстановка

подставновка
"The novel '{0}' was published in {1}".format("Hard Times", 1854)
"{who} turned {age} this year".format(who="She", age=88)
подстановка с обращением к элементу множества:
{0[1]} #так же можно обращаться объектам через точку
подстановка с форматированием
"{0:25}".format(s) # минимальная ширина поля вывода 25
"{:%B %d, %Y}".format(datetime.now()) #форматирование даты
подстановка через f (3.6+)
f'{datetime.now():%Y-%m-%d %H:%M:%S%z}'
краткая подстановка (deprecated)
'Привет, %s' % name
Удобный просмотрт объекта:
json.dumps(mapping, indent=4, sort_keys=True)
поддерживает не все типы данных, для всего лучше подходит:
pprint.pprint(mapping)

Коллекции

именнованный tuple (аналог case class scala)
collections.namedtuple("название",
"список полей через пробел")
как case class позволяет менять часть полей (repalce), копировать через make
Но есть еще более близкий аналог в либе SimpleNamespace:
from types import SimpleNamespace
car1 = SimpleNamespace(цвет='красный')
car1.цвет = 'asd'

генерация списка
list(range(n))

В set могут попадать только immutable объекты, к которым применим hash
почти все коллекции в питоне мутабельные

Клонирование коллекции
поверхностное копирование - если в списке есть ссылочные объекты, то копируется ссылка
songs[:] #через равно была бы ссылка
для рекурсивного клонирования всего, нужно исопльзовать:
copy.deepcopy(x)

доступ к словарю с значением по умолчанию
userid.get(userid, 'всем') #всем будет, если userid не найдется
через мапу с гетом удобно делать ветвление, если в значение положить функцию

Сортировка по элементу объекта
sorted(xs.items(), key=lambda x: x[1]) #пример: по значению мапы

оператор членства
>>> p = (4, "frog", 9, -33, 9, 2)
>>> 2 in p #True
работает со строками как со списком байт:
"v" in "Peace is no longer permitted during Winterval"

Параметры функций

параметры функций изменяемые для всех вызовов функции:
def append_if_even(x, lst=[]): # плохо!
распаковка параметров функции
def product(*args):
    for arg in args:
kwargs - содержит именнованные параметры

отключение позиционных параметров:
def heron2(a, b, c, *, units="meters"):
к параметру units можно обратиться только по имени

получание мапы именнованных параметров:
def print_setup(**options):
    print(options['a'])
print_setup(a="123")

функции можно создавать с аннотациями типов:
def is_unicode_punctuation(s : str) -> bool:

Lambda функции

s = lambda x: "" if x == 1 else "s"
s(123) #s

Функции фильтрации, обхода и reduce:
list(map(lambda x: x ** 2, [1, 2, 3, 4]))
list(filter(lambda x: x > 0, [1, -2, 3, -4]))
functools.reduce(lambda x, y: x * y, [1, 2, 3, 4])

Импорт модулей

import os.path
аналог:
from os import path
пакет - каталог и файл __init__.py
в файле можно указывать:
- список модулей для загрузки всего:
__all__ = ["Bmp", "Jpeg", "Png", "Tiff", "Xpm"]

Предопредленные переменные:
__name__ - будет равно имени модуля при импорте, и __main__ - при запуске из консоли
if __name__ == "__main__":
    import doctest
    doctest.testmod()

динамическое программирование
__import__(...) - импорт модуля по имени
compile(source, file, - объект с результатом компиляции объекта

Классы

все классы неявные наследники object

встроенные методы:
__new__() - заготовка объекта, вызывается до init
__init__() - конструктор
__eq__() - для сравнения
__repr__() - строка, которую с помощью eval можно превратить обратно в объект
__str__() - представление при выводе в консоль

переменная объявленная в классе может модифицироваться из всех объектов
если создать внутри функции как self.var1 , то только из конкретного объекта

нет приватных методов, но их можно эмулировать через __var (префикс __ - дандер)
переменная переименовывается в _класс__переменная

декоратор @property - метод только для чтения

метод класса - удобно использовать для фабрики, когда возращается новый класс
@classmethod
def margherita(cls):
    return cls(['моцарелла', 'помидоры'])

есть множественное наследование
class FileStack(Undo, LoadSave):

вместо общих ошибок, с кастомным текстом, лучше делать сразу кастомные exception через наследование
class NameTooShortError(ValueError):
    pass
def validate(name):
    if len(name) < 10:
        raise NameTooShortError(name)

Декораторы

реализация своего декоратора - определяет новую локальную функцию, которая вызывает оригинальную функцию
def positive_result(function):
    def wrapper(*args, **kwargs):
        result = function(*args, **kwargs)
        assert result >= 0, function.__name__ + "() result isn't >= 0"
        return result
    wrapper.__name__ = function.__name__
    wrapper.__doc__ = function.__doc__
    return wrapper
более котороткий вариант, включает доку и название
def positive_result(function):
    @functools.wraps(function)
    def wrapper(*args, **kwargs):
        result = function(*args, **kwargs)
        assert result >= 0, function.__name__ + "() result isn't >= 0"
        return result
    return wrapper

декоратор с параметрами: @bounded(0, 100)
def bounded(minimum, maximum):
    def decorator(function):
        @functools.wraps(function)
        def wrapper(*args, **kwargs):
            result = function(*args, **kwargs)
            if result < minimum:
                return minimum
            elif result > maximum:
                return maximum
            return result
        return wrapper
    return decorator

в декораторе есть название функции и передаваемые параметры, т.е. его удобно использовать для логирования и отладки (__debug__ - признак отладки)

к функции может быть применено несколько декораторов

Функции высшего порядка

Реализация через класс:
class Strip:
    def __init__(self, characters):
        self.characters = characters
    def __call__(self, string):
        return string.strip(self.characters)
        
strip_punctuation = Strip(",;:.!?") #__init__ класса
strip_punctuation("Land ahoy!") # __call__: 'Land ahoy'

Через вложенные функции:
def make_strip_function(characters):
    def strip_function(string):
        return string.strip(characters)
    return strip_function

Частично подготовить функции можно через functools:
reader = functools.partial(open, mode="rt", encoding="utf8")
reader("file.txt")

With - менеджер контекста

замена try + finnaly
with expression as variable:
    suite
expression должен реализовывать __enter__() и __exit__()

contextlib - однострочный вариант нескольких конекстов:
with contextlib.nested(open(source), open(target, "w")) as (fin, fout):
    for line in fin:

Виртуальное окружение

создание виртуальной среды питон в папке ./venv:
python3 -m venv ./venv

активация (переход) в виртуальную среду
source ./venv/bin/activate
При активации прописываются пути в path:
PATH="$VIRTUAL_ENV/__VENV_BIN_NAME__:$PATH"
export PATH
в коде дополнительно появляются переменные __VENV*__ с информацией об окружении

установка пакетов будет идти в виртуальной папке и теперь не нужны права админа:
pip install schedule

выход из виртуальной среды
deactivate

Популярные библиотеки

для обработки данных и машииного обучения:

Комментариев нет:

Отправить комментарий