Проблема работы с библиотекой matplotlib в Window в настоящее время состоит в некорректном отображении русских шрифтов. В среде Spider под Linux данная проблема не наблюдается.
Для её устранения можно использовать следующий код
import matplotlibasmpl
mpl.rcParams['font.family'] = 'fantasy'
mpl.rcParams['font.fantasy'] = 'Arial'
Другойкод:
# Cyrillic letters in Matplotlib,# thanks to Alexey for solution, see http://koldunov.net/?p=290#comments
from matplotlib import rc
rc('font',**{'family':'serif'})
rc('text', usetex=True)
rc('text.latex',unicode=True)
rc('text.latex',preamble='\usepackage[utf8]{inputenc}')
rc('text.latex',preamble='\usepackage[russian]{babel}')
Также проблему вывода единичного текста можно решить, если назначить ему шрифт, который поддерживает русские буквы, например, указав, fontdict={'family':'verdana'}.
И самое короткое решение от Dimitry http://sky2high.net/2012/10/matplotlib-самое-короткое-решение-проблемы-от/
from matplotlib import rc
font = {'family': 'Verdana', 'weight': 'normal'} rc('font', **font)
Библиотека символьной математику SymPy
Функционал библиотеки обеспечивается специальными типами данных, которые переопределяют математические операции так, что вместо вычислений они создают символьные структуры. Строго говоря, они представлены тремя символьными типами: Real, Rational и Integer (вещественное, дробное, целое), но для нас различие между типами не имеет принципиального значения, так как все они обрабатываются методами библиотеки SymPy и могут в процессе вычислений преобразовываться друг в друга. Символьный тип или символьное выражение можно преобразовать в обычное вещественное число с помощью метода.evalf(), иначе оно может выглядеть, например, как
-sqrt(5)/7 + 2
Пример решения уравнения
from sympy import *
eq = sympify('(x/y)-z', locals={'x': 10, 'z': 5})
solution = solve(eq, dict=True)
print (solution)
Пример:c помощью библиотеки sympy находим золотое сечение (отделить от целого часть так, чтобы остаток делился на часть так же, как часть на целое). (другое определение: целое так относится к большей части, как большая к меньшей)
from sympy import *
x,y = symbols('xy')# Объявление нескольких переменных
equation=1/(1+x)-x #Золотое сечение: y/x=(x+y)/y, примем y=1
res=solve(equation)
print (res)
res1=[n.evalf() for n in res]#Вычисляем результат как вещественные числа
print (res1)
Интегрирование математических выражений в общем виде
t=y1+(x-x1)*(y2-y1)/(x2-x1)
f=sympy.integrate(t, x)
Библиотека для работы с табличными данными Pandas
Читаем из файла 'Шаблоны/Программа.xlsx' лист 'Дисциплины', не используем никакой из столбцов как индекс и столбец '№№' читаем как стоковые переменные. (иначе первый столбец будет сделан индексом, а цифры будут прочитаны как вещественные числа, в итоге ‘1’, будет невозможно отличить от ‘1.0’. При чтении лучше не назначать индекс автоматически, потом, при необходимости, его можно сформировать так, как это требует задача.
Дисциплины=pd.read_excel('Шаблоны/Программа.xlsx', 'Дисциплины', index_col=False,converters={'№№':str})
Структурное программирование
Дополнительный важный принцип, позволяющий создавать гибкий, легко изменяемый код – принцип ОТСУТСТВИЯ ДУБЛИРОВАНИЯ: если какая-то операция или информация используется многократно, она должна быть ОПРЕДЕЛЕНА ОДИН РАЗ. Только в этом случае можно гарантировать сохранение целостности программы и данных при изменении. Кроме того, глубокое структурирование сокращает объём кода и данных.
Если внимательно посмотреть, данный принцип очень глубоко проходит через все методики программирования, а также управления, построения инженерной документации (размер не указывается дважды), построения 3-D моделей, синтеза механизмов (отсутствие избыточных связей).
Объектно-ориентированное программирование (ООП)
Введение
Объектно-ориентированное программирование (ООП) — парадигма программирования, в которой основными концепциями являются понятия объектов и классов.
Объектно-ориентированное программирование (ООП) появилось как развитие идей:
1) структуризации программного кода;
2) объединения данных в структуры, классификации данных.
В сложных программах удобнее, когда переменные группируются по принадлежности к какому-то объекту, тогда нам не надо думать, представляет ли «α» угол поворота коленчатого вала или коэффициент теплоотдачи в цилиндре, поскольку в первом случае это будет shaft.α, а во втором - cylinder.α. В ООП не только данные, но и подпрограммы группируются по принадлежности к объектам. При этом переменная или функция указывается через точку после имени объекта, к которому принадлежит. Важное практическое преимущество ООП –такой способ обращения с данными исключает путаницу в названиях переменных в больших программах.
Основные понятия ООП
Объекты
Атрибуты (Поля) объекта являются обычными переменными (объектами) языка. Их описание удовлетворяет обычным правилам объявления переменных.
Методы (функции) объекта являются обычными процедурами и функциями языка. Их описание удовлетворяет обычным правилам объявления процедур и функций.
Основные методы объекта:
- конструктор, создание и инициализация объекта;
- деструктор, разрушающий объект;
- модификатор, изменяющий состояние объекта;
- селектор для доступа к переменным объекта без их изменения;
- итератор для доступа к содержанию объекта по частям в определённой последовательности.
Классы
Класс – тип объекта.
Объект - экземпляр класса.
Понятие класса происходит от научной классификации объектов.
Объекты одного класса имеют определённый набор одинаковых функций (методов) и других параметров, которые определяют принадлежность к данному классу.
В программировании объекты одного класса имеют строго определённый перечень свойств, который определяет их отличия друг от друга. В физической реальности объекты одного класса имеют конечный перечень общих свойств и функций, но неизмеримое (практически бесконечное) количество отличий.
В программировании принадлежность к классу может жестко определяется типом объекта и иерархией, но в Python эти требования смягчены, главное - наличие у объектов атрибутов и методов с одинаковыми именами.
"нет особой необходимости строить иерархию классов, начиная с самого верхнего класса, и потом дополнять ее подклассами. Чаще вы создаете несколько независимых иерархий, осознаете их общие черты и выделяете один или несколько суперклассов. Требуется несколько проходов вверх и вниз по иерархии, чтобы создать программный проект"
Отношения между классами
Теория ООП выделяет три основных отношения между классами:
1) Обобщение/Расширение (наследование),
2) Ассоциация,
3) Агрегация и композиция.
Наследование
Наследование – основной механизм определения новых классов на основании существующих. Подробно рассматривается ниже.
Ассоциация
Ассоциация означает, что объекты двух классов могут ссылаться один на другой, иметь некоторую связь между друг другом. Например: Преподаватель и Студент – т.е. какой-то Студент учится у какого-то Преподавателя. Ассоциация и есть описание связи между двумя объектами. Студент учится у Преподавателя. Идея достаточно простая – два объекта могут быть связаны между собой и это надо как-то описать.
Агрегация и композиция
Агрегация и композиция являются частными случаями ассоциации.
Агрегация – отношение когда один объект является частью другого. Например Студент входит в Группу любителей физики.
Композиция – еще более жесткое отношение, когда объект не только является частью другого объекта, но и вообще не может принадлежат еще кому-то. Например Машина и Двигатель. Хотя двигатель может быть и без машины, но он вряд ли сможет быть в двух или трех машинах одновременно. В отличии от студента, который может входить и в другие группы тоже.
Основные принципы ООП
Абстракция данных
Возможность создавать абстрактные типы данных, позволяющая наряду с предопределенными типами данных вводить свои собственные типы данных (классы) и объявлять «переменные» таких типов данных (объекты). Создавая свои собственные типы данных, программист оперирует не машинными терминами (переменная, функция), а объектами реального мира, поднимаясь тем самым на новый абстрактный уровень.
Инкапсуляция
Инкапсуляция — принцип, согласно которому любой класс должен рассматриваться как чёрный ящик — пользователь класса должен видеть и использовать только интерфейсную часть класса (т. е. список декларируемых свойств и методов класса) и не вникать в его внутреннюю реализацию. Поэтому данные принято инкапсулировать в классе так, чтобы доступ к ним по чтению или записи осуществлялся не напрямую, а с помощью методов. Принцип инкапсуляции (теоретически) позволяет минимизировать число связей между классами и, соответственно, упростить независимую реализацию и модификацию классов.
Есть не строгое представление о том, что в хорошо организованном объекте порядка 70% данных и внутренних функций должно быть скрыто от пользователя. Учитывая, что ООП увеличивает объём кода в 2-3 раза, такое соотношение гарантирует эффект упрощения работы с системой через объектно-ориентированный интерфейс.
Сокрытие данных
Сокрытие данных —управление областями видимости атрибутов и методов, обеспечивающее невозможность для пользователя узнать или изменить внутреннее состояние объекта. Является логическим продолжением инкапсуляции. Цель сокрытия -ограничение количества связей между объектами.
Наследование
Наследование - возможность создания нового класса на основе класса-родителя (суперкласса) с сохранением и добавлением новых свойств и методов. С помощью механизма наследования формируется иерархия классов, которая по сути является классификацией.
Полиморфизм
Полиморфизм –возможность единообразного вызова, но различной реализации метода в зависимости от класса объекта. Например, имеем армию из разнотипных боевых единиц. Даём ей приказ переместиться из пункта А в пункт Б. Команда для всех единиц записывается одинаково, тем не менее самолёты полетят, автомобили поедут, солдаты пойдут и т.д.
Полиморфизм обеспечивается тем, что в классе-потомке (в примере самолёт, автомобиль, и т.д.) изменяют реализацию метода класса-предка (в примере боевая единица) с обязательным сохранением заголовка (сигнатуры) метода. Это позволяет осуществить связывание имени метода в коде с разными классами. При вызове метод с данным именем берётся из класса, соответствующего объекту. Такой механизм называется динамическим (или поздним) связыванием — в отличие от статического (раннего) связывания, осуществляемого на этапе компиляции.
Классификация в ООП
Таким образом, в ООП мы имеем несколько направлений классификации:
Данные и подпрограммы классифицируются по принадлежности к объектам (горизонтальная классификация).
Объекты классифицируются по принадлежности к классам (вертикальная классификация).
Связи также могут быть представлены объектами – событиями, следовательно тоже могут быть классифицированы.
Определение классов и объектов - одна из самых сложных задач объектно-ориентированного проектирования.
Целью классификации является нахождение общих свойств объектов. Классифицируя, мы объединяем в одну группу объекты, имеющие одинаковое строение или одинаковое поведение.
Можно выделить три класса методов классификации:
1. Классическая категоризация. В классическом подходе все вещи, обладающие данным свойством или совокупностью свойств, формируют некоторую категорию. Причем наличие этих свойств является необходимым и достаточным условием, определяющим категорию. Классический подход в качестве критерия похожести объектов использует родственность их свойств. В частности, объекты можно разбивать на непересекающиеся множества в зависимости от наличия или отсутствия некоторого признака. Обычно лучшими являются такие наборы свойств, элементы которых мало взаимодействуют между собой.
2. Концептуальная кластеризация. Это более современный вариант классического подхода. Он возник из попыток формального представления знаний. Степп и Михальски пишут: "При таком подходе сначала формируются концептуальные описания классов (кластеров объектов), а затем мы классифицируем сущности в соответствии с этими описаниями".
3. Теория прототипов. Класс определяется одним объектом-прототипом, и новый объект можно отнести к классу при условии, что он наделен существенным сходством с прототипом. Свойства, определяемые при взаимодействии с объектом (свойства взаимодействия), являются главными при определении семейного сходства". Понятие свойств взаимодействия - центральное для теории прототипов. В концептуальной кластеризации мы группируем в соответствии с различными концепциями. В теории прототипов классификация объектов производится по степени их сходства с конкретным прототипом.
Когда и зачем нужно ООП?
Есть мнение, что «Порядочная функция должна жить в классе» (с) Leono, https://m.habrahabr.ru/company/yandex/blog/346186/), с чем это связано?
Одна из основных современных проблем программирования состоит в том, что простые задачи уже в основном решены, а актуальные задачи требуют построения очень сложных систем, принципы функционирования которых необозримы для отдельно взятого человека.
Ответ на вопрос «Что делать?» звучит парадоксально: сложные задачи можно решать только простыми средствами.
К ним относятся:
1. простой лаконичный синтаксис языка программирования,
2. независимая отладка функций,
3. красивые логические решения функционального программирования, которые сокращают код и делают его более прозрачным (исключение циклов, рекурсия),
4. применение объектов высокого уровня.
Главная идея - пишите код понятно!
В этом свете применение ООП соответствует п.4, и оправдано для задач высокой сложности, особенно тех, которые естественно представляются в виде систем, состоящих из взаимосвязанных и/или поддающихся классификации объектов. В том случае, если удаётся инкапсулировать наиболее сложные аспекты функционирования применяемых объектов, то дальнейшая работа с этими объектами значительно упрощается. Но для этого требуется качественное построение объектов. Инкапсуляция работает только тогда, когда структура объекта уже полностью закончена. Если в процессе работы появляется необходимость редактировать внутреннее устройство объекта, то ни об инкапсуляции, ни о смысле применения объектно-ориентированного подхода говорить нет смысла. Известный факт, что ООП увеличивает объём кода в 2-3 раза и более. При этом сложность работы с программой увеличивается, как минимум, пропорционально. Но, если этот код полностью закончен, и построена удачная объектная модель, то все сложные задачи, которые решаются с её помощью, описываются короткими и понятными обращениями к свойствам и методам объектов.






