Ответы пользователя по тегу Python
  • Что не так? Почему не работает бот?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    Рекомендую выделить отправку email в отдельную функцию и отладить её отдельно от бота на сервере. Потом добавлять в бота вызов этой функции и уже тогда если будут проблемы, разбираться со связкой бот+email.
    Ответ написан
  • Как сделать изменяемую пременную?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    Попробуйте словами описать для самого себя, что происходит в программе пошагово. Хотя бы два-три цикла. При этом записывайте состояние переменных в табличку: в столбиках переменные, в строчках шаги. Когда дойдете до второго цикла, поймете, в чем дело.
    Ответ написан
    Комментировать
  • При вызове не работает функция. Как исправить?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    Причина - цикл while в функции forest никогда не выполняется. Почему - подумайте. Это просто.
    Ответ написан
  • Как разделить методы класса на модули?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    karmoed, модули - это файлы с расширением .py , содержащие инструкции языка Python.
    Модуль можно импортировать, при этом инструкции в нем выполнятся интерпретатором, а объекты, которые в этом модуле создаются при выполнении инструкций, могут добавиться при импортировании в область имен, в которую модуль импортировали.
    И там эти объекты можно использовать, как обычно.
    К примеру, класс User в модуле mymodul.py может быть импортирован в ваш код и использован в нем так:
    from mymodul import User
    
    user_1 = User()
    user_2 = User()
    user_1.name = “Vasja”
    user_2.name = “Masha”
    Ответ написан
    1 комментарий
  • Как написать print() с двумя текстами и двумя переменными, что бы текст и переменная разделялись запятой и на конце была точка?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    Используйте f-строки. Есть и другие варианты, но f-строки на мой взгляд наиболее наглядны.
    Ответ написан
    Комментировать
  • Как добавить новый элемент в список?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    У вас класс, в нем методы. Вы передаёте в методы класса экземпляр self. Класс нужен для того, чтобы его методами менять состояние атрибутов в экземпляре класса. А вы зачем-то используете методы класса как обычные функции, которые по-вашему должны что-то менять в каких-то глобальных переменных (типа ger53 в вашем коде).
    Это совершенная каша и неправильное использование классов.
    В самом примитивном случае правильное использование может выглядеть как-то так:
    class MyTestObj(object):
        def __init__(self):
            self.ger53 = []
        
        def test54(self, arg):
            self.ger53.append(arg)
        
        def __repr__(self):
            return str(self.ger53)
    
    my_instance = MyTestObj()
    print(my_instance) # обращение к экземпляру до изменения состояния
    my_instance.test54(42) # изменение состояния при помощи метода test54
    print(my_instance) # обращение к экземпляру после изменения состояния 
    print(my_instance.ger53[0]) # обращение к атрибутам экземпляра

    Есть и более изощренные способы, с геттерами/сеттерами, прочими изысками.

    Важно, что вы должны создавать экземпляр класса и менять его состояние, а не состояние чего-то вне класса.
    И если надо получить результат всех этих действий, то вы обращаетесь к этому же экземпляру класса либо напрямую к атрибутам экземпляра.
    Ответ написан
    Комментировать
  • Почему программа со списками в питоне выводит неверный ответ?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    data = [9, 8, 7, 7, 6, 3, 1, -2, -3, -7, -7, -9]
    counter = 0
    while not data[counter] < 0:
        counter += 1
    print(data[counter], counter)

    или
    data = [9, 8, 7, 7, 6, 3, 1, -2, -3, -7, -7, -9]
    for counter, temperature in enumerate(data):
        if temperature < 0:
            print(temperature, counter)
            break

    но я не очень люблю break, это субъективно.

    Ну и кривенький однострочничек:
    data = [9, 8, 7, 7, 6, 3, 1, -2, -3, -7, -7, -9]
    print(*[(temperature, counter) for counter, temperature in enumerate(data) if temperature < 0][0])
    Ответ написан
    Комментировать
  • Как сократить данный код?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    Тут много путей уменьшить код.
    Можно начать с того, что у вас многократно повторяется.
    К примеру,
    if message.text == '26.01':
            markup = types.ReplyKeyboardMarkup(resize_keyboard=True)
            bt1 = types.KeyboardButton('8:00')
            bt2 = types.KeyboardButton('9:00')
            bt3 = types.KeyboardButton('10:00')
            bt4 = types.KeyboardButton('11:00')
            bt5 = types.KeyboardButton('12:00')
            bt6 = types.KeyboardButton('13:00')
            bt7 = types.KeyboardButton('14:00')
            bt8 = types.KeyboardButton('15:00')
            bt9 = types.KeyboardButton('16:00')
            bt10 = types.KeyboardButton('17:00')
            bt11 = types.KeyboardButton('18:00')
            bt12 = types.KeyboardButton('19:00')
            bt13 = types.KeyboardButton('20:00')
            bt14 = types.KeyboardButton('21:00')
            back11 = types.KeyboardButton('Назад')
            markup.add(bt1, bt2, bt3, bt4, bt5, bt6, bt7, bt8, bt9, bt10, bt11, bt12, bt13, bt14, back11)
            bot.send_message(message.chat.id, text='Выберите удобную вам дату для записи', reply_markup = markup)

    повторяется несколько раз. Значит, этот фрагмент можно записать один раз и затем многократно вызывать, подставляя только меняющиеся элементы.

    Но и внутри видно многократное повторение нумерованной переменной, это явный признак плохого кода.
    Эту проблему можно решить разными способами. В данном случае, когда значения идут равномерно (час за часом), можно их просто сгенерировать, рассчитать, и поместить в список.
    Например:
    first_hour = 8
    last_hour = first_hour + 14
    buttons = [f'{current}:00' for current in range(first_hour, last_hour)]
    print(buttons)
    print(buttons[0])

    И этот список и передавать в нужное место вместо bt1, bt2, bt3, bt4, bt5, …

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

    Следует отметить, что вам пока рано заниматься ботами. Сделайте что-то попроще, калькулятор например, игру «быки-коровы»… я не шучу.
    Ответ написан
    Комментировать
  • Я преобразовал этот код из py в ехе, но теперь при запуске команды переменная n выводится не в файл, а в командную строк(cmd), что делать?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    Открытый в цикле файл надо в цикле же и закрывать после записи в него. Либо в цикле использовать with, тогда автоматически будет закрываться. Либо открыть файл до входа в цикл, а закрыть после выхода из цикла.
    Ответ написан
    Комментировать
  • Как сохранить шаблон сообщения при отправке телеграм ботом?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    Проблема в том, что в консоли шрифт моноширинный, а в телеграме - нет.
    Ответ написан
    2 комментария
  • RuntimeError: no running event loop, что делать?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    Попробуйте поменять asyncio.create_task(Song.my_after(ctx)) на await asyncio.create_task(Song.my_after(ctx))
    Ответ написан
  • Можно ли вызвать функцию так, чтобы перед её выполнением выполнилась ещё одна функция класса?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    В самом простом случае вызвать метод открытия из метода чтения.

    Наверное лучше сделать метод-декоратор, который до выполнения декорируемого метода открывает файл, а после - закрывает.
    Ответ написан
  • Как создать базу данных для пагинации в Telegram-боте?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    как она должна выглядеть, чтобы сработал этот код?
    она должна выглядеть, как список или кортеж.
    Ответ написан
    Комментировать
  • Указать регистрируемый экземпляр Message apscheduler с помощью ContextSchedulerDecorator?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    Указать регистрируемый экземпляр Message apscheduler с помощью ContextSchedulerDecorator?

    Указывайте, согласовано.
    Ответ написан
    Комментировать
  • Как два разных компа, подключенные к двум РАЗНЫМ WIFI, соединить с помощью python socket?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    Коротко:
    Чисто кодом это как правило не решить.
    длинно
    Разные Wi-Fi в подавляющем большинстве случаев означает «разные подсети», т.к. большинство устройств , раздающих wi-fi, это маршрутизаторы (роутеры), и они создают каждый свою подсеть со своей адресацией.
    Для того, чтобы из подсети одного достучаться в подсеть другого, нужно эти самые роутеры правильно настроить. Без этого практически никакой код не поможет (ну, почти никакой, но исключения лучше не рассматривать).

    Как именно настроить роутеры - это отдельный вопрос, к python отношения не имеет. Вам надо почитать про сети, маршрутизаторы, подсети, их адресацию, порты, «проброс» портов и всё вот это вот.

    Кроме этого, еще надо решить вопрос с внешними адресами этих роутеров. Эти адреса могут быть тоже в разных подсетях, и лучше, чтобы они были «белыми» адресами, а также чтобы не находились за «файрволлом» и/или чтобы нужные вам порты на внешних адресах этих роутеров были доступны из интернет. Белые адреса - услуга платная, предоставляет провайдер.

    Иногда можно обойтись без «белых» адресов через dynamic DNS, но тут могут быть проблемы с доступностью портов. Белые адреса обычно решают проблему.
    Ответ написан
    4 комментария
  • Register_next_step_handler указываю 2 аргумент как функцию, но выдает ошибку что это переменная и она локальная пишу после elif?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    Функция должна быть объявлена до использования. А у вас она объявлена после того, как вы ее пытаетесь передать как параметр другой функции.
    Более того, вы ее зачем-то объявляете в elif-ветке ветвления, что очень плохо. Пока условие этой ветки не сработает, этой функции вообще нет нигде. Очень сомнительное решение.
    Ответ написан
    6 комментариев
  • Почему так странно выделяется память под разные типы данных?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    c = (1, 2, 2+1)
    d = (1, 2, 2+1)
    print(id(c), id(d))


    А вообще-то не надо гадать. В книгах надо прочесть. Например, «Изучаем Python» М.Лутц
    Ответ написан
  • Как пофиксить ошибку?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    Как пофиксить ошибку?

    Очень просто. Три простых шага:
    1. Открываем документацию
    2. Читаем название большими буквами:
    Building Linux System Appliances with KIWI Next Generation (KIWI NG) 9.24.56

    3. Понимаем, что это библиотека под Linux; предназначена для сборки образов LINUX; кроме того, догадываемся, что KIWI, QIWI и KIVY это три больших разницы.
    Ответ написан
    Комментировать
  • В Pycharm код выполняется, из винды нет, почему?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    В принципе можно запустить Python в интерактивном режиме и сделать импорт вашего скрипта. Пусть ваш скрипт называется my_script.py
    C:\>python
    >>> import my_script
    Имя:_
    ну и так далее. Для простого скрипта, вероятно, сойдет и так.

    Но есть нюанс:
    Если скрипт должен использовать установленные библиотеки, то в ide они ставились в виртуальное окружение. В консоли это виртуальное окружение надо активировать, чтобы указанная в окружении версия Python и библиотек стала доступна.
    Ответ написан
    Комментировать
  • Как запустить скрипт с ошибкой при нажатии на него?

    phaggi
    @phaggi Куратор тега Python
    лужу, паяю, ЭВМы починяю
    Google борется с рассылками и спамом, а ваш код именно это и реализует. Даже не пытайтесь. Забанят вас накрепко, не выкарабкаетесь потом.
    Ответ написан
    Комментировать