Архив метки: Python

Таблица умножения на Python за 2 строчки

>>> for i in range(1, 11):
...     print(" ".join(map(str, [i*j for j in range(1, 11)])))
...
1 2 3 4 5 6 7 8 9 10
2 4 6 8 10 12 14 16 18 20
3 6 9 12 15 18 21 24 27 30
4 8 12 16 20 24 28 32 36 40
5 10 15 20 25 30 35 40 45 50
6 12 18 24 30 36 42 48 54 60
7 14 21 28 35 42 49 56 63 70
8 16 24 32 40 48 56 64 72 80
9 18 27 36 45 54 63 72 81 90
10 20 30 40 50 60 70 80 90 100
>>> for i in range(1, 11):
...     print("".join(map(lambda x: str(x).rjust(4), [i*j for j in range(1, 11)])))
...
   1   2   3   4   5   6   7   8   9  10
   2   4   6   8  10  12  14  16  18  20
   3   6   9  12  15  18  21  24  27  30
   4   8  12  16  20  24  28  32  36  40
   5  10  15  20  25  30  35  40  45  50
   6  12  18  24  30  36  42  48  54  60
   7  14  21  28  35  42  49  56  63  70
   8  16  24  32  40  48  56  64  72  80
   9  18  27  36  45  54  63  72  81  90
  10  20  30  40  50  60  70  80  90 100
>>>

Как в Python запустить отвязанный (detached) от основной программы процесс

>>> import subprocess
>>> subprocess.Popen(["notepad", r"c:\windows\system.ini"])
<subprocess.Popen object at 0x000001E78BFB6400>
>>>

При таком запуске основная программа не будет дожидаться, пока закончит работу запущенная ей другая программа.

Python заготовка для создания wav-файлов без дополнительных модулей

"""Create wav file."""
import os
import sys

file_name = input("WAV file name: ")
if os.path.exists(file_name):
    print("ERROR: File name is busy")
    sys.exit(1)
with open(file_name, "wb") as wav_file:
    wav_file.write(
        bytes(
            (
                0x52, 0x49, 0x46, 0x46,  # RIFF
                # 0x24, 0x08, 0x00, 0x00,  # Chunk size = 2084
                0xf4, 0x08, 0x00, 0x00,  # Chunk size = ???
                0x57, 0x41, 0x56, 0x45,  # WAVE
                0x66, 0x6d, 0x74, 0x20,  # fmt
                0x10, 0x00, 0x00, 0x00,  # Subchunk1 size = 16
                0x01, 0x00,  # Audio Format = 1 (PCM)
                0x02, 0x00,  # Num Channels = 2
                # 0x01, 0x00,  # Num Channels = 1
                0x22, 0x56, 0x00, 0x00,  # Sample Rate = 22050
                0x88, 0x58, 0x01, 0x00,  # Byte Rate = 88200
                0x04, 0x00,  # Block Align = 4
                0x10, 0x00,  # Bits per sample = 16
                0x64, 0x61, 0x74, 0x61,  # data
                # 0x00, 0x08, 0x00, 0x00,  # subchunk size = 2048
                0x00, 0xf8, 0x00, 0x00,  # subchunk size = ???

                0x00, 0x00,  # sample 1 left
                0x00, 0x00,  # sample 1 right

                0x24, 0x17,  # sample 2 left
                0x1e, 0xf3,  # sample 2 right

                0x3c, 0x13,  # sample 3 left
                0x3c, 0x14,  # sample 3 right

                0x16, 0xf9,
                0x18, 0xf9,

                0x34, 0xe7,
                0x23, 0xa6,

                0x3c, 0xf2,
                0x24, 0xf2,

                0x11, 0xce,
                0x1a, 0x0d,
            )
        )
    )
    for _ in range(1000000):
        wav_file.write(
            bytes(
                (
                    0x16, 0xf9,
                    0x18, 0xf9,

                    0x34, 0xe7,
                    0x23, 0xa6,

                    0x3c, 0xf2,
                    0x24, 0xf2,

                    0x11, 0xce,
                    0x1a, 0x0d,
                )
            )
        )

Вызов кода C++ из скрипта на Python в Linux — самый простой способ

Создаём два текстовых файла main.py и MyClass.cpp

main.py:

from ctypes import cdll
lib = cdll.LoadLibrary('./libmyclass.so')


class MyClass(object):

    def __init__(self):
        self.obj = lib.MyClass_new()

    def my_function(self):
        lib.MyClass_myFunction(self.obj)


m = MyClass()
m.my_function()

MyClass.cpp:

