Задать вопрос
Ответы пользователя по тегу Python
  • Мультиязычность на python как стоит оптимизировать?

    Vindicar
    @Vindicar
    RTFM!
    Ну кэшировать результаты приведённого кода, пожалуй, стоит, всё же открывать-закрывать файл на каждый чих - не лучшая идея. functools.lru_cache в помощь.
    Но вообще, если встаёт вопрос "оптимизировать или нет", то первое, что нужно сделать - понять, что именно стоит оптимизировать. Если у тебя заметная доля времени выполнения тратится на указанный код, то да, стоит.
    Профилируй свой код (можно с помощью модулей profile/cProfile или стороннего профилировщика), и выясняй.
    Ответ написан
    Комментировать
  • Что нужно сделать чтобы код заработал как надо?

    Vindicar
    @Vindicar
    RTFM!
    проверяет условие 42 <= r1 and r2 <= 88

    if 42 <= r1 <= 88 and 42 <= r2 <= 88:

    Это разные условия. Какое из двух тебе нужно?
    И если на то пошло, какой именно неправильный ответ выдаёт код? Не находит решение, когда оно должно быть? Или находит решение, когда его не должно быть? Или находит неправильное решение?
    Ответ написан
    2 комментария
  • Как убрать лишнюю информацию из json ответа?

    Vindicar
    @Vindicar
    RTFM!
    Как написали выше, это журнал работы. Скорее всего основан на встроенной либе logging.
    Получаешь объект журнала через logging.getLogger('тут имя журнала которое ты замазал'), а затем на нём делаешь .setLevel(logging.ERROR), чтобы выводились только ошибки.
    Ответ написан
    Комментировать
  • Process finished with exit code 0 Telebot Python в чем ошибка?

    Vindicar
    @Vindicar
    RTFM!
    Отступы в питоне важны!
    У тебя всё, начиная с @client.event async def on_ready(): попало внутрь обработчика события.
    Как следствие, бот не стартует, пока не выполнится обработчик, а обработчик не выполнится, так как бот не стартовал. Программа доходит до конца, решает "ну, что сказали сделать - я сделала" и завершается нормально, т.е. с кодом 0.
    Сдвинь соответствующий участок кода (начиная с указанного) влево.
    Ответ написан
  • Почему input() не сохраняет значения в списке?

    Vindicar
    @Vindicar
    RTFM!
    input() не сохраняет значения в списке

    Всё оно сохраняет, просто вот эта строка - полная чушь.
    res_int = ''.join(i if i.isdigit() else ' ' for i in s).split()

    У тебя s - список строк. Ты заменяешь на пробелы все строки в списке, которые содержат что-то кроме цифр (а это все строки в твоём списке!), затем соединяешь строки в одну и делишь их по пробелу. Конечно, у тебя получится пустой список в итоге.
    У меня такое чувство, что этот код вообще предполагал, что в s будет одиночная строка, а не список - но даже тогда он не сделает что тебе надо.

    Нужно каждую строку в s разделить по символу "," и все элементы полученного списка, кроме нулевого, превратить в числа. Дальше уже будет просто.
    Ответ написан
  • Почему json файл не создается через python в docker?

    Vindicar
    @Vindicar
    RTFM!
    А где ты файл-то создаёшь? На подмонтированном volume? Или где попало?
    Вообще изменения в файловой системе контейнера не сохраняются при остановке. Тебе нужен volume (или иной похожий механизм), чтобы сохранить данные между перезапусками контейнера.
    Читай про docker persistence.
    Ответ написан
  • Как протестировать код как Я.Контест?

    Vindicar
    @Vindicar
    RTFM!
    Втупую - subprocess для запуска дочернего процесса с перехватом стандартного ввода вывода. А дальше какая-то база, содержащая набор пар "ввод - ожидаемый вывод" для скрипта.
    Веселье начнётся, когда ты поймёшь, что в запускаемом скрипте может быть всё, что угодно, и его надо выполнять в песочнице, где можно контролировать какие модули он импортирует.
    Ответ написан
  • Как реализовать отложенное сообщение?

    Vindicar
    @Vindicar
    RTFM!
    используй асинхронную библиотеку для бота. Асинхронные функции могут приостановить своё выполнение и отдать процессорное время другим, которые готовы выполняться. Тогда, как написали выше, всё решается вызовом asyncio.sleep(). Но это предполагает, что ты можешь бота переписать на асинхронный подход.

    Если же нет, придётся использовать потоки, в расчёте на то, что бот потокобезопасен.
    Ответ написан
  • Построение игры в монетку с вариативностью и возможностью выбора на Python?

    Vindicar
    @Vindicar
    RTFM!
    Ошибки две. Первая, вместо двух отдельных if тебе нужна цепочка if-elif-else, а лучше - одна пара if-else с правильно написанным условием победы. Второе, ввод догадки пользователя должен быть ПЕРЕД проверкой, а не после и не внутри неё.
    Ну и пока что нет изменения баланса, но это ты уже допишешь.
    Ответ написан
    Комментировать
  • Есть ли аналог метода Range.AutoFill для работы с файлом в скрытом режиме?

    Vindicar
    @Vindicar
    RTFM!
    Нету такого метода, и вряд ли где-то будет, помимо другого табличного процессора. Там же очень замороченная логика - нужно догадаться, что за данные выделены, какая в них закономерность, как эту закономерность продолжить, в каком направлении её продолжить, и так далее.
    Если у тебя частный случай (например, нужна последовательность дат или последовательность чисел), и предсказуемое направление заполнения, то можно написать логику самому.
    Ответ написан
  • Почему в параметр функции идёт только последний индекс?

    Vindicar
    @Vindicar
    RTFM!
    Поздравляю, ты попался на лямбду.
    Лямбды сохраняют ссылки на переменные, а не их значения.
    lambda _: set_default_microphone(index) сохранит ссылку на index, а потому все лямбды будут видеть одно и то же значение index, которое было установлено последним.
    Это можно обойти, сохранив ссылку при объявлении лямбды. Самый простой способ - засунуть сохраняемое значение в значение по умолчанию для неиспользуемого параметра. Значения по умолчанию для параметров вычисляются один раз при объявлении функции, в т.ч. лямбды.
    Например, так:
    lambda _, *, ind=index: set_default_microphone(ind)

    Ну или даже так:
    lambda _, *, index=index: set_default_microphone(index)
    Ответ написан
    2 комментария
  • Как мне проигнорировать этот Подкаталог "old" и прочитать данные только из списка?

    Vindicar
    @Vindicar
    RTFM!
    from pathlib  import Path # входит в поставку питона, не сторонняя
    
    base_path = Path("data")  # путь до каталога с данными
    for item in base_path.glob('*'):
      if item.is_dir() and item.stem != 'old':
        # тут что-то делаем с путём item. Например:
        for kml_file in item.glob('*.kml'):
          print(kml_file.resolve())  # выводим полный путь к файлу
    Ответ написан
  • TypeError: Parameters to generic types must be types. Got Ellipsis.?

    Vindicar
    @Vindicar
    RTFM!
    Какая у тебя версия питона? Как минимум в 3.12 конструкция List[Dict[str, ...]] поддерживается. Может, и в более ранних тоже.
    Ответ написан
  • Как найти паттерн на картинке с OpenCV?

    Vindicar
    @Vindicar
    RTFM!
    Во-первых, оформи код, нечитаемо. Кнопка </> в помощь.
    Во-вторых, matchTemplate(), насколько я знаю, не-инвариантна к поворотам и масштабу. Иными словами, поворот или изменение размера целевого объекта сломают сопоставление.
    В-третьих, на показанном кадре более одного экземпляра целевого объекта. Так предполагается или нет? Если предполагается, сколько экземпляров ожидается? Потому что разница очень большая с точки зрения методики.

    Варианта тут три.
    1. пытаться обучать под задачу нейронку. А лучше дообучить существующую, скажем, YOLOv5. Но тебе потребуется минимум несколько сотен размеченных изображений объекта в разных комбинациях, плюс в 2-3 раза больше похожих изображений без целевого объекта. Готовить такую базу будет утомительно, да и само обучение требует понимания что ты делаешь.
    2. попробовать зафиксировать угол поворота или масштаб (т.е. допустить, что он всегда одинаков). Тогда другой параметр можно будет подбирать. Например, мы фиксируем масштаб и делаем 16 изображений объекта в разных поворотах, а потом поочерёдно ищем каждый вариант на кадре. Потом анализируем силу откликов - сколько их, насколько они сильные и т.д. Скорее всего, будет медленно
    3. взять за основу поиск по локальным особенностям. Он справляется с масштабом и поворотом, но не справляется с несколькими экземплярами объекта. Это можно забороть, если использовать скользящее окно. Иными словами, находим на кадре узнаваемые точки - локальные особенности (желательно достаточно много и достаточно плотно), используя алгоритмы вроде ORB или SIFT. Затем выбираем те из них, которые попадают в прямоугольную рамку-окно. Затем сверяем эти особенности с особенностями объекта, используя RANSAC или подобный метод. Если получилось хороше совпадение - значит, в этой рамке есть объект или значительная его часть, и мы можем оценить его позицию в кадре в целом. Повторяем процесс, сдвигая рамку, пока оно не "обойдёт" всё изображение. Тоже может быть небыстро, так как нам требуется неоднократный поиск по картинке.
    Ответ написан
    Комментировать
  • Как изменить код для работы с видео?

    Vindicar
    @Vindicar
    RTFM!
    Тебе модель, скорее всего, отдаст экземпляр класса Detections.
    Если его посмотреть, там есть несколько полезных методов, например, render(), который возвращает список обработанных изображений с отрисованными объектами. А ещё у него есть свойства imgs, xywh и names, чтобы получить обработанные изображения, рамки и классы найденного. Экспериментируй с ними
    Не забываем, что модель рассчитана на подачу пачки изображений, просто эта пачка может содержать и только одно изображение. Отсюда и множественное число, и постоянные массивы.
    Ответ написан
    Комментировать
  • Не работают кнопки в тг боте на python как починить?

    Vindicar
    @Vindicar
    RTFM!
    Проблема, я полагаю, та же что и всегда - несколько обработчиков с func=lambda call: True.
    Ответ написан
    Комментировать
  • Статья закончена, а ответ на вопросы нет?

    Vindicar
    @Vindicar
    RTFM!
    Плохой образец для подражания выбрал - там почему-то код на питоне вперемешку с HTML-разметкой.
    Лучше поищи официальные доки и учись по ним.
    Ответ написан
  • Как выполнить шифровку при помощи шифра Вижинера?

    Vindicar
    @Vindicar
    RTFM!
    Делишь задачу на под-задачи. Допустим, у тебя есть строка-исходный текст text и строка-ключ key, а также список строк, содержащий алфавит языка alpha.
    Определяешь функцию, заменяющую символ по шифру:
    # принимает символ открытого текста, его позицию в тексте, строку-ключ и алфавит
    # возвращаем символ шифротекста
    def viginere_encode(text_char: str, i: int, key: str, alpha: list[str]) -> str:
      if text_char not in alpha:  # незнакомый символ?
        return text_char  # оставляем его как есть
      text_char_code = alpha.index(text_char)  # номер символа открытого текста в алфавите
      key_char = key[i % len(key)]  # символ ключа, соответствующего i-му символу открытого текста 
      key_char_code = alpha.index(key_char)   # номер символа ключа в алфавите
      cypher_char_code = (text_char_code + key_char_code) % len(alpha)  # номер символа шифротекста
      return alpha[cypher_char_code]  # возвращаем символ шифротекста

    А дальше применяем эту функцию к строке:
    cipher_text = ''
    for i in range(len(text)):
      cipher_text += viginere_encode(text[i], i, key, alpha)

    Вот и всё. Да, тут много чего можно оптимизировать, но я старался писать как можно проще.

    Полный пример
    alpha = list('ABCDEFGHIJKLMNOPQRSTUVWXYZ')
    text = 'A SMOKE OF MOTHERLAND IS SWEET FOR US AND PLEASANT'
    key = 'SECRET'
    
    # принимает символ открытого текста, его позицию в тексте, строку-ключ и алфавит
    # возвращаем символ шифротекста
    def viginere_encode(text_char: str, i: int, key: str, alpha: list[str]) -> str:
      if text_char not in alpha:  # незнакомый символ?
        return text_char  # оставляем его как есть
      text_char_code = alpha.index(text_char)  # номер символа открытого текста в алфавите
      key_char = key[i % len(key)]  # символ ключа, соответствующего i-му символу открытого текста 
      key_char_code = alpha.index(key_char)   # номер символа ключа в алфавите
      cypher_char_code = (text_char_code + key_char_code) % len(alpha)  # номер символа шифротекста
      return alpha[cypher_char_code]  # возвращаем символ шифротекста
    
    # принимает символ шифротекста, его позицию в тексте, строку-ключ и алфавит
    # возвращаем символ открытого текста
    def viginere_decode(cipher_char: str, i: int, key: str, alpha: list[str]) -> str:
      if cipher_char not in alpha:  # незнакомый символ?
        return cipher_char  # оставляем его как есть
      cipher_char_code = alpha.index(cipher_char)  # номер символа шифротекста в алфавите
      key_char = key[i % len(key)]  # символ ключа, соответствующего i-му символу шифротекста 
      key_char_code = alpha.index(key_char)   # номер символа ключа в алфавите
      text_char_code = (cipher_char_code + len(alpha) - key_char_code) % len(alpha)  # номер символа открытого текста
      return alpha[text_char_code]  # возвращаем символ открытого текста
    
    
    cipher_text = ''
    for i in range(len(text)):
      cipher_text += viginere_encode(text[i], i, key, alpha)
    
    decoded_text = ''
    for i in range(len(cipher_text)):
      decoded_text += viginere_decode(cipher_text[i], i, key, alpha)
    
    print(text)
    print(cipher_text)
    print(decoded_text)
    Ответ написан
    1 комментарий
  • Как запустить одну и ту же функцию с разными параметрами одновременно?

    Vindicar
    @Vindicar
    RTFM!
    Всё проще.
    У тебя во второй и третьей строке у start() скобки пропущены.

    Вот только цикл while там ну очень не очень. Хотя бы задержку секунд 20 поставь, а то нарвёшься на бан на сайте, или просто подвесишь комп диким числом потоков.
    Ответ написан
    Комментировать
  • Я учу питон, и в данный момент я пытаюсь сделать калькулятор который проверяет данные которые вводит пользователь?

    Vindicar
    @Vindicar
    RTFM!
    Во-первых, не надо называть переменные и функции одинаково (num_1 и num_1, num_2 и num_2).
    Во-вторых, переменные, созданные внутри функции, обычно не видны снаружи. Ты правильно пытаешься использовать оператор return, чтобы вернуть значение из функции. Но ты не учёл, что когда функцию вызываешь, результат лучше сохранить в переменную, и потом использовать её.

    number_1 = num_1()
    number_2 = num_2()
    # дальше работаешь с number_1 и number_2
    Ответ написан
    6 комментариев