jenyay.net
292 subscribers
150 photos
1 video
2 files
299 links
Программирование (в основном на Python, но не только), Open Source, а ещё сюда публикую новости своего сайта https://jenyay.net

Для связи с автором канала пишите на @jenyay
Download Telegram
Переписал еще одну древнюю статью про использование библиотеки Matplotlib - "Применение объектно-ориентированного стиля" (https://jenyay.net/Matplotlib/Objects ).

В ней рассказывается о том, какие есть способы ее использования, начиная с устаревшего модуля pylab, использование функций из модуля matplotlib.pyplot и использование более низкоуровневых объектов Figure, Axes, Line2D, Legend и др.

И кажется, это последняя статья, которую нужно было обновить. Теперь можно писать новые, и у меня уже есть наброски для будущих статей на эту тему.

#программирование #python #matplotlib
👍4🔥3
✏️ Переписал еще одну статью про Matplotlib.

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

Новую версию по сути переписанной заново статьи вы можете прочитать по ссылке — Как рисовать графики в разных окнах.

Все статьи про рисование графиков в Python с помощью библиотеки Matplotlib можно увидеть по ссылке — Использование библиотеки Matplotlib.

#программирование #python #matplotlib
👍5🔥1
Начинаю читать вот эту книжку. Как только ее осилю, напишу что-нибудь про нее в блог.

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

#книги #python #программирование
👍5
Недавно прочитал книгу "Сверхбыстрый Python", которая посвящена вопросам оптимизации скриптов при обработке больших данных на Python. В ней автор приводит множество путей ускорения программ, когда скорость работы интерпретатора уже не устраивает, но все переписывать на Rust еще не хочется.

Более подробно о книге с разбором каждой главы написал в блоге - https://jenyay.net/blog/2024/03/02/kniga-tiago-antao-sverkhbystryjj-python/.

#книги #программирование #python
👍8
Обновил свою старую статью про алгоритм роя частиц, который предназначен для оптимизации функций. В этой статье помимо описания алгоритма прилагаются его реализации на Python и C#.

Статья была написана в далеком 2011 году, и поэтому исходники были рассчитаны на Python 2.x и на C# под .NET 2.0, и это вызывало сложности у читателей. Теперь обновил исходники на Python, а проекты на C# мигрировали на Visual Studio 2022 и .NET 4.8. Код на C# почти не менял. Еще, если раньше исходники лежали на сайте в виде файла zip, то теперь перенес их в два репозитория на github (отдельно реализацию на Python, отдельно на C#).

Когда брался за исправление статьи, думал, что сейчас будет желание полностью ее переписать, но как ни странно, такого желания не возникло, и в текст статьи вносил только небольшие косметические правки, а формулы сделал в виде картинок.
#алгоритмы #python #dotnet #оптимизация
👍7🔥4😱1
Вышел NumPy 2.0 - библиотека для математических расчетов в Python. В новой версии разработчики немного поломали обратную совместимость, так что аккуратнее с обновлением.

На opennet хорошо написано, что изменилось в новой версии.

#python #numpy
👍3🔥2
В процессе развешивания белья после очередной стирки я задумался о вечном - почему на выходе из стиральной машины всегда получается нечетное количество носков? И если бы я писал код для подсчета количества носков после стирки, то как бы он выглядел?

Наверное, требования к функции должно выглядеть так: на вход подается n, если n изначально нечетное, то такое значение и оставить, а если четное - то увеличить или уменьшить его на единицу.

Математически, чтобы не писать условия, функция получилась такая: f(n) = n ± ((n + 1) % 2)

В коде надо будет использовать генератор случайных чисел для выбора того, исчезнет "лишний" носок, провалившись в другое измерение или материализуется из него. Код получился такой:

>>> from random import choice
>>> def socks_count(n):
return n + ((n + 1) % 2) * choice([-1, 1])
>>> socks_count(4)
3
>>> socks_count(4)
5
>>> socks_count(3)
3
>>> socks_count(3)
3
>>> socks_count(5)
5


Интересно, что с другими видами одежды такое не срабатывает, но для реализации такой проверки типов в коде уже надо использовать ООП, а мне в данный момент не настолько нечем заняться. :)

