Ответы пользователя по тегу Python
  • Как запретить лайкать?

    Vindicar
    @Vindicar
    RTFM!
    База данных есть, я надеюсь?
    Лайк - это классическая связь многие-ко-многим между постами и юзерами.
    Т.е. помимо таблицы постов и таблицы юзеров делаешь связную таблицу из двух полей - id поста и id юзера. Если в ней есть запись - юзер лайкнул пост. Тогда можно
    а) проверять заранее, есть ли такая запись, и показывать "вы уже лайкнули"
    б) игнорировать повторные лайки, если они всё-таки придут. Просто сделай пару юзер-пост ключом
    в) как бонус - можно посчитать количество лайков посту и выбрать что лайкнул конкретный юзер.
    Ответ написан
    Комментировать
  • Как сделать так чтобы бот discord писал другому юзеру, когда он нажимает на реакцию?

    Vindicar
    @Vindicar
    RTFM!
    Судя по тегам discord и python, хотите использовать discord.py?
    В таком случае, нужно обрабатывать событие на простановку реакции, добыть id юзера, который её проставил, отправить сообщение этом юзеру по его id.

    Самые азы работы с библиотекой тут.
    Ответ написан
    Комментировать
  • Как запустить определенный код в другом потоке?

    Vindicar
    @Vindicar
    RTFM!
    Модуль threading в помощь.
    Кроме того, стоит запоминать, было ли найдено лицо на предыдущем кадре. Если на предыдущем не было, а на текущем есть, и если поток не активен, запускаем поток.
    Ответ написан
    Комментировать
  • Как найти несколько минимальных чисел в матрице?

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

    Vindicar
    @Vindicar
    RTFM!
    Лучше так не делать от слова совсем.
    Либо пусть ваша функция возвращает это значение, либо сделайте её методом в классе, а локальную переменную замените на поле класса.
    Ответ написан
    Комментировать
  • Как можно заменить from module import * для однострочного кода Python?

    Vindicar
    @Vindicar
    RTFM!
    Открою страшную тайну:
    d = globals() # или locals() если нужна локальная область видимости
    d['x'] = 1
    print(x) #выведет 1


    Но зачем?
    Ответ написан
    5 комментариев
  • Как решить проблему динамического изменения данных во вложенном списке в python?

    Vindicar
    @Vindicar
    RTFM!
    a = []
    b = []
    b.append(a)
    b.append(a)
    a.append(1)
    print(b)
    #выведет [[1], [1]]

    Иными словами, список хранит не копию другого списка, а ссылку. Если вам нужна копия - сделайте её явно вызовом метода .copy() у списка.
    Ответ написан
    Комментировать
  • Что означает ошибка diskord.py?

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

    Vindicar
    @Vindicar
    RTFM!
    https://letmegooglethat.com/?q=python+make+directory
    Кроме шуток, ответ легко ищется поисковиком!
    В первой же паре строк будет os.mkdir() (для подкаталога в уже существующей директории) и os.makedirs() (для создания иерархии каталогов).
    Ответ написан
    Комментировать
  • Как исправить поворот массива numpy?

    Vindicar
    @Vindicar
    RTFM!
    метод reshape() возвращает версию массива с другими размерами, а не меняет эти размеры на месте.
    Так как вы игнорируете возвращаемое значение, вы пытаетесь повернуть одномерный вектор.
    Но там ещё будут проблемы с sorted(arr_b), так как sorted() интерпретирует двумерный массив как коллекцию одномерных, и пытается сортировать только эту коллекцию.
    Ответ написан
    Комментировать
  • Как заставить дискорд бота отправлять сообщения в случайное время?

    Vindicar
    @Vindicar
    RTFM!
    Ну для начала определи, что понимается под случайным временем.
    Например, "одно сообщение через каждые t секунд, где t - равномерно распределённое число от 300 до 3600"
    Или "выбрать случайный момент времени в сутках, дождаться его наступления, отправить реплику"
    Или "пусть бот каждый N секунд бросает кубик, если выпала единица - выводим сообщение".
    Все три способа подразумевают разную реализацию и разные ограничения.

    Я полагаю, делаешь бота на discord.py?
    Тогда копай в сторону:
    1. модуля random, чтобы понят как генерировать случайные числа
    2. раздел документации по discord.py посвящённый длительным процессам.

    Логика примерно такая:
    1. Разберись по примеру выше, как делать простой цикл, чтобы бот писал что-то в консоль.
    2. Используй asyncio.sleep() чтобы задержать выполнение цикла на какое-то время.
    3. Научись генерить случайные числа с помощью модуля random, и сделай задержку случайной.
    4. Научись делать случайный выбор сообщения с помощью random.choice()
    5. Научись отправлять сообщения в канал а не в консоль (метод, который пригодится)

    Подробнее - только кодом.
    Ответ написан
  • Что не так, не понимаю TypeError: can only concatenate str (not "int") to str?

    Vindicar
    @Vindicar
    RTFM!
    input() возвращает строку. Сразу конвертируй её в целое, и уже потом работай.
    Ответ написан
    Комментировать
  • Как сделать конвертер единиц в tkinter?

    Vindicar
    @Vindicar
    RTFM!
    Для value_type пропиши callback на изменение значения.
    self.value_type = IntVar()
    self.value_type.trace_add('write', self.select_value_type)

    При этом метод select_value_type должен иметь сигнатуру вида
    def select_value_type(self, *args):
    В твоём случае параметры метода не важны, так как он связан с изменением одной переменной. Вот почему можно просто прописать *args.
    Ответ написан
    2 комментария
  • Отсортировать список по именам элементов?

    Vindicar
    @Vindicar
    RTFM!
    Удалить en и ru из списка, если удалось, вставить их в начало вручную? Это вообще-то не сортировка. =)
    for lang in ('en', 'ru')[::-1]: #инверсия порядка тут необходима
      try:
        l.remove(lang)
      except ValueError: #нет такого языка в списке
        pass
      else: #был такой язык в списке, вставляем обратно
        l.insert(0, lang)
    Ответ написан
    Комментировать
  • Как забрать сразу несколько ролей?

    Vindicar
    @Vindicar
    RTFM!
    Напиши функцию, которая берёт такую строку, превращает её в массив.
    API remove_roles() позволяет указать несколько ролей сразу, просто распакуй массив в список аргументов через *.
    input_str = '123 456 789'
    role_ids = input_str.split()
    reason = 'Потому что гладиолус!' #или None
    target_member.remove_roles(*role_ids, reason=reason)
    Ответ написан
    1 комментарий
  • Почему возникает ошибка error: [Errno 24] Too many open files при requests.get?

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

    Vindicar
    @Vindicar
    RTFM!
    Так, как вы это пытаетесь сделать - никак. Просто невозможно.
    Максимум, вы можете схитрить: пусть load() возвращает объект(ы) модуля(ей), которые она импортировала, а код, который вызывает load(), сам присваивает этим объектам имена.
    #somemodule.py
    def load():
      import mymodule1
      import mymodule2
      return mymodule1, mymodule2

    А потом
    import somemodule
    mymodule1, mymodule2 = somemodule.load()


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

    Vindicar
    @Vindicar
    RTFM!
    В первой задаче всё достаточно просто.
    1) чтобы понять, насколько мы увеличим сумму чисел, достаточно посчитать сумму до и после преобразования. Так что задач сводится к "максимизировать сумму чисел, меняя в них цифры"
    2) Чтобы максимизировать сумму, надо максимизировать слагаемые. Так что нужно как можно сильнее увеличить числа, заменив одну цифру за раз.
    3) Как увеличить число как можно сильнее? Нужно заменить старший разряд в числе на девятку, это даст наибольший эффект.
    4) Тонкость раз: если старший разряд уже девятка, нам нужен следующий разряд, и т.д. пока не найдём НЕ девятку. Если число из одних девяток, его игнорируем.
    5) Тонкость два: если у нас есть числа 12 и 123, то больший эффект будет достигнут увеличением второго, т.к. у него старший разряд больше.
    6) Тонкость три: если у нас есть числа 123 и 456, то больший эффект будет достигнут увеличением первого, т.к. у него старший разряд имеет меньшее значение.

    Отсюда логика решения: для каждого числа ищем старший разряд, не равный 9. Фиксируем сведения о числе, номере разряда (единицы, десятки, сотни и т.п.), и цифре в разряде.
    В списке найденных "кандидатов на замену" убираем все варианты, где номер разряда меньше максимального в списке (т.е. если у кого-то можно заменить сотню, то десятки и единицы уже не рассматриваем). Этот шаг можно совместить с генерацией списка.
    Из оставшихся кандидатов ищем того, у кого цифра в разряде наименьшая. Эту цифру в этом числе и заменяем на девятку.
    Прирост числа, а значит и прирост общей суммы, будет равен (9 - старая цифра) * вес разряда. Например, заменили в сотнях 2 на 9, получим прирост (9 - 2) * 100 = 700.

    Процесс повторяем k раз, прирост накапливаем.
    Ответ написан
    Комментировать
  • Как создать интерфейс к уже существующему скрипту на Python?

    Vindicar
    @Vindicar
    RTFM!
    Вынесите основной функционал вашего скрипта в подпрограммы, типа
    def generate_emails() -> List[str]:
        'Генерирует список адресов почты.'
        ...
    
    def check_emails(emails: List[str]) -> List[bool]:
        'Получает список адресов почты возвращает список ответов "успешно или нет".'
        ...


    Потом пишете новый скрипт, в нём импортируете старый и используете эти функции.
    Чтобы создать GUI, посмотрите в сторону Tkinter, он в питоне есть из коробки и для простых задач подойдёт.
    Ответ написан
    Комментировать
  • Можно ли выйти сразу из всех функций?

    Vindicar
    @Vindicar
    RTFM!
    Вариант 1: Пусть функции возвращают значение типа bool, если оно истинное - то вызвавшая функция тоже должна прерваться.

    Вариант 2: выбросить исключение, поймать его там, где нужно остановить цепочку выходов. Имеет смысл описать своё исключение для такого, это несложно.

    Вариант 3:
    import sys
    sys.exit()
    Завершает работу скрипта. По факту, то же что и вариант 2, так как sys.exit() выбрасывает неотлавливаемое исключение.
    Ответ написан
    Комментировать