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

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    pogoda = pogoda.replace(' ', '-')
    Или в чем проблема?
    Ответ написан
  • Как сделать плейлист?

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

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Самый простой вариант - это забирать с ротуера логи и из них забирать инфу о подключении. Если это ваша сеть, то и настройки роутера вам доступны, а значит вы можете их анализировать.
    Если по какой-то причине нет возможности получать логи с роутера, то можно периодически сканировать локалку на предмет поиска новых компьютеров. Не важно на каком языке вы будете обрабатывать выхлоп утилит вроде nmap. Как этой и аналогичными утилитами просканировать сеть - это отдельный вопрос.
    В самом простом слуае вы можете написать на питоне утилиту, парсящую выхлоп nmap и перечень IP и mac-адресов кладущую в sqlite или тупо дописывающую в csv. Отдельной утилитой можно фильтровать получившийся журнал за указанные интервалы времени.
    Ответ написан
    Комментировать
  • Как сделать работу django и pyrogram одновременно?

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

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

    Нештатные иключения игнорировать и гасить - плохая идея. Каждое нештатное (непредусмотренное) исключения должо вести к поадению программы с подробным тейсбэком, который показывает где и почему произошла ошибка. Поняв из-за чего произошлоа нештатная ошибка, вы сможете либо устранить ошибку в коде, которая к ней приводит, либо обработаете её особым образом на нужном уровне так, чтобы эта ошибка стала штатной.

    Если ваш скрипт должен во что бы то ни стало работать и никогда не падать в продакшн-режиме, то можно поступить так:
    По факту KeyboardInterrupt делайте её рерайз. Остальные ошибки подробно логируйте и двигайтесь дальше:
    for item in items:
        try:
            ...
        except KeyboardInterrupt:
            raise
        except Exception as e:
            with open('errors.log', 'a') as log:
                log.write(f'{e}')
                # сюда же можно вывести трейсбэк, но я бы воспользовался стандартным логированием, чтобы не изобратать велосипед, однако его конфигурирование выходит за рамки данного отета.
    Ответ написан
    Комментировать
  • Как разбить массив на подмассивы используя "0" как разделитель?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Без сторонних либ я бы делал так:
    def split0(arr: list) -> list:
        res = [[]]
        for x in arr:
            res[-1].append(x) if x else res.append([])
        return res

    А вот для любителей функциональщины:
    from itertools import takewhile  
    def split0(a): 
        it = iter(a) 
        return [[x for x in takewhile(bool, it)] for _ in range(a.count(0) + 1)]
    Ответ написан
    2 комментария
  • Как перебрать все возможные варианты?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    [''.join(letters) for letters in itertools.product(string.ascii_uppercase, string.ascii_uppercase)]


    То же, но красивенько:
    [
        ''.join(xy)
        for xy in itertools.product(*(string.ascii_uppercase,) * 2)
    ]
    Ответ написан
    1 комментарий
  • Как преобразовать список в диапазон?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    years[1] += 1
    range(*years)

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

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

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Все типы данных - это классы, но не все классы - это типы данных. Хотя классы - это типы=) но не буду вас путать.
    "map, range, срез" - это не типы данных.
    Полагаю в том вашем вопросе од типами жанных имеют в виду простые типы вроде строк, чисел с плавающей точкой, целых чисел и даже комплЕксных.
    Кортежи (tuple) и словари (dict) - это уже структуры данных, коллекции... как угодно. Да, технически это тоже классы и в каком-то смысле их можно назвать типами, но все эти терминологические дебри вам ни к чему.
    Просто считайте типами данных атомарные значения простых типов. Если к вам докопаются при таком понимании, то надо таких слать=).
    Дальше интереснее. range, к примеру, это класс, инстанс которого "умеет" делать генератор арифметических последовательностей. Вот это вот слово "умеет" связано с питоновским понятием протоколов. К примеру, если к объекту можно обратиться по индексу, значит он поддерживает соответствующий протокол __getitem__. Если объект поддерживает срезы, то в этот метод можно подать специальный объект - инстанс slice. Этот инстанс просто несёт три параметра среза (начало, конец и шаг), а как его будет применять объект - это на откуп программисту.

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

    Просто доверьтесь одному из учебников и не пытайтесь перепрыгнуть через голову.
    Ответ написан
    3 комментария
  • Как в Python Datetime сделать так, чтобы менялся год и месяц?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Можно подобрать одну из хороших мощных библиотек для удобной работы с дантами, чтобы там были методы перелистывания дат помесячно.
    Но если не хочется плодить зависимости, то я рекомендую штатно разобрать дату на день, месяц и год, убедиться, что день не превышает 28 (иначе такое число не в каждом месяце найдётся), а затем прибавить к месяцу 1 по модулю 12. В случае переполнения нужно увеличить еще и год.

    Такое элегантно записыается с помощью функции divmod:
    month -= 1
    year_increment, month = divmod(month + 1, 12)
    month += 1
    Ответ написан
    Комментировать
  • Что такое range() в Python 3?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    В целом всё верно. range реализоан как класс, при его инстанцировании (или вызове в качестве функции. что в питоне, суть, одно и тоже) формируется инстанс этого класса, который поддерживает протокол получения итератора.
    Если воспользоваться этим протоколом (iter(range(3, 33))), то получим итератор - инстанс класса range_iterator.
    Ещё инстанс range позволяет получать доступ к элементам по индексу, делать срезы, инвертировать, получать количество элементов, проверять на вхождение элемента и т.д.
    Ответ написан
    1 комментарий
  • Как удалить отступ добавляемый help для docstring?

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

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Тут, похоже, имеется непонимание, как в питоне устроены переменные и чем они отличаются от переменных (и отчасти указателей) в Си.
    В Си (и не только, в паскале, например, тоже) переменная - это коробочка, которая уже есть и в неё можно что-то положить подменив какой-то мусор, который там был раньше, потом её содержимое можно заменить.
    В Питоне переменноая похожа на ярлычок. Ярлычок - это имя, а всё вокруг - это объекты. На один объект можно повесить много ярлычков (представьте себе ярлычок от чайного пакетика). Каждый ярлычок - это отдельное имя или позиция в списке, кортеже, словаре...) Обхект один, а ссылок на него может быть много. Ярлычок можно уничтожить или перевесить на другой объект. Когда не остаётся ни одного ярлычка, привязанного к объекту, он становится кондидатом на удаление и освобждение памяти.
    Вам в соседнем ответе показали как можно элегантно обменять именами два объекта в питоне. Да, именно, поменяются местами имена, но объекты как были так и останутся. Это как поменять таблички на кабинетах директора и главбуха.
    Так что отчасти все переменные в питоне - это умные слабые ссылки.
    Ответ написан
  • Как выбрать хостинг для бота на Python?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    На firstvds.ru уже несколько лет держу минимальную машинку за ~200р/мес.
    Хватает на небольшой сайт на вордпрессе, тррентокачалку, раздачу аудиокниг родственникам в виде mp3 и rss фидов, и, иногда, даже майнкрафт сервер на нём поднимаю на троих детя.
    Всё запускается в докер-контейнерах. Сам в шоке, что оно там ещё и шевелится и помещается в памяти.
    Даже засомневлся, но нет, действительно гиг оперативы.
    В общем берите минимальную тачку на KVM в пробном режиме, если всё заведётся и поместится, просто будете платить, а нет - выберете машину помощнее. Мало ли что ваш бот там делает, может картинки нейронной сеткой обрабатывает...
    Есть несколько ресурсов в сети, которые помогают выбрать VPS. Вот попался с первой попытки: https://poiskvps.ru/
    Ответ написан
    Комментировать
  • Как реализовать проверку чисел на близость?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    min(x/num[-1] for x in num[:-1])
    Но что вы этим хотели добиться. я так и не понял: num.*
    Ответ написан
    2 комментария
  • Чему равен параметр i после объявления lambda функции?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    После объявления ничему.
    Функци в питоне - это объект первого рода, до её вызова аргументы не определены и контекст не создан, а создаётся контекст при каждом вызове.
    Ответ написан
    2 комментария
  • Как задеплоить телеграм бота на VPS?

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

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

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Можно заменить список на множество для начала:
    def checkPrime(start, end):  
        numbers = set(range(start, end + 1))  
        for i in range(2, int(end ** 0.5) + 1):  
            for j in range(i * i, end + 1, i):  
                numbers.discard(j)  
        return sorted(numbers)

    Если упорядоченность не нужна, то можно и сортировку убрать.
    Ответ написан
    6 комментариев
  • Найдите все пифагоровы тройки, в которых все числа находятся в диапазоне [1; 5000]?

    trapwalker
    @trapwalker Куратор тега Python
    Программист, энтузиаст
    Начните с самого простого не оптимизированного решения:
    Вам нужно перебрать все целые A от 1 до 5000. Для каждого такого A вы можете перебрать все целые B от A+1 до 5000. Если корень из суммы их квадратов - целое число, то это, очевидно, тройка пифагора. Но вам нужно, чтобы C было меньше или равно 5000.
    Для отимизации вы можете не спешить извлекать корень, а сперва проверить его на превышение 5000*"2. Так вы немного сэкономите. Ещё вы каждый раз можете вычислять правую границу внутреннего цикла, так вы будете искать решение среди вдвое меньшего количества вариантов.
    Не знаю какие там требования сейчас по эффективности решения задачь, но для школьников такое решение я бы считал приемлемым. Да и не для школьников. Хотя н апитоне такая задача будет считаться с десяток секунд без оптимизаций. Однако временнЫе ограничения не были озвучены. Эдак и методом Монтекарло можно решать=)
    Ответ написан
    7 комментариев