#юмор #python
😁9
Листая на днях документацию по модулю math в Python, неожиданно заметил, что помимо привычных констант e = 2.72 и pi = 3.14, начиная с Python 3.6, появилась еще одна константа tau = 2𝜋.

Полез читать Википедию на предмет того, что это за константа и зачем она нужна. Оказалось, что в начале 2000-х некоторые математики решили ввести константу 𝜏, равную отношению длины окружности к ее радиусу (в отличие отношения длины окружности к ее диаметру для 𝜋). Эта константа по их задумке должна заменить 𝜋 в большинстве задач.

Добавление 𝜏 они объясняют тем, что 𝜋 - не самый удачный выбор для одной из основополагающих констант, потому что поворот на угол 𝜋 - это поворот только лишь на половину окружности, и из-за этого во многих выражениях встречается сочетание 2𝜋, и постоянно приходится то умножать, то делить на 2. Например, круговая частота ω=2𝜋f, а с новой константой полный оборот - это 𝜏 радиан, половина окружности - 0.5𝜏 и т.д. Тогда та же круговая частота была бы равна ω=𝜏f, а формулу Эйлера можно записать как exp(i𝜏) = 1.

В 2010 даже появился манифест в поддержку 𝜏 - https://tauday.com/tau_manifesto.pdf.

Как я понимаю, эта идея до сих пор остается еще достаточно маргинальной, и из школьных учебников пока никто не собирается убирать упоминание 𝜋 в пользу 𝜏. Но вообще любопытно.

#математика #python
👍12
#python. В последнее время стал с интересом наблюдать за проектом uv ( https://github.com/astral-sh/uv ). Разработчики этой программки поставили перед собой амбициозную цель не только сделать очередную утилиту для управления виртуальными окружениями, но и покусились на святое - на pip. Пока uv умеет не очень много, но его уже можно использовать вместо pip для установки и удаления пакетов, создания виртуальных окружений, а еще установки разных версий Python (на сегодня с помощью uv можно установить CPython 3.7 - 3.12).

Главное преимущество uv перед pip - это скорость работы. Когда я с помощью uv для проверки решил установить не самые маленькие библиотеки numpy, scipy, matplotlib и requests, то прям сильно впечатлился результатом. Вот, например, что написал сам uv в процессе выполнения команды "uv pip install numpy requests scipy matplotlib":

Resolved 17 packages in 829ms
Prepared 9 packages in 1.87s
Installed 17 packages in 53ms


Такая скорость будет полезна в первую очередь для использования на серверах CI/CD, где пакеты могут устанавливаться часто и в большом количестве. Разработчики говорят, что такого быстродействия они добились за счет того, что uv написан на Rust, а не на Python, как pip.

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

#программирование
1👍1
Несколько дней назад вышла новая версия библиотеки для создания пользовательского интерфейса на Python - wxPython 4.2.2. Именно на основе этой библиотеки в OutWiker создается GUI. С момента предыдущей версии wxPython прошло больше года. На главной странице официального сайта почему-то еще нет новости о релизе, поэтому пока не знаю, что там поменялось, но как минимум теперь эта библиотека должна собираться для Python 3.12, а то с прошлой версией были проблемы. Еще я надеюсь, что в эту версию попало исправление, которое фиксило один неприятный баг с некоторыми юникодными символами. Из-за этого бага для сборки OutWiker под Windows я использовал пропатченную версию wxPython.

Еще новая версия wxPython символична тем, что незадолго до релиза основной разработчик Robin Dunn отошел от дел и передал права на проект другим наиболее активным разработчикам. Хочется надеяться, что релизы теперь будут выходить почаще.

#python #wxpython #программирование
👍3🔥2
Вышел #Python 3.13. Про основные изменения можно почитать, например, тут - https://www.opennet.ru/opennews/art.shtml?num=62009
Самое заметное изменение - это новая версия командного режима работы (REPL), он действительно стал более дружелюбным и симпатичным. Остальные изменения более тонкие или являются заделом на будущее (зачатки JIT и первые шаги к избавлению от GIL).

