vak: (Знайка)
Я понимаю, что второй Питон это низзя, ужас-ужас и дурной тон, но что делать, если очень хочется? 😀
На линуксе делаем:
sudo apt install readline-dev libssl-dev
curl -fsSL https://pyenv.run | bash
~/.pyenv/bin/pyenv install 2.7
На маке ещё проще:
brew install pyenv
~/.pyenv/bin/pyenv install 2.7
После чего питон можно вызывать командой:
$ ~/.pyenv/versions/2.7.18/bin/python2
Python 2.7.18 (default, Feb  6 2025, 20:48:01) 
[GCC 13.3.0] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> _
vak: (Default)
Лена вяжет и шьёт плед из большого количества разноцветных кусочков. Но подобрать вручную "случайный" узор оказалось непросто. Пришлось сбацать скрипт на Питоне. Примерно такое получается.
vak: (Default)
По BGI необязательно тосковать. Всё-таки в 21-м веке живём. Нынче есть более развитая библиотечка PyGame. Умеет всё то же самое и многое другое. Для пробы, я переиначил демонстрашку "калейдоскоп", написанную Гвидо Гонзато для BGI (изначально на Си, позже на Питоне) на библиотеку PyGame.

Вот как было и как стало:
vak: (Знайка)
Народ обнаружил, что к икейскому датчику качества воздуха VINDRIKTNING можно подпаяться и добавить интеллекта. Подключаем Raspberry Pico или ESP32 и имеем массу удовольствия.

"Hacking IKEA"



vak: (Знайка)
Сляпал на скорую руку скриптик для мака, аналогичный линуксовому 'free'. Показывает состояние памяти. Всего несколько строк на Питоне:

github.com/sergev/vak-opensource/blob/master/languages/python/free.py

Вот так работает:
$ free
Mbytes: total used free active inactive available
Mem: 32768 7377 17776 5854 4855 24504
Swap: 0 0 0
vak: (Default)
(Статья мне показалась интересной, решил перепостить: 10 Python Scripts to Automate Everyday Problems)

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

Fetch IMDB

You probably use IMDB for getting your best movie for a weekend but do you know you can scrap data from IMDB with Python. This automation script will let you automate the IMDb data scraping in a Pythonic way. Below I coded the standard function you can use.
  • You can use it for your IMDB Project
  • Scrap and Analyze Movies Data
  • Finding the Best movie for your Weekend
  • And much more
# IMDB
# pip install imdbpy

import imdb
ia = imdb.IMDb()

# Search for a movie.
search_result = ia.search_movie('The Matrix')

# Get the ID of the movie.
movie_id = search_result[0].movieID

# Get the movie from ID
movie = ia.get_movie(movie_id)

# Get Rating of movie
rating = movie['rating']

# Get Plot of movie
plot = movie['plot']

# Get Genre of movie
genre = movie['genres']

# Get Box office of movie
box_office = movie['box office']

# Get Cast of movie
cast = movie['cast']

# Get Director of movie
director = movie['director']

# Get Writer of movie
writer = movie['writer']

# Search for a person.
search_result = ia.search_person('Keanu Reeves')
+9 )
vak: (Default)
Простое и понятное введение в "черепашью графику" на языке Питон.

http://gvard.github.io/py/turtle/

vak: (Default)
Питон нынче присутствует везде, даже на самых крохотных линуксных девайсах. Но если вы скучаете по функциональщине, вот вам простой Лисп поверх Питона. Называется Hy:

https://docs.hylang.org/en/stable/whyhy.html

Устанавливается командой:
pip3 install --user hy
Вызывается как "hy". Такой себе вполне Лисп, с полным доступом к функциям и библиотекам Питона, и обратно. Поддерживает макросы, питоновские классы и модули. Можно делать автономные скрипты. Пример вычисления чисел Фибоначчи:
(defn fib [n]
(if (< n 2)
n
(+ (fib (- n 1)) (fib (- n 2)))))
(print (fib 30))
Напечатает:
832040
vak: (Default)
Любишь кодить - люби и тестировать. Фундаментальность программистского образования в СССР нивелировалась полным отсутствием представления об организации процесса тестирования, и вообще обеспечения качества программного продукта. Ни в курчатнике, где мы делали операционную систему Демос, ни в ИТМиВТ, с которым мы активно сотрудничали и где разрабатывали штатные ОС и компиляторы для БЭСМ и Эльбрус, не было соответствующей практики наработки тестов и организации регулярного тестирования. А жаль.

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

