Ответы пользователя по тегу Python
  • Что почитать для реализации автоответчика в виде бота реагирующего только на слова (триггеры)?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Почитайте Марк Лутц - "Реализуем автоответчик в виде бота, реагирующего только на слова-триггеры" - том 1, 5 издание, 2019 год.
    Нет, ну вы серьёзно сейчас?
    Учитесь программировать и ваши вопросы отпадут. Можно по книжке указанного выше автора, но название "Изучаем Python".
    Неужели вы думаете вам кто-то для нулевого уровня напишет подробное руководство по написанию "бота, реагирующего на слова"? Это тривиальная задача для тех, кто уже научился программировать.
    Ответ написан
    3 комментария
  • Почему возникает ошибка TypeError: function missing required argument 'vars_list' (pos 2)?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    У вас значений 7, а плейсхолдеров для подстановки 8. Не хватает одного параметра, о чем вам английским по терминалу по человечески пишется в сообщении об ошибке:
    TypeError: not all arguments converted during string formatting

    Что тут не понятно?
    Если делаете executemany то вторым аргументом должен быть итерируемый объект с векторами аргументов.
    Ответ написан
  • Как сделать, чтоб код обращаясь к postgre в постоянно режиме проверял бы наличие новых элементов в таблице и при их наличии передавал бы их в очередь?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Можно запускать этот скрипт по крону, как посоветовали выше, можно делать извлечение записей из БД в цикле.
    Если у вас целочисленный идентфикатор у записей, то запоминаете максимальный полученный идентификатор записи ив следующий раз селектите все записи, что больше этого идентификатора. Тогда не придётся важды извлекать из БД одни и те же записи, а если заисей нет, то выборка будет по индексу и произойдёт очень быстро с пустым или небольшим результатом.
    Если целочисленного идентификатора нет, то можно завести автоинкрементальное поле или таймштамп, по котоому будете фильтровать уже обработанные записи.
    В чем конкретно у вас проблема? Если вы написали выше риведенный код, но не догадались и не сделали попутку засунуть его в цикл, то, сомневаюсь, что это написали вы.
    Здесь вам не напишут готового кода, за ним нужно идти к фрилансерам. Задавайте конкретные вопросы и вам помогут.
    На общие вопросы - общие ответы, и то если не слишком рстранный вопрос. Никто лекцию тут читать по азам и основам не нанимался.
    Детализируйте ворос и как следует оформляйте код, пожалуйста.
    Ответ написан
    Комментировать
  • Выделяется ли память при использовании срезов в цикле в Python?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Причем тут цикл? Срез срезу рознь.
    При срезе списка выделяется по размеру среза, но если результат среза никуда не сохранён, то это короткоживущий объект и он будет освобождён быстро.
    Если речь о кортежах и строках, то они иммутабельны и тут вполне возможно не копировать данные, а ссылаться на сущетсвуюшие отрезки. Надо глянуть под капот в исходники, чтобы убедиться. Под любой новый объект так или иначе выделяется память, но в случае мутабельных сипсков срез гарантировано копируется.
    Ответ написан
    2 комментария
  • Как четко определять название города в именительном падеже, когда пользователь этого не делает?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Посмотрите в сторону сервиса дадата
    Ответ написан
    1 комментарий
  • Как правильно сократить код и сделать его понятным?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    def button_callback(call):
        actions = {
            'hlep': bulk,
            'souss': souss,
            'vasabi': imvs,
            'palki': palk,        
        }
        fn = actions.get(call.data)
        bot.answer_callback_query(call.id)
        if fn:
            bot.send_message(call.message.chat.id, fn, parse_mode='html', reply_markup=button)
        elif call.data == 'button1':
            bot.send_message(call.message.chat.id,text = "Простите, автор-оладушек и еще не реализовал эту функцию")


    И наведите порядок с отступами. Если они такие и есть в вашем коде. то всё плохо. Приводите код на pastebin
    Ответ написан
  • У меня не выводит сложение всех чисел, как найти?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Дык тут нет сложения всех чисел, только сумма последней строки и бесполезный проход по всем элементам матрицы.
    Правда не понятно нахрена ты вложенный цикл в конце делаешь. если выше использовал уже sum.
    Не понятно зачем линию рисовать в цикле, если строку можно умножить на число и она повторится нужное количество раз.
    Ответ написан
    Комментировать
  • Зачем нужно наследование от потока в питоне?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    А для чего вы вырезали куски кода в методах? Там вполне может быть ответ на ваш вопрос, а нам как-то гадать надо на кофейной гузе?
    К примеру в NodeConnection.__init__ вызывается наверно конструктор через super и туда вполне может быть передан target, а там может быть что угодно полезное и нужное, что обясняет ситуацию.
    Почему не вставить полностью код для ясности?
    UPD.
    Наследование от треда здесь применяется потому, что каждый NodeConnection породит свой поток, в котором будет вычитываться свой инкапсулированный сокет) в который кажому инстансу NodeConnection передаются какие-то данные.
    Можно было сделать просто отдельный класс и в него инкапсулировать и сокет и тред, но автор выбрал сокет инкапсулировать в тред.

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

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Ну, во-первых, вы возвращаете тот же список, что принимаете на входе, а новый сформированный никуда не возвращаете.
    Во-вторых, вы оставляете строки, которые имеют две подряд идущие русские буквы, а если букв будет две, но между ними будет пробел, или английская, или цифра, то вы такую строку проклассифицируете неверно. Регексп у вас не соответствует задаче.

    И вам не надо искать все вхождения, достаточно первого признака. Грубо говоря, ам надо искать в строке русскую букву, за которой идёт что угодно и сколько угодно раз (даже ноль раз), а затем идет еще русская буква. Если такая подстрока нашлась, строку надо оставить, иначе пропустить.

    Правила этого ресурса запрещеют постить код скриншотами. Нужно постить его текстом в специальном теге или в виде ссылки на онлайн интерпретатор с кодом.
    Ответ написан
  • Как написать "62 рубля 00 копеек", и "37 рублей 12 копеек"?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    А что конкретно вам не понятно в этой задаче? Это не биржа фрилансеров и никто вам не будет делать готвого решения, поэтому задавая вопрос нужно показать как вы сами пытаетесь решить свою проблему, и вам покажут где вы не правы.

    Ну давайте резберем вашу задачу на части. Это называется декомпозиция. Любые задачи нужно решать начиная с декомпозиции - разбиения на более простые подзадачи.

    Итак, в чем проблема? Вам не ясно как число разбить на целую и дробную часть? Окей, ещё глубже декомпозируем: вам не ясно как отбросить дробную часть, чтобы получить число рублей? Или вам не ясно как получить целое число копеек?

    Допустим это вы сделали. Что вам ещё не ясно? Как правильно согласовать два слова с числами?
    Ну так в школе это изучается. Вроде ж всё просто. Есть всего три варианта: "рублей", "рубль", "рубля". Обычно эти варианты принято нумеровать: 0 - рублей, 1 - рубль, 2- рубля.
    Да, с 2 до 4 - это то же самое, что 2 (рубля). Ноль, а также с 5 до 19 - это то же самое, что 0 (рублей). Осталось получить остаток от деления числа на 20, привести это к по формуле выше к одной и трёх цифр и получите нужный вариант словоформы.
    Выходит для любого слова, которое нужно согласовать с числительным, нужно предусмотреть три варианта и сделать функцию, которая будет их правильно выбирать в зависимости от числа.
    Да, там могут быть ещё варианты с падежами и родами, но это не про ваш случай.

    Ок. что е вам ещё может быть не ясно? Как подставить в текстовый шаблон параметры?

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

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Приглашения к вводу данных не соответствуют заданию.
    Не использованы средства шаблонизации, которые предоставляет язык рограммирования.
    Оформление кода не соответствуют требованиям PEP8.
    Не предусмотрено согласование количества дней и ночей с окончанием слов "ночей" и "дней" в шаблоне. При числах 1,2,3, 4, 21, 22 и т.д., окончания будут неверными.
    Ответ написан
    Комментировать
  • Kак сделать иммутабельный список?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Вы меня удивляете, сударь.
    Вроде не новичок и понимаете концепию иммутаельности, передачи аргументов по значению и по ссылке, но с непониманием элементарной базовой особенности языка вы идёте задавать тривиальный вопрос у живых людей, когда самые-самые новички знакомятся с этим в первых главах любой книжки про питон для чайников.

    К питону не применимы понятия "передачи аргументов по значению" или "по ссылке".
    В Питоне переменные раотают иначе, чем в Си или Паскале.
    Переменная в Си - это ящичек, куда вы что-то можете положить. В том числе в ящичке может лежать ссылка на другой ящичек.
    В питоне переменная больше похожа на ярлычок, привязанный к объекту. Число, строка, список, словарь, класс, инстанс класса, None, ... - всё это объекты и они лежат где-то в памяти.
    Какие-то объекты мутабельны, какие-то иммутаельны, но это не важно. У любого объекта может быть много ярлычков (например имен). Также ярлычком будет элемент списка, ключ или значение в словаре и т.д.
    От обычного указателя в си это отличается тем, что его не нужно разыменовывать, чтобы обратиться к объекту. Употребляем имя - подразумеваем значение. Присвоение перевешивает ярлычок, удаление удаляет ярллычок.
    Да, чем-то это смахивает на смартпоинтеры, но не полностью.
    Да, в питоне не принято изменять мутабельные входные параметры. По крайней мере можно яно скопировать мутабельный объект поверхностно или глубоко. Для этого есть специальные методы или функция copy.

    Ох и предстоит вам еще поудивляться побочному эффекту мутабельности в дефолтных значениях аргументов функций.

    Подавите свои амбиции и прочитайте хотя бы бегло какую-нибуь книжку по питону. Вам можно даже не шибко детскую.
    Ответ написан
  • Aiogram Message is not modified как исправить?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Вы пытаетесь в цикле поменять текст сообщения на тот же самый текст.
    Протокол телеграмма не позволяет этого делать, потому что это бессмысленно.
    Вы можете:
    1) помнить предыдущий текст и сравнивать новый с ним, чтобы вызыватьредактирование только если текст изменился.
    2) Перехватывать и игнорировать MessageNotModified, если считаете, что эта ситуация будет редкой и лишний трафик на сервера телеги вас не беспокоят.
    3) Вы можете чисто логически не редактировать сообение, если исходные параметры его не поменялись.
    4) вы можете гарантированно менять исходные параметры сообщения, чтобы оно гарантированно изменило текст.

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

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    нио каком 'return' тут речь быть не может. Это calback.
    Если ваш "основной код" работает в том же потоке, то можете сделать глобальный обьект (синглтон), который будет "виден" на уровне модуля и в on_message и в вашем "основном коде". В него вы затягивайте сообщения, а в другом месте их вынимаете. Для этого очереди и существуют.
    Если речь идёт о разных потоках, то так не получится. Тогда оптимально будет поднять внешнюю очередь, например RabbitMQ и пользоваться ею. Но судя по вашему вопросу, знаний у вас пока не хватит на это. Подучить бы сперва питон на более простых вещах.
    Ответ написан
    1 комментарий
  • Как спарсить svg картинки?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Нужно приводить полный стек трейс ошибки, а не только её текст.
    Вам нужно разбить imglink по вопросительному знаку и взять только левую часть.
    Ответ написан
    Комментировать
  • Почему программа не записывает данные в CSV файл?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Ваш код записывает данные в файл, просто вы выбрали символ-разделитель зачем-то именно этот.
    Возможно ваш эксель его не понимает как таковой.

    63727c6f21376150389635.png
    Ответ написан
    Комментировать
  • Как работать с конструкцией try except?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Сделайте ещё один вложенный цикл для попыток обработки каждого из элементов. Можно при успешном выполнении без ошибок выходить из внутреннего цикла досрочно, а при ошибке не выходить досрочно и цикл будет повторять попытки.
    Если бы у вас было побольше опыта программирования на питоне, я бы посоветовал бы вам вынести обработку одного элемента в отдельную функцию, а еще посоветовал бы поупражняться в написании декоратора `retry`, который будет оборачивать любую функцию в новую функцию и в случае ошибки повторять её запуск пока не будет исчерпан лимит попыток.
    По-моему такой пример или упражнение, кстати, и было в одной из книг Лутца. Но вам подойдёт практически любая, где рассматриваются основы языка.
    Ответ написан
    2 комментария
  • Можно ли написать OS на Python?

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

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

    Простой ответ - нет, питон не предназначен для написания ОС, но использовать его для разработки большОго количества элементов ОС можно.
    Ответ написан
    2 комментария
  • Почему при обращении к @classmethod возникает NameError: name 'cls' is not defined?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    cls и self - это никакие не префиксы, а обычные перемнные. Они поступают в виде первого аргумента метода.
    Вы даже назвать их можете по-другому и ничего не поломается.
    Попробуйте, всё-таки, почитать книжку по питону по порядку, а не действовать методом тыка и не гадать на кофейной гуще.
    В функции zas у вас нет переменной cls, отсюда и NameError.
    Получить класс объекта можно с помощью функции type: type(self).infield()

    Ну и да, судя по всему, вы не поняли до конца для чего нужны классовые методы, а для чего обычные.
    Ктсати, Test().zas() отработает вполне корректно, не смотря на то, что это классовый метод, а вызывается он у инстанса. Просто классовому методу будет передан в аргумент класс, а не инстанс.

    Серёьзно. Бросайте пытаться разбираться в этом методом тыка и вопросов на QnA. Там дальше наследование, полиморфизм, множественное наследование, метаклассы... Вы всех задолбаете и будете этим заниматься целую вечность
    Ответ написан
    1 комментарий
  • Случайно число от 0 до 5 и присвоить значение переменным?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Само собой не работает. Сплошные синтаксические ошибки в коде, отступов нет, некорректная работа с типами.
    Надо читать книжку по питону для чайников с самого начала. Это единственный путь.
    Ответ написан
    Комментировать