В книге, которую пишу, я уже все примеры тестировал на Python 3.13 beta и как раз с новой консолью, но картинки с установкой Python под Винду теперь надо обновить, чтобы там не маячила надпись "beta".
👍5
В книге про Python, которую пишу, уже появилось упоминание Python 3.14. Дело в том, что в будущей версии, которая выйдет только во второй половине 2025 года (обычно в октябре), в класс Path из модуля pathlib наконец-то добавили методы copy() и copy_into() для копирования файлов и папок. Не мог не упомянуть этого радостного факта и не написать пару примеров с их использованием (они уже даже работают!).

Для установки Python 3.14, который сейчас находится еще в состоянии глубокой альфы, использовал pyenv.

#книга_про_python #python #программирование
👍8🔥1🎉1
Понадобилось мне для OutWiker сделать новый контрол для выбора цвета. Это должен быть выпадающий список (в простонародье - ComboBox), который вместо текста отображал бы прямоугольники разных цветов. Я очень не люблю делать свои контролы, но в какую сторону копать было понятно. Решил эту задачу переложить на братьев наших меньших (а в перспективе - больших), то есть на искусственный интеллект, и попросить его сгенерировать код.

Начал с Copilot. Результат меня прям очень впечатлил. Первоначальный запрос был такой:

"Напиши код компонента на Python с использованием библиотеки wxPython, который использует wx.adv.OwnerDrawnComboBox, чтобы выбирать цвет с помощью выпадающего списка. Каждый элемент выпадающего списка должен отображаться в виде прямоугольника своего цвета. Напиши код приложения, который этот компонент использует."


Код получился почти сразу рабочий, в течение нескольких запросов поправили некоторые косяки и даже улучшили внешний вид. Через полчаса в первом приближении я получил то, что хотел и потом буду исходники допиливать напильником. После этого даже не особо надеясь, что ИИ поймет, что мне надо, написал ему еще одну хотелку:

"Пусть теперь нулевой элемент будет обозначать "цвет по умолчанию" и выводиться текстом, а последний элемент списка - "Выбрать цвет" и тоже выводиться текстом."


Удивительно, но он сделал именно то, что я имел в виду. В процессе общения поправили некоторые мелочи, и оно заработало.

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

Попробовал после этого нейронку от Сбера - GigaChat. С ним пришлось помучиться подольше, чем с Copilot, - приходилось часто указывать конкретные строки, где ИИ был не прав, и что там должно быть. Но в итоге контрол начал делать то, что от него требуется, хотя некоторые оформительские моменты придется за ним все-таки править руками. А на дополнительной хотелке нейронка ушла в бесконечный цикл и начала писать без передыху по три одинаковые строчки, которые к делу вообще не относятся. В другой раз по этому же запросу у нее перепутались код и комментарии к нему. Ну ладно, с бонусом она не справилась, но в целом тоже молодец.

Еще я на днях локально себе поставил опенсорсную нейронку Llama 3 (запускал через ollama). Код, который она генерила, тоже с ходу не заработал. Но еще у меня и комп для нее слабоват. Сначала ИИ отвечал относительно шустро, но если надо было исправить ошибку, то он начинал думать минут 10, и результат совсем не впечатлял. В общем, у меня не хватило терпения заставить эту нейронку написать рабочий код.

PS. Если кому интересно, то вот код, который в итоге получился у Copilot - https://paste.ofcode.org/FeqUr5LEeFdN7ugPLZyd3u . Для получения этого кода понадобилось 7 запросов.

Код, который получился у GigaChat - https://paste.ofcode.org/34C9mNhGke5cp967q53zgXQ . Сколько понадобилось запросов для получения этого кода не знаю, потому что история не сохранилась.

Для запуска этих исходников нужна библиотека wxPython.

#python #ии #программирование #wxpython
🔥5👍3
В Python были u-строки (не актуальные с выходом Python 3), сейчас есть r-строки, b-строки и f-строки. И, возможно, теперь еще будут t-строки. PEP 750 еще не приняли, но идея интересная. Это очередные шаблонные строки, которые можно использовать более безопасно, чем f-строки, благодаря проверке того, какие значения параметров туда пытаются подставить.

#python #программирование
👍7
Вчера ходил на очередной Moscow Python Meetup, который проходил на этот раз в офисе МТС около метро Технопарк. Традиционно, в рамках митапа было три доклада.

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

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

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