#include <iostream>


class MyClass{
public:
    void myFunction(){
        std::cout << "Hello MyClass!!!" << std::endl;
    }
};


int main()
{
    MyClass m; 
    m.myFunction();  
    return 0;
}


extern "C" {
    MyClass* MyClass_new(){
        return new MyClass();
    }

    void MyClass_myFunction(MyClass* m) {
        m->myFunction();
    }
}

После этого выполняем в консоли следующие команды:

user@computer:~/MyPets/python_cpp_2023-05-01$ ls
main.py  MyClass.cpp
user@computer:~/MyPets/python_cpp_2023-05-01$ g++ -c -fPIC MyClass.cpp -o myclass.o
user@computer:~/MyPets/python_cpp_2023-05-01$ ls
main.py  MyClass.cpp  myclass.o
user@computer:~/MyPets/python_cpp_2023-05-01$ g++ -shared -Wl,-soname,libmyclass.so -o libmyclass.so myclass.o
user@computer:~/MyPets/python_cpp_2023-05-01$ ls
libmyclass.so  main.py  MyClass.cpp  myclass.o
user@computer:~/MyPets/python_cpp_2023-05-01$ python3 main.py 
Hello MyClass!!!
user@computer:~/MyPets/python_cpp_2023-05-01$

Как видим, всё работает. Проще способа не нашёл.

Ходовые модули Python для анализа данных и машинного обучения

== CNTK

  • # The Microsoft Cognitive Toolkit
  • «A free, easy-to-use, open-source, commercial-grade toolkit that trains deep learning algorithms to learn like the human brain.»
  • pip install cntk
  • «CNTK is no longer actively developed»

== deap

  • для использования генетических алгоритмов
  • есть хорошая книжка про генетические алгоритмы с использованием этого модуля, название не помню, но хорошая

== jupyter

  • среда для выполнения кода на питоне и просмотра результатов в браузере
  • можно перезапускать с изменениями только выбранные куски кода
  • можно выводить графики matplotlib

== keras

  • для нейронных сетей
  • может работать поверх theano, tensorflow или CNTK

== matplotlib

  • рисование графиков

== numpy

  • многомерные массивы, матрицы
  • удобная загрузка данных из бинарных файлов
  • библиотека используется во многих других (pandas, …)

== nvidia-…

  • nvidia-cublas-cu12
  • nvidia-cuda-cupti-cu12
  • nvidia-cuda-nvcc-cu12
  • nvidia-cuda-nvrtc-cu12
  • nvidia-cuda-runtime-cu12
  • nvidia-cuda-sanitizer-api-cu12
  • nvidia-cufft-cu12
  • nvidia-curand-cu12
  • nvidia-cusolver-cu12
  • nvidia-cusparse-cu12
  • nvidia-npp-cu12
  • nvidia-nvjitlink-cu12
  • nvidia-nvjpeg-cu12
  • nvidia-nvml-dev-cu12
  • nvidia-nvtx-cu12
  • nvidia-pyindex

== opencv-python

  • pip install opencv-python
  • машинное зрение, распознавание объектов на изображениях и т.п.

== orange3

  • графический интерфейс для создания пайплайнов анализа данных
  • код можно вообще не писать
  • загрузка csv-файлов
  • куча всяких удобных интерактивных графиков
  • можно легко создавать предсказательные модели на деревьях, бустинге, простых нейросетях и прочих готовых алгоритмах

== pandas

  • для извлечения и подготовки данных
  • похоже на электронные таблицы, можно задавать и использовать имена колонок и индексы для строк
  • на базе numpy
  • загрузка данных из excel, csv, json, sql
  • группировка и фильтрация данных
  • применение функций ко всем значениям в выбранных колонках — в разы быстрее чем использовать циклы на чистом питоне
  • надо внимательно следить при работе с данными, когда они нормально скопированы, а когда ссылаются на источник, чтоб изменяя значения в одном месте, не испортить их в другом

== pillow

  • работа с изображениями
  • можно попиксельно

== plotly

  • интерактивные графики в браузере
  • pip install plotly

== pyodbc

  • для выполнения запросов к разным базам данных (MSSQL, PG и т.п.)
  • для разных баз данных изредка работает с разными ошибками (изредка случалось, результаты из модуля не совпадали с результатами через нативные клиенты), но в большинстве случаев всё хорошо

== pytorch

  • библиотека для машинного обучения
  • нейронные сети
  • тензорные вычисления
  • может работать с GPU
  • говорят, что замена для numpy
  • вроде поддерживает динамические графики

