Задать вопрос
  • Как сделать чтоб бот реагировал например на слово "привет" не зависимо будет ли что то после него?

    @Romeo558
    Продолжающий программист на python.
    if "привет" in msg:
         #код

    Правда тут загвоздка.
    Этот блок срабатывает если в сообщении так или иначе есть слово "привет"
    Пример:
    Привет мир! (условие сработает)
    Мир, привет! (условие тоже сработает)

    Кто то обязательно напишет корректный ответ, но это одно из решений
    Ответ написан
    2 комментария
  • Какое "time complexity" имеет операция list[element]?

    @deliro
    https://wiki.python.org/moin/TimeComplexity

    list в питоне — это по сути массив (точнее — вектор) указателей на *PyObject. Адрес начала известен. Размер элемента известен. Поэтому элементарная арифметика указателей адрес_начала + (sizeof(PyObject) * X) — за O(1)
    Ответ написан
    Комментировать
  • Вредна ли быстрая зарядка для аккамуляторов ПК/смартфонов?

    Да, вредно.
    Высокие токи создают дополнительную нагрузку на батарею и она быстрее лишается своего ресурса.
    По тому на многих смартфонах супер-быстрая зарядка включается вручную и есть фичи, что если ты дома, то ночью зарядка идёт на меньшей скорости

    Если тебе нужно быстро зарядить аккум, то выбора особо нет - используй быструю зарядку.
    Если можешь подождать - лучше не надо.
    Ответ написан
    1 комментарий
  • Как называются "\n","\r","\t"... в строках?

    paran0id
    @paran0id
    Умный, но ленивый
    В общем случае - escape sequences, управляющие последовательности по-нашему.
    Ответ написан
    Комментировать
  • Как сохранить объект на весь срок жизни приложения?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Безотносительно фреймворков. В любом приложении есть точка входа. Enty point. Или еще ее называет main - функция. Вот добавь туда конструирование объекта объекта и все.
    Ответ написан
    Комментировать
  • Как из fetchall() сделать строку?

    Vindicar
    @Vindicar
    RTFM!
    Как, как... Каком кверху!
    Итерируешься по списку через for row in cursor:, распаковываешь кортеж через login, pass = row (ну или по индексу login = row[0]), дальше с переменными делаешь что нужно.
    Азы языка! Если ты их не знаешь, какого баклажана берёшься за БД?

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

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

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

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

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

    @GofMan33333
    Вы можете создать класс, который будет хранить состояние ресурсов и предоставлять к нему доступ через свойства или методы. Вам может потребоваться реализовать синглтон-паттерн, чтобы обеспечить, что экземпляр этого класса существует только в одном экземпляре на всем протяжении существования приложения. Также вам может потребоваться защитить состояние ресурсов от неправильного использования, реализовав некоторые методы для доступа к ресурсам.

    В качестве примера:

    from threading import Lock
    
    class ResourceContainer:
        _instance = None
        _lock = Lock()
    
        def __new__(cls):
            with cls._lock:
                if cls._instance is None:
                    cls._instance = super().__new__(cls)
            return cls._instance
    
        def __init__(self):
            self._db_connection = None
            self._message_broker_connection = None
            self._config = {}
    
        def get_db_connection(self):
            return self._db_connection
    
        def set_db_connection(self, connection):
            self._db_connection = connection
    
        def get_message_broker_connection(self):
            return self._message_broker_connection
    
        def set_message_broker_connection(self, connection):
            self._message_broker_connection = connection
    
        def get_config(self):
            return self._config
    
        def set_config(self, config):
            self._config = config


    В этом примере создается класс ResourceContainer, который реализует синглтон-паттерн с помощью метода __new__ и мьютекса _lock. Он хранит состояние ресурсов (подключение к БД, подключение к брокеру сообщений, конфигурация) и предоставляет к ним доступ через методы get_* и set_*.

    Другие модули или функции могут получить доступ к экземпляру ResourceContainer так:

    def foo():
        container = ResourceContainer()
        db_conn = container.get_db_connection()
        # use db_conn
    
    def bar():
        container = ResourceContainer()
        config = container.get_config()
        # use config


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

    Vindicar
    @Vindicar
    RTFM!
    Ну для начала, проверка на вменяемость. Асинхронному боту для работы нужен рабочий цикл-реактор (event loop). Где и как ты его запускаешь, с учётом того, что Flask тоже требует рабочий цикл, а у тебя, вроде как, один поток?

    Я бы посоветовал использовать асинхронный веб-фреймворк. Например, доки на Flask упоминают Quart как максимально похожий, но изначально асинхронный фреймворк. Тебе всё ещё придётся разобраться, как параллельно запустить две длительные корутины (рабочий цикл Quart и рабочий цикл бота), но это уже решаемо. Вместо Quart можно использовать любой другой асинхронный веб-фреймворк.

    Альтернативно, можно запустить фласк и бота в разных потоках. Мешать асинхронность с многопоточностью - тоже та ещё идея, но если очень неохота уходить от Flask, то можно попробовать. Однако в этом случае нужно будет очень осторожно выполнять вызовы методов бота. В документации есть пример, как вызвать корутину в другом потоке ОС и дождаться ответа от неё.
    Ответ написан
    1 комментарий
  • Не открывается окно tkinter, почему?

    sergey-gornostaev
    @sergey-gornostaev Куратор тега Tkinter
    Седой и строгий
    Оно и не должно открываться, программа этого не делает.
    Ответ написан
    Комментировать
  • Болят глаза через 5-10 минут, что можно сделать?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Сходи к врачу. Боль в глазах может быть связана с внутричерепным давлением. У меня после Covid было такое что я видел вспышки в левом глазу. Все это - последствия чего-то там.

    Вобщем глаза - твоё здоровье и не слушай советы дилетантов по поводу монториов или шрифтов. У тебя - медицинская проблема и ее надо решать с медициной.
    Ответ написан
  • Нужно написать загадку используя python. Где я сделал ошибку?

    Замените or на and.
    По закону де Моргана not (A or B) = not A and not B
    Ответ написан
    1 комментарий
  • Нужно написать загадку используя python. Где я сделал ошибку?

    Maksim_64
    @Maksim_64
    Data Analyst
    Вообще подобные проблемы лучше решать так, вечный цикл и условие его прерывания.
    print('Какой знак зодиака больше всего боится самолётов?')
    while True:
        s = input('Введите ответ и нажмите Enter: ')
        if s.lower() == 'близнецы':
            break
    print('Вы отгадали загадку')


    Если модернизировать ваш вариант то нужно переделать условие следующим образом
    print('Какой знак зодиака больше всего боится самолётов?')
    s = ''
    while not(s == 'близнецы' or s == 'Близнецы'):
        s = input('Введите ответ и нажмите Enter: ')
    print('Вы отгадали загадку')


    Причина же почему ваш код не работает как ожидается (при введении правильных ответов прерывание цикла не происходит значение в цикле остается TRUE)
    Ответ написан
    Комментировать
  • Зачем нужен декоратор @dp и все в этом духе, типо @dp.message_handler() в aiogram?

    Vindicar
    @Vindicar
    RTFM!
    На пальцах: чтобы бот работал, его функции должны вызываться при наступлении определённых событий (например, входящего сообщения). Проблема в том, что aiogram знает о возможных событиях, но ему нужно сказать, какие функции когда вызывать. Обычно это называется "зарегистрировать обработчик".
    В питоне функции - объекты первого рода, т.е. их можно сохранять в переменные, передавать как параметры, возвращать как результат и вообще поступать с ними как с любым другим значением.
    Т.е. по идее можно было бы сделать так:
    async def echo(message: Message):
        text = f"Привет, ты написал {message.text}"
        await bot.send_message(chat_id=message.from_user.id, text=text)
    
    dp.register_function_for_message(echo)  # это не настоящий метод aiogram, только пример

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

    Но то же самое можно сделать через декораторы. Декоратор - это сокращённый вызов функции, которая принимает в качестве параметра другую функцию.
    Т.е. вот это
    @dp.message_handler()
    async def echo(message: Message):
        text = f"Привет, ты написал {message.text}"
        await bot.send_message(chat_id=message.from_user.id, text=text)

    абсолютно эквивалентно вот этому
    _decorator = dp.message_handler()
    
    async def echo(message: Message):
        text = f"Привет, ты написал {message.text}"
        await bot.send_message(chat_id=message.from_user.id, text=text)
    
    echo = _decorator(echo)

    Как видишь, очень похоже на "простую" регистрацию обработчика, но записывается чуть короче.
    Ответ написан
  • Как удалить слова из списка в строке, почему не работает?

    Vindicar
    @Vindicar
    RTFM!
    split() разбивает по пробельным символам. У тебя в списке list_of_words будет 'Москва.', а не 'Москва' и '.'
    Ответ написан
    2 комментария
  • Как сделать рандом в питоне?

    Maksim_64
    @Maksim_64
    Data Analyst
    import random
    round(random.uniform(1,5),2)

    Это будет выдавать десятичную дробь в диапазоне от 1 до 5, с двумя цифрами после запятой.

    (ОТРЕДАКТИРОВАНО) после небольшой проверки выяснилось что данный код иногда (редко будет выдавать) числа такие 1.1 или 2.3 что бы избежать этого написал вот такую функция которая всегда будет выдать случайное число с двумя цифрами после запятой.
    import random
    def get_random(a=1,b=5):
        while True:
            number = round(random.uniform(a,b),2)
            if len(str(number).split('.')[1]) == 1:
                continue
            else:
                return number
    Ответ написан
    2 комментария
  • Как исправить ошибку Selenium, возникающую на Mac?

    VoidVolker
    @VoidVolker
    Dark side eye. А у нас печеньки! А у вас?
    Наверное прочитать текст ошибки и выполнить указания? Там же четко и конкретно написано в чем проблема и что надо сделать.
    Ответ написан
    3 комментария
  • На 25 строчке при 2-ом повторении выдаёт NonType, почему и как поменять на int?

    shurshur
    @shurshur
    Сисадмин, просто сисадмин...
    Не надо так делать. Метод append изменяет список (добавляет в него элемент) и не возвращает никакого значения (или, что то же самое, возвращает None). То есть в результате такой записи мы добавляем элемент в список, а дальше этот список моментально выкидываем на помойку.

    week[g] = week[g].append(subj[gm])
    Ответ написан
    Комментировать
  • Почему могут не сохраняться новые данные в базу postgre?

    mayton2019
    @mayton2019
    Bigdata Engineer
    Забыл сделать commit.
    Ответ написан
    Комментировать