#moscowpython #python #программирование
👍10
Сегодня вышел Python 3.14 🎉. Краткий список изменений можно посмотреть, например, здесь - https://www.opennet.ru/opennews/art.shtml?num=64017

Особенно интересно в нем посмотреть на t-строки (вдобавок к f-строкам и r-строкам, это если еще не вспоминать про u-строки) и на запуск нескольких копий интерпретатора в одном процессе, чтобы не использовать subprocess. Ну и продолжают делать более удобную и более цветную версию REPL.

#python
👍8
Недавно вышла вторая альфа-версия Python 3.15. Я посмотрел, какие изменения туда уже внесли и обратил внимание на два из них.

Теперь при открытии файла, если не указана кодировка с помощью параметра encoding, по умолчанию используется кодировка UTF-8, а не кодировка из системных настроек, как это было до сих пор. Линуксоиды (и маководы?) этого изменения скорее всего не заметят, там уже давно системная кодировка по умолчанию - это UTF-8. А вот под Windows это может стать сюрпризом, когда ранее работающий скрипт внезапно станет создавать файлы в другой кодировке. Я, конечно, всячески приветствую распространение Unicode, но, мне кажется, что такое изменение надо было делать в версии 3.0, когда и так ломалась обратная совместимость со всем, чем только можно.

И второе, на что обратил внимание, - это появление подмодуля math.integer с функциями, предназначенными для работы с целыми числами. Сейчас в этом модуле не так много функций, и среди них функции для расчета целочисленного квадратного корня, наименьшего общего кратного, наибольшего общего делителя, факториала и еще пара функций, связанных с комбинаторикой.

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

#python
👍5🔥1
После долгого перерыва написал статью в серию статей про использование библиотеки Matplotlib для рисования графиков. Новая статья посвящена рисованию графиков в полярной системе координат и настройках ее внешнего вида - https://jenyay.net/Matplotlib/Polar

#python #matplotlib
👍11
Не знаю, как вас, а меня расстраивает одна особенность многострочных литералов в Python, связанная с отступами. Например, если где-то в глубине функции объявляешь такой литерал, то надо обязательно убирать отступы во всех строках внутри литерала:
class Foo
    def bar(self):
        spam = """Lorem ipsum
dolor sit amet,
consectetur adipiscing
elit."""


Очень хочется для аккуратности оставить отступы внутри такой строки и написать примерно так:
class Foo
    def bar(self):
        spam = """Lorem ipsum
        dolor sit amet,
        consectetur adipiscing
        elit."""


Однако если так сделать, то лишние пробелы в начале каждой строки останутся в тексте.

И вот на днях предложили PEP 822, в котором описывают d-строки, от слова "dedented" (привет r-, b-, f-, t-строкам и отдельно u-строкам). D-строки позволяют устранять такие отступы в многострочных литералах. То есть, если это предложение примут (пока он находится в стадии черновика), то можно будет писать так:
class Foo
    def bar(self):
        spam = d"""
        Lorem ipsum
        dolor sit amet,
        consectetur adipiscing
        elit.
        """


В описании есть много ограничений на то, как такие строки правильно использовать, но основная идея заключается в том, что завершающая строка с тремя кавычками определяет, сколько пробелов нужно будет убрать из каждой строки. У меня есть вопросы к тому синтаксису и особенностям, которые описаны в PEP, но направление мысли мне нравится. Интересно, примут ли этот PEP к реализации, а если примут, то в каком виде. Буду за ним наблюдать.

#python
🔥4
В Python 3.15 должен появиться новый встроенный класс - неизменяемый словарь, frozendict. Таким образом, все базовые коллекции у нас будут иметь неизменяемого собрата: список - кортеж, множество - frozenset, а теперь и словарь - frozendict. Наверное, полезная вещь, если про нее вовремя вспомнить. Как и остальные неизменяемые коллекции, frozendict будет хэшируемым, если он содержит только хэшируемые значения (ключи по определению у нас должны быть хэшируемые).

Про frozendict написали pep 814 - https://peps.python.org/pep-0814/

#python
👍6🔥1