== scikit-learn

  • библиотека всяких алгоритмов машинного обучения — кластеризации, регрессии, классификации, …
  • на основе numpy и scipy

== scipy

  • для статистики, линейной алгебры, числовых процедур и оптимизации
  • на основе numpy

== seaborn

  • библиотека построения графиков и визуализации данных
  • основана на matplotlib

== spyder

  • интерактивный редактор кода с автодополнением
  • можно выполнять код прямо внутри редактора
  • можно сразу выводить графики matplotlib

== sympy

  • для символьных вычислений — не только получения значений, а сокращения формул и т.п.
  • для уравнений в решении умеет возвращать несколько корней, как положено
  • хорошая статья с примерами на хабре https://habr.com/ru/post/680258/

== tensorflow

  • для нейронных сетей

== theano

  • для нейронных сетей
  • может использовать GPU

Ещё не написал про модули от nvidia для работы с GPU

Если кто ещё знает полезные модули по теме — пишите в коментариях, тоже соберём в кучу

Python Генерация звуков через PyAudio

Следующий код генерирует и проигрывает звук:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Генерация звуков через pyaudio.

За основу взят https://medium.com/py-bits/sound-generation-python-904e54f5398d

sudo apt-get install python3-pyaudio
"""

import pyaudio
import math
PyAudio = pyaudio.PyAudio
BITRATE = 5000
FREQUENCY = 10000
LENGTH = 5
if FREQUENCY > BITRATE:
    BITRATE = FREQUENCY + 100
NUMBER_OF_FRAMES = int(BITRATE * LENGTH)
WAVEDATA = ''
for x in range(NUMBER_OF_FRAMES):
    WAVEDATA = WAVEDATA + chr(
        int(
            math.sin(
                x
                / (
                    (
                        BITRATE / FREQUENCY
                    ) / math.pi
                )
            ) * 127 + 128
        )
    )
REST_FRAMES = NUMBER_OF_FRAMES % BITRATE
for x in range(REST_FRAMES):
    WAVEDATA = WAVEDATA + chr(128)
# print(WAVEDATA)
# óYªQ±J¹CÀ<Æ5Í/Ó)Ù$Þãèìð
# öùûýþþþþýüúø	õ
# óYªQ±J¹CÀ<Æ5Í/Ó)Ù$ÞãèìðÛ&Ö,Ð2Ê9Ã?¼FµN®U¦\lt|xph
# öùûýþþþþýüúø	õ
# ...
p = PyAudio()
stream = p.open(
    format=p.get_format_from_width(1),
    channels=2,
    rate=BITRATE,
    output=True
)
stream.write(WAVEDATA)
stream.stop_stream()
stream.close()
p.terminate()

wxPython пример рабочего окна с кнопкой

# -*- coding: utf-8 -*-
"""
# Самый простой пример окна.

# Отсюда: https://wiki.wxpython.org/Getting%20Started

import wx

# Create a new app, don't redirect stdout/stderr to a window.
app = wx.App(False)
# A Frame is a top-level window.
frame = wx.Frame(None, wx.ID_ANY, "Hello World")
frame.Show(True)     # Show the frame.
app.MainLoop()
"""

import wx


class MyFrame(wx.Frame):
    """Главное окно."""

    def __init__(self, parent, title):
        wx.Frame.__init__(self, parent, title=title, size=(200, 100))
        # текстовое многострочное поле
        self.text_input = wx.TextCtrl(
            self,
            style=wx.TE_MULTILINE,
            size=(400, 200),
        )
        # кнопка
        self.exit_button = wx.Button(
            self,
            label="Exit",
            pos=(300, 300),
            size=(100, 100)
        )
        self.Size = (500, 500)
        # Привязка нажатия кнопки к запуску метода главного окна
        self.Bind(wx.EVT_BUTTON, self.my_exit, self.exit_button)
        self.Show(True)

    def my_exit(self, param):
        """Самодельный метод - Закрыть главное окно."""
        # quit()  # раскоментировать чтоб выход заработал
        print(f"param: {dir(param)}")  # что во втором параметре
        self.text_input.SetValue("Exit")  # изменить текст


app = wx.App(False)
frame = MyFrame(None, 'Small editor - Тестовый редактор')
app.MainLoop()

Python matplotlib быстро нарисовать график

matplotlib — модуль питона для рисования графиков

Установка matplotlib:

python3 -m pip install matplotlib

Код чтоб нарисовать простой график:

import matplotlib.pyplot as plt
plt.plot([1,2,3], [2,1,3])

просто два массива — по x и y

Результат: