>>> 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
Как в Python запустить отвязанный (detached) от основной программы процесс
>>> import subprocess
>>> subprocess.Popen(["notepad", r"c:\windows\system.ini"])
<subprocess.Popen object at 0x000001E78BFB6400>
>>>
При таком запуске основная программа не будет дожидаться, пока закончит работу запущенная ей другая программа.
Python пропуск тестов в unittest
@unittest.skip("Причина пропуска: ...")
def test_anything(self):
pass
Ffmpeg + Python переконвертировать папку .ogg в .mp3 за 4 строчки
>>> import os
>>> for file_name in os.listdir("."):
... if ".ogg" in file_name:
... os.system(f'ffmpeg -i {file_name} -vn -ar 44100 -ac 2 -b:a 192k {file_name}.mp3')
...
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
Результат: