Задать вопрос
  • В чем суть декораторов?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    В питоне функции и классы - это тоже объекты. У них есть особый синтаксис объявления, после объявления эти объекты доступны по имени как и любой другой объект с именем (переменная).

    Лирическое отступление. В питоне переменные работают не так же как в Си. В Си переменная - это ящичек, а значение в нём как бы лежит. В питоне объект - это как чайный пакетик, а имя как ярлычок на ниточке. Можно к одному пакетику несколько ярлычков привязать, то есть несколько имён. В Си это достигается указателями. В питоне, получается, всё "как бы указатели" и разыменовываются они неявно, под капотом. Но сейчас не о том...

    Есть такой паттерн проектирования - декоратор. Декоратор - это функция, которой в аргументе передаётся какой-то объект, а на выходе она возвращает другой объект, каким-то образом задекорированный. В реальной жизни декорация объекта - это, скажем, раскрасить ассенизаторную машину под божью коровку или сделать заточку из ложки (есть, по-прежнему, можно, но можно и пырнуть)... Также декоратор может и вовсе подменять объект полностью, к примеру, нам даётся пластилиновая фигурка, а декоратор - это процесс заливки её её гипсом и производство формы под литьё. Пластилин из готовой формы выковыряли и выкинули, а декоратор - это процесс (функция) производства формы из пластилиновой фигурки.

    Повторюсь, в общем случае декоратор - это функция, которая либо немного меняет какой-то объект, либо делает на его основе или по его мотивам какой-то новый. Новый при этом может как содержать старый внутри, так и не содержать. Декоратор может и вовсе не трогать сам объект, а возвращать его без изменения, зато регистрировать его в каком-то внешнем списке создавая так называемый сайд-эффект. Примеров можно придумать уйму.

    Итак:
    my_object_instance = MyClass()
    my_object_instance = my_decorator1(my_object_instance)
    my_object_instance2 = my_decorator2(my_object_instance)

    В этом примере дважды задекорирован объект. Здесь при первом декорировании оригинал нам, судя по коду, не нужен (или декоратор его не менял, смотря что за декоратор, может просто зарегал где-то в списке...), а при втором декорировании нам остаётся доступным и оригинал и задекорированная версия.

    Пока всё просто и не ясно причем тут собаки и чем эти декораторы отличаются от обычных функций. На второй вопрос ответ прост -- ничем особенным. Просто мы такой смысл вкладываем в эти функции. Такая абстрактная концепция.

    В Питоне есть синтаксический сахар, чтобы декорировать объявления функций и классов.

    Иногда хочется наглядно модифицировать или зарегистрировать в каком-то глобальном реестре класс или функцию, но объявление при этом сильно менять не хочется.
    Можно так:
    my_pretty_functions = {}
    
    def my_deco(decorated_function):
        '''Это декоратор, который не меняет декорируемый объект, 
        лишь регистрирует его в словаре'''
        my_pretty_functions[decorated_function.__name__] = decorated_function
        return decorated_function
    
    def my_function(x):
        return x ** 2
    
    # вот декорирование вручную, без сахара
    my_function = my_deco(my_function)
    
    # Но в питоне же есть сахар для этого, и вот альтернативный вариант декорирования:
    @my_deco
    def my_other_function(x):
        return x ** 3

    Эти два способа декорирования работают одинаково, просто "собака" - это синтаксический сахар.

    Не все декораторы такие безобидные. Декоратор может вернуть совершенно другую функцию или вообще что угодно. Тогда это что угодно окажется под оригинальным именем функции, а оригинальная функция вовсе может быть потеряна (выброшена) или засунута в новую с помощью так называемого "замыкания".

    Но замыкания - это отдельная большая история, а узнать об этом вы сможете, к примеру, на занятиях по питону на otus.ru, где я скоро, надеюсь, стану преподавать=).

    Спрашивайте сто не понятно. Я тут не рассмотрел даже малой доли от разных способов применения декораторов в народном хозяйстве. Надо будет состряпать специальный курс про это.
    Ответ написан
    Комментировать
  • 3d графика в Python, какую библиотеку использовать?

    я бы генерировал 3D примитивы на прозрачном фоне в чём-то одном,
    и объединял с исходным видео с помощью ffmpeg. Налету, вполне.
    Ответ написан
    Комментировать
  • Как сделать чтобы цикл for прошелся по списку и при условии True вывел текст один раз?

    @danSamara
    Цикл не нужен.
    if user in passworld:
        print('Ваш пароль найден!')
    else:
        print('пароль не найден...')


    Но если необходимо всё же через цикл, то:
    for i in passworld:  # Скобки не нужны
        if i == user:  # Скобки не нужны
            print('Ваш пароль найден!')
            break
    else:
        print('пароль не найден...')
    Ответ написан
    2 комментария
  • Как сохранить график построенный с помощью matplotlib в формат .bmp?

    @Iv_and_S
    Python Imaging Library (PIL) - поддерживает и .png и .bmp.
    https://pillow.readthedocs.io/en/stable/handbook/i...
    т.е. просто конвертить файл в .bmp после сохранения
    Ответ написан
    Комментировать
  • Как переделать изображения в SVG?

    zahmTOD
    @zahmTOD
    Графический дизайнер
    По идее — никак. Это разные сущности. SVG - Scalable Vector Graphics. Т.е. векторная графика. А у вас в наличии JPG и PNG, которая растровая графика.
    Технически вы можете вставить растр в svg-файл, но практически «вес» картинок это не уменьшит.
    Ответ написан
    Комментировать
  • Прогнозирование отказа прибора?

    firedragon
    @firedragon
    Не джун-мидл-сеньор, а трус-балбес-бывалый.
    В общем то это одна из дисциплин любого физика.
    Зайдите на сайт например ВГУ и скачайте учебный план.

    Чисто практически дублируйте системы и устраивайте выборы, для системы с 3 компонентами учитывайте 2 совпадающих и отбрасывайте различающийся

    https://ru.wikipedia.org/wiki/%D0%A2%D0%B5%D0%BE%D...
    Ответ написан
    8 комментариев
  • Где в реальном мире можно встретить симметричные матрицы?

    @AlexSku
    не буду отвечать из-за модератора
    Матрица корреляций.
    Матрица весов в ненаправленном графе.
    Ответ написан
    3 комментария
  • Какой лучше использовать фильтр *маску" на фотографии?

    gbg
    @gbg
    Любые ответы на любые вопросы
    350px-%D0%A7%D1%91%D1%80%D0%BD%D1%8B%D0%
    Ответ написан
    Комментировать
  • Переставить min и max как это сделать?

    adugin
    @adugin Куратор тега Python
    Например, так?
    a = [{min(a): max(a), max(a): min(a)}.get(x, x) for x in a]

    Ещё варианты:
    a[:] = map(lambda x: min(a) if x == max(a) else max(a) if x == min(a) else x, a)

    d = {min(a), max(a)}
    a[:] = (sum(d) - x if x in d else x for x in a)

    d = {min(a), max(a)}
    a[:] = ((d & {sum(d) - x} or {x}).pop() for x in a)

    from operator import itemgetter
    
    (i_min, v_min), *_, (i_max, v_max) = sorted(enumerate(a), key=itemgetter(1))
    a[i_min], a[i_max] = v_max, v_min

    i_min, v_min = min(enumerate(a), key=itemgetter(1))
    i_max, a[i_min] = max(enumerate(a), key=itemgetter(1))
    a[i_max] = v_min
    Ответ написан
    Комментировать
  • Как ускорить перемножение матриц в numpy?

    adugin
    @adugin Куратор тега Python
    Не нужно этого делать.

    Во-первых, следует учитывать важность row-major и column-major order в этой операции:
    5da1a98421c64984085602.png

    Во-вторых, переход от int32 к float32 (или float64) даёт радикальное ускорение за счёт BLAS:
    5da1c7d110982244427246.png

    BLAS уже используется в numpy "под капотом" (по крайней мере, в дистрибутиве Anaconda), поэтому не следует явным образом вызывать эти функции вручную - как показано выше, это будет медленее.

    5da1bf09df2f7466403215.png
    P.S. Теория вкратце:
    Performance Tips of NumPy ndarray
    Understanding the internals of NumPy to avoid unne...
    Ответ написан
    Комментировать
  • ИИ, Нейронные сети, ML – для школьника?

    @AlexSku
    не буду отвечать из-за модератора
    Вчера был вебинар по Матлабу (со 2-ой минуты рассказано о разных подходах).
    Ответ написан
    Комментировать
  • Как преобразовать картинку в числа?

    Dr_Elvis
    @Dr_Elvis Куратор тега Python
    В гугле забанен
    from PIL import Image
    
    img = Image.open('pic.png')
    pixels = list(img.getdata())
    result = []
    for pix in pixels:
        r, g, b = pix
        result.append(r * g * b)
    print(result)
    Ответ написан
    Комментировать
  • Case in в Python нет?

    solotony
    @solotony
    покоряю пик Балмера
    вместо case используется либо последовательность if либо словарь
    Ответ написан
    Комментировать
  • Какая область математики отвечает за подсчет количества возможных вариантов (пример)?

    Ocelot
    @Ocelot
    Комбинаторика.
    Ответ написан
    Комментировать
  • Конфликт локальных/глобальных переменных в Python: кто из нас прав?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Python
    Седой и строгий
    Марк Лутц - "Изучаем Python", глава 20, страница 596
    Как известно, имена, которым выполняется присваивание внутри функции, по умолчанию рассматриваются как локальные – они располагаются в области видимости функции и существуют только во время работы функции. Но я еще не говорил, что локальные переменные определяются статически, во время компиляции программного кода в инструкции def, а не в соответствии с операциями присваивания, производимыми во время выполнения. Эта особенность становится причиной появления самых причудливых сообщений в группе новостей, получаемых от начинающих программистов. Обычно, если внутри функции имени не присваивается какое-либо значение, поиск его будет производиться в области видимости объемлющего модуля. Но посмотрите, что произойдет, если добавить инструкцию присваивания переменной X после ее использования.

    X = 99
    >>> def selector():
    ... print(X) # Переменная еще не существует!
    ... X = 88 # X классифицируется как локальная переменная
    ... # То же самое происходит при “import X”, “def X”...
    >>> selector()
    Traceback (most recent call last):
    ...текст сообщения об ошибке опущен...
    UnboundLocalError: local variable ‘X’ referenced before assignment

    Было получено сообщение о том, что переменная не определена, но причина его появления не очевидна. Этот программный код компилируется интерпретатором во время ввода в интерактивной оболочке или во время импорта модуля. Вовремя компиляции Python обнаруживает операцию присваивания переменной X и делает вывод, что X – это локальное имя везде в теле функции. Но во время выполнения функции, из-за того, что к моменту вызова инструкции print операция присваивания еще не производилась, интерпретатор сообщает о том, что имя не определено. Согласно этому правилу использования имен, он говорит, что обращение к локальной переменной X произведено до того, как ей было присвоено значение. Фактически любая операция присваивания внутри функции создает локальное имя. Операция импортирования, =, вложенные инструкции def, вложенные определения классов и так далее – все трактуются именно таким образом. Проблема возникает из-за того, что операция присваивания делает имена локальными для всей функции, а не только для той ее части, которая следует за инструкцией присваивания.

    Читать учебники - полезно.
    Ответ написан
    3 комментария
  • Как подсчитывать объем папки в реальном времени?

    @pfg21
    ex-турист
    подключиться к inotify. но нему прокидывают все изменения в файловой системе.
    фильтровать поток по необходимым путям и действиям и далее перечитывать статус измененных файлов.
    получишь размер каталогов прям в онлайн.
    Ответ написан
    Комментировать
  • Как сделать так, чтобы хэши md5 совпадали у python и js?

    Строка должна быть также в utf8. Извините за говно код, но вот пример
    const md5 = require("pure-md5")
    const utf8 = require('utf8');
    console.log(md5.md5(utf8.encode("Привет")))
    Ответ написан
    Комментировать
  • Стоит ли писать собственное IDE на Python?

    @towin
    Если программированием занимаетесь только месяц, то нужно писать свою операционную систему.
    Своя IDE - это для тех, кто уже 2 месяца программирует.
    Ответ написан
    Комментировать