Pytest представляет собой утилиту, которая вызывается из командной строки и запускает набор тестов Вашей программы. Для этого pytest сканирует присутствующие папки и файлы в них, находит файлы с именами test_*.py, а в них определения процедур с именами вида test_xxx(), и вызывает эти процедуры. На экран выдаётся информация о пройденных тестах. По умолчанию печатается имя файла и дальше точка для каждого успешного теста или F для неуспешного. Скажем, у меня есть файл test_demo.py и в нём десять тестов. Будет выдано следующее:
$ pytest
======================== test session starts =========================
platform darwin -- Python 3.8.4, pytest-5.4.3, py-1.9.0, pluggy-0.13.1
rootdir: /Users/vak/Project/Github/Pytest-Actions-Demo
collected 10 items

test_demo.py .......... [100%]

========================= 10 passed in 0.03s ========================
Если добавить флаг -v, будут выдаваться имена тестов, по одному в строке:
$ pytest -v
======================== test session starts =========================
platform darwin -- Python 3.8.4, pytest-5.4.3, py-1.9.0, pluggy-0.13.1 -- /usr/local/opt/python@3.8/bin/python3.8
cachedir: .pytest_cache
rootdir: /Users/vak/Project/Github/Pytest-Actions-Demo
collected 10 items

test_demo.py::test_fact_0 PASSED [ 10%]
test_demo.py::test_fact_1 PASSED [ 20%]
test_demo.py::test_fact_2 PASSED [ 30%]
test_demo.py::test_fact_3 PASSED [ 40%]
test_demo.py::test_fact_10 PASSED [ 50%]
test_demo.py::test_fact_20 PASSED [ 60%]
test_demo.py::test_fact_30 PASSED [ 70%]
test_demo.py::test_fact_40 PASSED [ 80%]
test_demo.py::test_fact_50 PASSED [ 90%]
test_demo.py::test_fact_minus1 PASSED [100%]

========================= 10 passed in 0.03s ========================
Процедуры тестов содержат операторы assert, проверяющие результат выполнения Вашей программы. Если результат совпадает - тест считается успешным:
def test_fact_3():
assert demo.factorial(3) == 6
Если в одном из тестов обнаружена ошибка, она выдаётся в виде:
============================== FAILURES ==============================
____________________________ test_fact_3 _____________________________

def test_fact_3():
> assert demo.factorial(3) == 7
E assert 6 == 7
E +6
E -7

test_demo.py:24: AssertionError
====================== short test summary info =======================
FAILED test_demo.py::test_fact_3 - assert 6 == 7
==================== 1 failed, 9 passed in 0.06s =====================
Да, я не упомянул: устанавливается pytest командой "pip install pytest". А если добавить к нему ещё и "pip3 install pytest-xdist", то у pytest появится флаг "-nauto", запускающий тесты впараллель на всех доступных процессорах компьютера. Это заметно ускоряет процесс. К примеру у меня на работе в одном из проектов имеется больше 600 тестов, и полный прогон (на одном процессоре) занимает около 15 минут. С флагом же "-nauto" задействуется 16 процессоров моего MacBook Pro, и тестирование ускоряется до 5 минут.

Это базовый минимум. Но в pytest есть куча полезных фич, помогающих в разработке тестов. Рекомендую книжку, где все возможности подробно описаны: "Python Testing with pytest".



Пример проекта с pytest смотрите на Гитхабе: https://github.com/sergev/Pytest-Actions-Demo
vak: (Default)
Если вы собираетесь начать разрабатывать программу на языке Питон - вот заготовка, с которой можно стартовать: https://github.com/sergev/Pytest-Actions-Demo

Клонируете проект к себе и наполняете содержанием. В заготовке задействованы автоматическая проверка кода утилитой flake8 и тестирование посредством pytest. Автоматизация выполнена через сервис Github Actions. Скрипт .github/workflows/pytest.yml содержит задание для Actions запускать flake8 и pytest каждый раз, когда приходит очередное изменение. Причём тестируются заданные версии Питона, а именно 2.7 и 3.8.

Конечно, всегда лучше запускать flake8 и pytest локально, перед отправкой изменений в Github. Но удобно, что результаты тестирования копятся на сервере и всегда доступны для просмотра (здесь).

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



Есть аналогичная заготовка для Питона с автоматизацией, но для Битбакета: https://vak.dreamwidth.org/658470.html