Задать вопрос
Ответы пользователя по тегу Python
  • Бьет ошибку в линии 11,в чем проблема?

    Vindicar
    @Vindicar
    RTFM!
    @bot.message_handler(commands=['start'])
    def start(message):
         markup = types.ReplyKeyboardMarkup(resize_keyboard= True,)
    item1 = types.KeyboardButton('Клик')
    markup.add(item1)
    bot.send_message(message.chat.id, f'Привет, {message.from_user. first_name}!', reply_markup=markup)

    Всё, что после markup = ..., уже не является частью функции startup(), так как отступ неверный. Учи Питон.
    Ответ написан
    Комментировать
  • Запутался в блоках if и циклах. Как исправить?

    Vindicar
    @Vindicar
    RTFM!
    У тебя только один цикл - повторять попытки ввода номера клетки, пока пользователь что-то не введёт. Больше он ничего не делает.
    Тебе нужен ещё один, который охватывает всю логику хода. Можешь сделать его вечным, и выходить из цикла по break, когда пользователь выиграет/проиграет.

    И да...
    locals()[numb + str(bomb_meaning)]
    Освой списки. Вот прямо сейчас отложи игру и освой списки.
    Ответ написан
    Комментировать
  • Цикл для обработчика кнопок?

    Vindicar
    @Vindicar
    RTFM!
    def handle_button(call_data: str):
            try:
                fileid = int(call_data) - 1  # определяем id файла по значению call_data
            except ValueError:
                return
            markup = InlineKeyboardMarkup()
            bttn_contact = (InlineKeyboardButton(text = " Связаться с менеджером", callback_data = "contact")) 
            markup.add(bttn_contact)
            bttn_home = (InlineKeyboardButton(text = " Начало", callback_data = "home"))
            markup.add(bttn_home)
            with open(f'data/{fileid}_info.txt', 'r', encoding = "utf-8") as file:
               content = file.read()
            # if тут не нужен, сработает и без него.
            for x in range(0, len(content), 4095):
                bot.send_message(call.message.chat.id,content[x:x+4095],reply_markup=markup)

    Ну а в обработчике просто дергаешь handle_button(call.data).
    Ответ написан
    Комментировать
  • Как решить эту задачу на python?

    Vindicar
    @Vindicar
    RTFM!
    Первая задача решается легко и непринуждённо.
    Рассмотри каждую кривую по отдельности, и реши, должна ли точка в искомой области лежать НАД кривой (y > f(x)) или ПОД кривой (y < f(x)). Объедини полученные условия операторами and.
    Ответ написан
    Комментировать
  • Чем отличаются условные операторы в Python?

    Vindicar
    @Vindicar
    RTFM!
    Поведение кода НЕ одинаковое.
    Если ты ввёл неправильное число, то первый код только выведет "конец игры", тогда как второй напишет "не угадал", а потом "конец игры". Что требуется по условию задачи - тебе виднее.

    А вообще я бы сказал, что правильно сделать иначе. У тебя два if подряд с противположными условиями - тут просится if-else.
    fathers_number = 5
    sons_number = int(input("Какое число я загадал? "))
    if sons_number == fathers_number:
        print("Угадал!")
    else:
        print("Не угадал!")
    
    print("Конец игры")
    Ответ написан
    1 комментарий
  • Как исправить "RuntimeError: There is no current event loop in thread"?

    Vindicar
    @Vindicar
    RTFM!
    Очевидно, webdriver использует под капотом asyncio, который требует дополнительных телодвижений при работе с потоками.
    В частности, нужно в начале потока сначала вызвать asyncio.new_event_loop(), потом её результат скинуть в asyncio.set_event_loop(). Доки.
    Ответ написан
  • Почему генератор yield начинает работу с последней страницы сайта?

    Vindicar
    @Vindicar
    RTFM!
    data = soup.find_all('div', class_= 'col-lg-4 col-md-6 mb-4')

    Ты перезаписываешь data на каждой итерации цикла, конечно там остаётся только последнее записанное значение. Совмести оба цикла внутри get_url() в один, иначе нет особого смысла в yield.
    Ответ написан
    Комментировать
  • Как парсить текст при помощи python-docx?

    Vindicar
    @Vindicar
    RTFM!
    1. Оформленный код в студию.
    2. Формат разбираемого текста фиксирован, т.е. он всегда выглядит одинаково? Если да, регулярные выражения в помощь.
    Если нет... ну можешь попробовать задействовать пакет Natasha, но это из пушки по воробьям.
    Ответ написан
  • Как записать данные в столбик в csv формате?

    Vindicar
    @Vindicar
    RTFM!
    file_writer.writerow([name, subscribers, type, price])

    Ну так ты просишь записать в одну строку, он и записывает в одну строку.
    file_writer.writerows(zip(name, subscribers, type, price))


    zip() превратит отдельные списки ([имя, имя, ...], [подписчики, подписчики, ...], [тип, тип, ...], [цена, цена, ...]) в последовательность значений ([имя, подписчики, тип, цена], [имя, подписчики, тип, цена], ...)
    Ответ написан
    1 комментарий
  • Как сделать так, чтобы бот телеграмм пересылал данные, которые ввел пользователь в другой аккаунт?

    Vindicar
    @Vindicar
    RTFM!
    Смотри в сторону Finite State Machine.
    Если коротко, твой бот должен для каждого пользователя помнить, на каком этапе он находится, и обрабатывать события соответственно.
    "Я получил сообщение от Васи. Вася сейчас на этапе ввода имени. Значит, нужно записать текст сообщения как имя, попросить ввести номер, и перевести Васю на этап ввода номера."
    Многие библиотеки для чатботов уже имеют ту или иную реализацию FSM, как раз для реализации таких вот сценариев. Читай документацию на ту библиотеку, которую ты собираешься использовать.
    Если у неё этого нет, или эта реализация тебе почему-то не подходит, то можно попробовать наколхозить её самому. Как я уже говорил, всё, что реально нужно - для каждого пользователя помнить, на каком этапе он находится.
    Ответ написан
    Комментировать
  • Как правильно одновременно запустить двух Telegram ботов одной программой на Python?

    Vindicar
    @Vindicar
    RTFM!
    Ну потому что ты фигню написал.
    th_bot = Thread(target=pyrobot(), args=())
    th_userbot = Thread(target=aiobot(), args=())

    Ты пытаешься запустить в качестве потока значение, возвращаемое функцией pyrobot(). А так как она уходит в цикл и значения не возвращает, то далее ничего не происходит. До вызова конструктора Thread() дело не доходит. С aiobot() аналогично.

    Еще раз:
    pyrobot() - вызов функции
    pyrobot - ссылка на функцию

    EDIT:
    Оба бота - асинхронные на базе asyncio, им для работы нужен цикл-реактор (event loop). Вообще не факт, что хорошая идея запускать их в потоках.
    Тут есть два варианта, сразу даже не скажу, что проще.
    Вариант А, лобовой: каждый бот создаёт своё собственные реактор через asyncio.new_event_loop(), потом задаёт его как текущий для своего потока через asyncio.set_event_loop(loop). Если ботам не требуется взаимодействовать, то это может быть проще. Если требуется... будут проблемы. Два реактора в одной программе - это не хорошо.

    Вариант Б, адекватный:
    И вызов app.run(), и вызов executor.start_polling(dp, skip_updates=True) скорее всего под капотом создают асинхронную функцию (корутину), и запускают её в реакторе. Тогда ты можешь обойтись без потоков, заставив обоих ботов работать на одном реакторе. Нужно будет зарыться в доки, или даже глянуть исходники.

    Например, для пирограмма написано такое:
    When calling this method (app.run()) without any argument it acts as a convenience method that calls start(), idle() and stop() in sequence. It makes running a single client less verbose.

    Т.е. вместо вызова app.run() ты можешь изменить код так:
    async def pyrobot():  # обрати внимание, теперь функция асинхронная!
        print("pyro started")
        @app.on_message(filters.chat("some_chat"))
        async def print_pyrogram():
            print("Pyrogram")
        # это вместо вызова app.run(), как написано в доках.
        await app.start()
        try:
            await app.idle()
        finally:
            await app.end()

    Затем делаешь аналогичный трюк с aiobot(). Нужно посмотреть в доках на аиограм, как именно.

    И потом запускаешь обоих ботов кодом вида...
    asyncio.run(asyncio.gather(pyrobot(), aiobot()))
    Ответ написан
    3 комментария
  • Как составить число n из элементов списка?

    Vindicar
    @Vindicar
    RTFM!
    Я бы решал задачу рекурсивно.
    Найди в списке все числа x, меньшие или равные n, определи их позиции в списке, отсортируй по убыванию числа.
    Если в списке есть x, равное n, ответ найден.
    Иначе перебирай числа по порядку, от больших к меньшим, и для каждого числа x пробуй убрать его из списка, а потом рекурсивно решить задачу для суммы n-x.
    Т.е. что-то типа:
    def compose_sum(numbers: list[int], total: int) -> list[int] | None:
        # ищем индексы потенциальных слагаемых
        indices = [i for i in range(len(numbers)) if numbers[i] <= total] 
        # сортируем по убыванию слагаемых, потом по порядку в списке
        indices.sort(key = lambda i: (numbers[i], i), reverse=True)
        # если нулевой элемент совпадает - мы нашли точную сумму. Прерываем рекурсию.
        if numbers[indices[0]] == total: 
            return [indices[0]]
        for index in indices: # иначе перебираем слагаемые
            numcopy = numbers.copy()
            # копия списка без рассматриваемого слагаемого
            current = numpcopy.pop(index)
            next_indices = compose_sum(numcopy, total - current)
            if next_indices:  # нашли решение, корректируем индексы (так как мы удалили один элемент)
                for i in range(len(next_indices)):
                    if next_indices[i] >= index:
                        next_indices[i] += 1
                return [index] + next_indices # отдаём наше решение "наверх"
            # next_indices пуст/None - решения не нашли, пробуем другой index
        return None # не нашли решения ни для одного index
    Ответ написан
    Комментировать
  • Почему выводит не совсем правильно?

    Vindicar
    @Vindicar
    RTFM!
    Ты забыл последнюю сторону многоугольника.
    p += len_seg(x[-1],y[-1],x[0],y[0])
    Ответ написан
    Комментировать
  • Как реализовать код диаграммы uml с стрелками зависимости и ассоциации?

    Vindicar
    @Vindicar
    RTFM!
    линия и пунктир с треугольной стрелкой самые понятные, они просто наследуют классы

    Неверно. Сплошная стрелка - да, наследует классы. Пунктир - это реализация интерфейса (в терминах Питона это скорее typing.Protocol). Т.е. при реализации один участник (с меткой interface) описывает методы без их реализации, а второй - их реализует.

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

    Это скорее коллекция и элементы. Разница между агрегацией (пустой ромб) и композицией (закрашенный ромб) простая. В случае композиции элемент не имеет смысла вне содержащей его коллекции. Например, чат и сообщения - если сообщение не может быть вне чата, это композиция. А вот, скажем, контакт и группа контактов - агрегация, так как контакт может рассматриваться и иметь смысл вне группы, в которую он входит.
    И агрегация, и композиция - это частные случаи ассоциации. В случае ассоциации одному или нескольким экземплярам одного класса сопоставляется один или несколько экземпляров другого класса. Например, у сообщений в любом чате есть автор - это ассоциация один-ко-многим.

    Зависимость - это когда один объект использует другой (имеет ссылку на другой), но в то же время их экземпляры не сопоставлены, т.е. связь между ними не имеет особого смысла с точки зрения решаемой задачи.
    Пример: окно, где показывается чат, и сам чат. Окно знает, какой чат оно показывает. В то же время одно окно может использоваться для разных чатов в разное время. Аналогично, один чат может показываться в разных окнах. Т.е. связь окно-чат не имеет какого-то особенного смысла. Сравни это со связью сообщение-автор.
    Ответ написан
  • Как импортировать с файла функцию, но чтобы этот файл не запускался?

    Vindicar
    @Vindicar
    RTFM!
    Заверни тело файла (непосредственный вызов функций) в конструкцию
    if __name__ == '__main__':
    Этот if выполнится, только если файл запущен непосредственно, и не выполнится, если он импортирован.
    Ответ написан
    Комментировать
  • Почему выдает ошибку Cannot choose from an empty sequence?

    Vindicar
    @Vindicar
    RTFM!
    visit = random.choice(urls)
    У тебя в urls пусто на момент вызова функции.

    urls = []  # в urls пусто
    
    # тут ты только определяешь функцию, но не вызываешь её
    def createlist(ids):
        global urls
        for id in ids:
            urls.append("https://scrap.tf/raffles/" + id)
    # так что тут urls всё ещё пуст
    # внутри login() вызывается rufflejoin(). А urls всё ещё пуст.
    login()
    Ответ написан
    Комментировать
  • Как отправлять текст соответствующий картинке в телеграм боте на Python?

    Vindicar
    @Vindicar
    RTFM!
    1. вынеси random.choice(os.listdir('test')) в переменную, например, img
    2. используй os.path.splitext(os.path.basename(img))[0], чтобы получить имя файла картинки без расширения
    3. Не забудь отправить файл через photo = open('test/' + img, 'rb')
    4. PROFIT
    Ответ написан
    2 комментария
  • Как сделать актуализацию данных?

    Vindicar
    @Vindicar
    RTFM!
    Используй on_conflict. Он позволяет как молча проигнорировать втавляемые данные, так и частично обновить существующую строку.
    Причем достаточно конфликта по ключу (id пользователя).

    Собственно, это хорошо работает, если тебе нужно просто хранить в базе всех, кто обращался к твоему боту.
    Если же тебе нужна именно своя регистрация (а тут надо дважды подумать - нужна ли? может, нафиг её?), то тогда сначала проверяй вручную, прошёл ли пользователь регистрацию.
    Ответ написан
    Комментировать
  • Как запускать Process в скриптах которые импорируются?

    Vindicar
    @Vindicar
    RTFM!
    AttributeError: Can't pickle local object 'start.<locals>.f1'

    Вынеси функцию, которую загоняешь в процесс, на верхний уровень модуля. Не делай её локальной в другой функции.
    Ответ написан
    Комментировать