<?xml version='1.0' encoding='UTF-8'?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:blogger="http://schemas.google.com/blogger/2008" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" version="2.0"><channel><atom:id>tag:blogger.com,1999:blog-920988537392180762</atom:id><lastBuildDate>Thu, 16 Oct 2025 21:28:13 +0000</lastBuildDate><category>Python</category><category>matplotlib</category><category>blogger</category><category>Firefox</category><category>C/C++</category><category>Google</category><category>NumPy</category><category>gcc</category><category>linix</category><category>vim</category><title>Незамысловатый блог</title><description></description><link>http://pyviy.blogspot.com/</link><managingEditor>noreply@blogger.com (Вий)</managingEditor><generator>Blogger</generator><openSearch:totalResults>12</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><item><guid isPermaLink="false">tag:blogger.com,1999:blog-920988537392180762.post-3969660084459841630</guid><pubDate>Fri, 03 Dec 2010 14:44:00 +0000</pubDate><atom:updated>2011-06-28T16:47:31.608+06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">C/C++</category><category domain="http://www.blogger.com/atom/ns#">gcc</category><category domain="http://www.blogger.com/atom/ns#">linix</category><title>О GCC, компиляции и библиотеках</title><description>﻿&lt;p&gt;&lt;b&gt;GCC&lt;/b&gt; - &lt;b&gt;GNU Compiler Collection&lt;/b&gt; - набор компиляторов и сопутствующих утилит, разработанный в рамках движения &lt;b&gt;GNU&lt;/b&gt;. GCC один из старейших Open Source проектов, первый релиз состоялся в 1985 году, автор сам Ричард Столлман. В исходном варианте поддерживал только язык &lt;b&gt;C&lt;/b&gt; и аббревиатура GCC расшифровывалась как &lt;b&gt;GNU C Compiler&lt;/b&gt;. Постепенно набор доступных языков расширялся, были добавлены компиляторы &lt;b&gt;Fortran&lt;/b&gt;, &lt;b&gt;C++&lt;/b&gt;, &lt;b&gt;Ada&lt;/b&gt;. С уверенностью можно сказать, что современный мир Open Source обязан своим рождением GCC (по крайней мере без GCC он был бы другим). В настоящее время проект находиться под крылом &lt;b&gt;Free Software Foundation&lt;/b&gt;. GCC выпускается под лицензией GPLv3 и является стандартным компилятором для большинства свободных UNIX-подобных операционных систем. В базовый набор входят компиляторы языков: &lt;b&gt;C&lt;/b&gt;, &lt;b&gt;C++&lt;/b&gt;, &lt;b&gt;Objective-C&lt;/b&gt;, &lt;b&gt;Java&lt;/b&gt;, &lt;b&gt;Fortran&lt;/b&gt;, &lt;b&gt;Ada&lt;/b&gt;. GCC поддерживает все основные процессорные архитектуры. Официальный сайт проекта &lt;a href=&quot;http://gcc.gnu.org/&quot;&gt;gcc.gnu.org&lt;/a&gt;&lt;/p&gt;



&lt;h3&gt;Основы&lt;/h3&gt;



&lt;p&gt;GCC входит в состав любого дистрибутива &lt;b&gt;Linux&lt;/b&gt; и, как правило, устанавливается по умолчанию. Интерфейс GCC, это стандартный интерфейс компилятора на UNIX платформе, уходящий своими корнями в конец 60-х, начало 70-х годов прошлого века - интерфейс командной строки. Не стоит пугаться, за прошедшее время механизм взаимодействия с пользователем был отточен до возможного в данном случае совершенства, и работать с GCC (при наличии нескольких дополнительных утилит и путного текстового редактора) проще, чем с любой из современных визуальных IDE. Авторы набора постарались максимально автоматизировать процесс компиляции и сборки приложений. Пользователь вызывает управляющую программу &lt;b&gt;gcc&lt;/b&gt;, она интерпретирует переданные аргументы командной строки (опции и имена файлов) и для каждого входного файла, в соответствии с использованным языком программирования, запускает свой компилятор, затем, если это необходимо, &lt;b&gt;gcc&lt;/b&gt; автоматически вызывает ассемблер и линковщик (компоновщик).&lt;/p&gt;



&lt;span class=&quot;fullpost&quot;&gt;



&lt;div class=&quot;noteblock&quot;&gt;



&lt;p&gt;Любопытно, компиляторы одни из немногих приложений UNIX для которых не безразлично расширение файлов. По расширению GCC определяет что за файл перед ним и, что с ним нужно (можно) сделать. Файлы исходного кода на языке &lt;b&gt;C&lt;/b&gt; должны иметь расширение &lt;span class=&quot;item&quot;&gt;.c&lt;/span&gt;, на языке &lt;b&gt;C++&lt;/b&gt;, как вариант, &lt;span class=&quot;item&quot;&gt;.cpp&lt;/span&gt;, заголовочные файлы на языке &lt;b&gt;C&lt;/b&gt; &lt;span class=&quot;item&quot;&gt;.h&lt;/span&gt;, объектные файлы &lt;span class=&quot;item&quot;&gt;.o&lt;/span&gt; и так далее. Если использовать неправильное расширение, &lt;b&gt;gcc&lt;/b&gt; будет работать не корректно (если вообще согласиться, что-либо делать).&lt;/p&gt;



&lt;/div&gt;



&lt;p&gt;Перейдём к практике. Напишем, откомпилируем и исполним какую-нибудь незамысловатую программу. Не будем оригинальничать, в качестве исходного файла примера программы на языке &lt;b&gt;C&lt;/b&gt; сотворим файл с вот таким содержимым:&lt;/p&gt;



&lt;div class=&quot;codeblock&quot;&gt;

&lt;code&gt;&lt;font color=&quot;#0000ff&quot;&gt;/*&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; hello.c &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;*/&lt;/font&gt;&lt;/code&gt;&lt;br&gt;

&lt;br&gt;

&lt;code&gt;&lt;font color=&quot;#a020f0&quot;&gt;#include &lt;/font&gt;&lt;font color=&quot;#ff00ff&quot;&gt;&amp;lt;stdio.h&amp;gt;&lt;/font&gt;&lt;/code&gt;&lt;br&gt;

&lt;br&gt;

&lt;code&gt;main(&lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;void&lt;/b&gt;&lt;/font&gt;)&lt;/code&gt;&lt;br&gt;

&lt;code&gt;{&lt;/code&gt;&lt;br&gt;

&lt;br&gt;

&lt;code&gt;        printf(&lt;font color=&quot;#ff00ff&quot;&gt;&amp;quot;Hello World&lt;/font&gt;&lt;font color=&quot;#6a5acd&quot;&gt;\n&lt;/font&gt;&lt;font color=&quot;#ff00ff&quot;&gt;&amp;quot;&lt;/font&gt;);&lt;/code&gt;&lt;br&gt;

&lt;br&gt;

&lt;code&gt;        &lt;font color=&quot;#a52a2a&quot;&gt;&lt;b&gt;return&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#ff00ff&quot;&gt;0&lt;/font&gt;;&lt;/code&gt;&lt;br&gt;

&lt;br&gt;

&lt;code&gt;}&lt;/code&gt;&lt;br&gt;

&lt;/div&gt;



&lt;p&gt;Теперь в каталоге c &lt;span class=&quot;item&quot;&gt;hello.c&lt;/span&gt; отдадим команду:&lt;/p&gt;



&lt;div class=&quot;codeblock&quot;&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;gcc hello.c&lt;/span&gt;&lt;br&gt;

&lt;/div&gt;



&lt;p&gt;Через несколько долей секунды в каталоге появиться файл &lt;span class=&quot;item&quot;&gt;a.out&lt;/span&gt;:&lt;/p&gt;



&lt;div class=&quot;codeblock&quot;&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;ls&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;a.out  hello.c&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;/div&gt;



&lt;p&gt;Это и есть готовый исполняемый файл нашей программы. По умолчанию &lt;b&gt;gcc&lt;/b&gt; присваивает выходному исполняемому файлу имя &lt;span class=&quot;item&quot;&gt;a.out&lt;/span&gt; (когда-то очень давно это имя означало &lt;b&gt;assembler output&lt;/b&gt;).&lt;/p&gt;



&lt;div class=&quot;codeblock&quot;&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;file a.out&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;a.out: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.15, not stripped&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;/div&gt;



&lt;p&gt;Запустим получившийся программный продукт:&lt;/p&gt;



&lt;div class=&quot;codeblock&quot;&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;./a.out&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;Hello World&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;/div&gt;



&lt;br&gt;



&lt;div class=&quot;noteblock&quot;&gt;



&lt;p&gt;Почему в команде запуска на исполнение файла из текущего каталога необходимо явно указывать путь к файлу? Если путь к исполняемому файлу не указан явно, оболочка, интерпретируя команды, ищет файл в каталогах, список которых задан системной переменной &lt;span class=&quot;item&quot;&gt;PATH&lt;/span&gt;.

&lt;br&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;echo $PATH&lt;/span&gt;

&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games&lt;/b&gt;&lt;/span&gt;

&lt;/p&gt;



&lt;p&gt;Каталоги в списке разделены символом двоеточия. При поиске файлов, оболочка просматривает каталоги в том порядке, в котором они перечислены в списке. По умолчанию, из соображений безопасности, текущий каталог &lt;span class=&quot;item&quot;&gt;.&lt;/span&gt; в список не внесен, соответственно, оболочка исполняемые файлы искать в нем не будет.&lt;/p&gt;



&lt;p&gt;Почему не рекомендуется вносить &lt;span class=&quot;item&quot;&gt;.&lt;/span&gt; в &lt;span class=&quot;item&quot;&gt;PATH&lt;/span&gt;? Считается, что в реальной многопользовательской системе всегда найдется какой-нибудь нехороший человек, который разместит в общедоступном каталоге вредоносную программу с именем исполняемого файла, совпадающим с именем какой-нибудь команды, часто вызываемой местным администратором с правами суперпользователя... Заговор удастся если &lt;span class=&quot;item&quot;&gt;.&lt;/span&gt; стоит в начале списка каталогов.&lt;/p&gt;



&lt;/div&gt;



&lt;br&gt;



&lt;div class=&quot;noteblock&quot;&gt;



&lt;p&gt;Утилита &lt;b&gt;file&lt;/b&gt; выводит информацию о типе (с точки зрения системы) переданного в коммандной строке файла, для некоторых типов файлов выводит всякие дополнительные сведения касающиеся содержимого файла.

&lt;br&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;file hello.c&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;hello.c: ASCII C program text&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;file annotation.doc&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot; style=&quot;white-space : normal&quot;&gt;&lt;b&gt;annotation.doc: CDF V2 Document, Little Endian, Os: Windows, Version 5.1, Code page: 1251, Author: MIH, Template: Normal.dot, Last Saved By: MIH, Revision Number: 83, Name of Creating Application: Microsoft Office Word, Total Editing Time: 09:37:00, Last Printed: Thu Jan 22 07:31:00 2009, Create Time/Date: Mon Jan 12 07:36:00 2009, Last Saved Time/Date: Thu Jan 22 07:34:00 2009, Number of Pages: 1, Number of Words: 3094, Number of Characters: 17637, Security: 0&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;



&lt;/div&gt;



&lt;p&gt;Вот собственно и всё, что требуется от пользователя для успешного применения &lt;b&gt;gcc&lt;/b&gt; :)&lt;/p&gt;



&lt;p&gt;Имя выходного исполняемого файла (как впрочем и любого другого файла формируемого &lt;b&gt;gcc&lt;/b&gt;) можно изменить с помощью &lt;b&gt;опции &lt;span class=&quot;item&quot;&gt;-o&lt;/span&gt;&lt;/b&gt;:&lt;/p&gt;



&lt;div class=&quot;codeblock&quot;&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;gcc -o hello hello.c&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;ls&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;hello  hello.c&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;./hello&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;Hello World&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;/div&gt;



&lt;br&gt;



&lt;div class=&quot;noteblock&quot;&gt;



&lt;p&gt;В нашем примере функция &lt;span class=&quot;item&quot;&gt;main()&lt;/span&gt; возвращает казалось бы ни кому не нужное значение &lt;span class=&quot;item&quot;&gt;0&lt;/span&gt;. В UNIX-подобных системах, по завершении работы программы, принято возвращать в командную оболочку целое число - в случае успешного завершения ноль, любое другое в противном случае. Интерпретатор оболочки автоматически присвоит полученное значение переменной среды с именем &lt;span class=&quot;item&quot;&gt;?&lt;/span&gt;. Просмотреть её содержимое можно с помощью команды &lt;span class=&quot;item&quot;&gt;echo $?&lt;/span&gt;:

&lt;br&gt;

&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;./hello&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;Hello World&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;echo $?&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;0&lt;/b&gt;&lt;/span&gt;



&lt;/div&gt;



&lt;p&gt;Выше было сказано, что &lt;b&gt;gcc&lt;/b&gt; это управляющая программа, предназначенная для автоматизации процесса компиляции. Посмотрим что же на самом деле происходит в результате исполнения команды &lt;span class=&quot;item&quot;&gt;gcc hello.c&lt;/span&gt;.&lt;/p&gt;



&lt;p&gt;Процесс компиляции можно разбить на 4 основных этапа: обработка препроцессором, собственно компиляция, ассемблирование, линковка (связывание).&lt;/p&gt;



&lt;p&gt;Опции &lt;b&gt;gcc&lt;/b&gt; позволяют прервать процесс на любом из этих этапов.&lt;/p&gt;



&lt;p&gt;Препроцессор осуществляет подготовку исходного файла к компиляции -  вырезает комментарии, добавляет содержимое заголовочных файлов (директива препроцессора &lt;span class=&quot;item&quot;&gt;#include&lt;/span&gt;), реализует раскрытие макросов (символических констант, директива препроцессора &lt;span class=&quot;item&quot;&gt;#define&lt;/span&gt;).&lt;/p&gt;



&lt;p&gt;Воспользовавшись &lt;b&gt;опцией &lt;span class=&quot;item&quot;&gt;-E&lt;/span&gt;&lt;/b&gt; дальнейшие действия &lt;b&gt;gcc&lt;/b&gt; можно прервать и просмотреть содержимое файла, обработанного препроцессором.&lt;/p&gt;



&lt;div class=&quot;codeblock&quot;&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;gcc -E -o hello.i hello.c&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;ls&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;hello.c  hello.i&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;less hello.i&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;. . .&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;# 1 &quot;/usr/include/stdio.h&quot; 1 3 4&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;# 28 &quot;/usr/include/stdio.h&quot; 3 4&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;# 1 &quot;/usr/include/features.h&quot; 1 3 4&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;. . .&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;typedef unsigned char __u_char;&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;typedef unsigned short int __u_short;&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;typedef unsigned int __u_int;&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;. . .&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;extern int printf (__const char *__restrict __format, ...);&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;. . .&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;# 4 &quot;hello.c&quot; 2&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;main (void)&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;{&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt; printf (&quot;Hello World\n&quot;);&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt; return 0;&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;}&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;/div&gt;



&lt;p&gt;После обработки препроцессором исходный текст нашей программы разбух и приобрел не удобочитаемый вид. Код, который мы когда-то собственноручно набили, свелся к нескольким строчкам в самом конце файла. Причина - подключение заголовочного файла стандартной библиотеки &lt;b&gt;C&lt;/b&gt;. Заголовочный файл &lt;span class=&quot;item&quot;&gt;stdio.h&lt;/span&gt; сам по себе содержит много всего разного да ещё требует включения других заголовочных файлов.&lt;/p&gt;



&lt;p&gt;Обратите внимание на расширение файла &lt;span class=&quot;item&quot;&gt;hello.i&lt;/span&gt;. По соглашениям &lt;b&gt;gcc&lt;/b&gt; расширение &lt;span class=&quot;item&quot;&gt;.i&lt;/span&gt; соответствует файлам с исходным кодом на языке &lt;b&gt;C&lt;/b&gt; не требующим обработки препроцессором. Такие файлы компилируются минуя препроцессор:&lt;/p&gt;



&lt;div class=&quot;codeblock&quot;&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;gcc -o hello hello.i&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;ls&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;hello  hello.c  hello.i&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;./hello&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;Hello World&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;/div&gt;



&lt;p&gt;После препроцессинга наступает очередь компиляции. Компилятор преобразует исходный текст программы на языке высокого уровня в код на языке ассемблера.&lt;/p&gt;



&lt;div class=&quot;noteblock&quot;&gt;



&lt;p&gt;Значение слова компиляция размыто. Википедисты, например, считают, ссылаясь на международные стандарты, что компиляция это &quot;преобразование программой-компилятором  исходного текста какой-либо программы, написанного на языке программирования высокого уровня, в язык, близкий к машинному, или в объектный код.&quot; В принципе это определение нам подходит, язык ассемблера действительно ближе к машинному, чем &lt;b&gt;C&lt;/b&gt;. Но в обыденной жизни под компиляцией чаще всего понимают просто любую операцию, преобразующую исходный код программы на каком-либо языке программирования в исполняемый код. То есть процесс, включающий все четыре означенных выше, этапа также может быть назван компиляцией. Подобная неоднозначность присутствует и в настоящем тексте. С другой стороны, операцию преобразования исходного текста программы в код на языке ассемблера можно обозначить и словом трансляция - &quot;преобразование программы, представленной на одном из языков программирования, в программу на другом языке и, в определённом смысле, равносильную первой&quot;.&lt;/p&gt;



&lt;/div&gt;



&lt;p&gt;Остановить процесс создания исполняемого файла по завершении компиляции позволяет &lt;b&gt;опция &lt;span class=&quot;item&quot;&gt;-S&lt;/span&gt;&lt;/b&gt;:&lt;/p&gt;



&lt;div class=&quot;codeblock&quot;&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;gcc -S hello.c&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;ls&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;hello.c  hello.s&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;file hello.s&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;hello.s: ASCII assembler program text&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;less hello.s&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;        .file   &quot;hello.c&quot;&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;        .section        .rodata&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;.LC0:&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;        .string &quot;Hello World&quot;&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;        .text&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;.globl main&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;        .type   main, @function&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;main:&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;        pushl   %ebp&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;        movl    %esp, %ebp&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;        andl    $-16, %esp&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;        subl    $16, %esp&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;        movl    $.LC0, (%esp)&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;        call    puts&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;        movl    $0, %eax&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;        leave&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;        ret&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;        .size   main, .-main&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;        .ident  &quot;GCC: (Ubuntu 4.4.3-4ubuntu5) 4.4.3&quot;&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;        .section        .note.GNU-stack,&quot;&quot;,@progbits&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;/div&gt;



&lt;p&gt;В каталоге появился файл &lt;span class=&quot;item&quot;&gt;hello.s&lt;/span&gt;, содержащий реализацию программы на языке ассемблера. Обратите внимание, задавать имя выходного файла с помощью &lt;b&gt;опции &lt;span class=&quot;item&quot;&gt;-o&lt;/span&gt;&lt;/b&gt; в данном случае не потребовалось, &lt;b&gt;gcc&lt;/b&gt; автоматически его сгенерировал, заменив в имени исходного файла расширение &lt;span class=&quot;item&quot;&gt;.c&lt;/span&gt; на &lt;span class=&quot;item&quot;&gt;.s&lt;/span&gt;. Для большинства основных операций &lt;b&gt;gcc&lt;/b&gt; имя выходного файла формируется путем подобной замены. Расширение &lt;span class=&quot;item&quot;&gt;.s&lt;/span&gt; стандартное для файлов с исходным кодом на языке ассемблера.&lt;/p&gt;



&lt;p&gt;Получить исполняемый код разумеется можно и из файла &lt;span class=&quot;item&quot;&gt;hello.s&lt;/span&gt;:&lt;/p&gt;



&lt;div class=&quot;codeblock&quot;&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;gcc -o hello hello.s&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;ls&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;hello  hello.c  hello.s&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;./hello&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;Hello World&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;/div&gt;



&lt;p&gt;Следующий этап операция ассмеблирования - трансляция кода на языке ассемблера в машинный код. Результат операции - объектный файл. Объектный файл содержит блоки готового к исполнению машинного кода, блоки данных, а также список определенных в файле функций и внешних переменных (&lt;b&gt;&lt;i&gt;таблицу символов&lt;/i&gt;&lt;/b&gt;), но при этом в нем не заданы абсолютные адреса ссылок на функции и данные. Объектный файл не может быть запущен на исполнение непосредственно, но в дальнейшем (на этапе линковки) может быть объединен с другими объектными файлами (при этом, в соответствии с таблицами символов, будут вычислены и заполнены адреса существующих между файлами перекрестных ссылок). Опция &lt;b&gt;gcc&lt;/b&gt; &lt;span class=&quot;item&quot;&gt;-c&lt;/span&gt;, останавливает процесс по завершении этапа ассемблирования:&lt;/p&gt;



&lt;div class=&quot;codeblock&quot;&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;gcc -c hello.c&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;ls&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;hello.c  hello.o&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;file hello.o&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;hello.o: ELF 64-bit LSB relocatable, x86-64, version 1 (SYSV), not stripped&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;/div&gt;



&lt;p&gt;Для объектных файлов принято стандартное расширение &lt;span class=&quot;item&quot;&gt;.o&lt;/span&gt;.&lt;/p&gt;



&lt;p&gt;Если полученный объектный файл &lt;span class=&quot;item&quot;&gt;hello.o&lt;/span&gt; передать линковщику, последний вычислит адреса ссылок, добавит код запуска и завершения программы, код вызова библиотечных функций и в результате мы будем обладать готовым исполняемым файлом программы.&lt;/p&gt;



&lt;div class=&quot;codeblock&quot;&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;gcc -o hello hello.o&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;ls&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;hello  hello.c  hello.o&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;./hello&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;Hello World&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;/div&gt;



&lt;p&gt;То, что мы сейчас проделали (вернее &lt;b&gt;gcc&lt;/b&gt; проделал за нас) и есть содержание последнего этапа - линковки (связывания, компоновки).&lt;/p&gt;



&lt;p&gt;Ну вот пожалуй о компиляции и все. Теперь коснемся некоторых, на мой взгляд важных, опций &lt;b&gt;gcc&lt;/b&gt;.&lt;/p&gt;



&lt;p&gt;&lt;b&gt;Опция &lt;span class=&quot;item&quot;&gt;-I&lt;/span&gt;&lt;span class=&quot;gitem&quot;&gt;путь/к/каталогу/с/заголовочными/файлами&lt;/span&gt;&lt;/b&gt; - добавляет указанный каталог к списку путей поиска заголовочных файлов. Каталог, добавленный опцией &lt;b&gt;&lt;span class=&quot;item&quot;&gt;-I&lt;/span&gt;&lt;/b&gt; просматривается первым, затем поиск продолжается в стандартных системных каталогах. Если опций &lt;b&gt;&lt;span class=&quot;item&quot;&gt;-I&lt;/span&gt;&lt;/b&gt; несколько, заданные ими каталоги просматриваются слева на право, по мере появления опций.&lt;/p&gt; 



&lt;p&gt;&lt;b&gt;Опция &lt;span class=&quot;item&quot;&gt;-Wall&lt;/span&gt;&lt;/b&gt; - выводит предупреждения, вызванные потенциальными ошибками в коде, не препятствующими компиляции программы, но способными привести, по мнению компилятора, к тем или иным проблемам при её исполнении. Важная и полезная опция, разработчики &lt;b&gt;gcc&lt;/b&gt; рекомендуют пользоваться ей всегда. Например масса предупреждений будет выдана при попытке компиляции вот такого файла:&lt;/p&gt;



&lt;div class=&quot;codeblock&quot;&gt;

&lt;code&gt;&lt;font color=&quot;#a52a2a&quot;&gt; 1 &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;/*&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; remark.c &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;*/&lt;/font&gt;&lt;/code&gt;&lt;br&gt;

&lt;code&gt;&lt;font color=&quot;#a52a2a&quot;&gt; 2 &lt;/font&gt;&lt;/code&gt;&lt;br&gt;

&lt;code&gt;&lt;font color=&quot;#a52a2a&quot;&gt; 3 &lt;/font&gt;&lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;static&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; k = &lt;font color=&quot;#ff00ff&quot;&gt;0&lt;/font&gt;;&lt;/code&gt;&lt;br&gt;

&lt;code&gt;&lt;font color=&quot;#a52a2a&quot;&gt; 4 &lt;/font&gt;&lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;static&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; l(&lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; a);&lt;/code&gt;&lt;br&gt;

&lt;code&gt;&lt;font color=&quot;#a52a2a&quot;&gt; 5 &lt;/font&gt;&lt;/code&gt;&lt;br&gt;

&lt;code&gt;&lt;font color=&quot;#a52a2a&quot;&gt; 6 &lt;/font&gt;main()&lt;/code&gt;&lt;br&gt;

&lt;code&gt;&lt;font color=&quot;#a52a2a&quot;&gt; 7 &lt;/font&gt;{&lt;/code&gt;&lt;br&gt;

&lt;code&gt;&lt;font color=&quot;#a52a2a&quot;&gt; 8 &lt;/font&gt;&lt;/code&gt;&lt;br&gt;

&lt;code&gt;&lt;font color=&quot;#a52a2a&quot;&gt; 9 &lt;/font&gt;        &lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; a;&lt;/code&gt;&lt;br&gt;

&lt;code&gt;&lt;font color=&quot;#a52a2a&quot;&gt;10 &lt;/font&gt;&lt;/code&gt;&lt;br&gt;

&lt;code&gt;&lt;font color=&quot;#a52a2a&quot;&gt;11 &lt;/font&gt;        &lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; b, c;&lt;/code&gt;&lt;br&gt;

&lt;code&gt;&lt;font color=&quot;#a52a2a&quot;&gt;12 &lt;/font&gt;&lt;/code&gt;&lt;br&gt;

&lt;code&gt;&lt;font color=&quot;#a52a2a&quot;&gt;13 &lt;/font&gt;        b + &lt;font color=&quot;#ff00ff&quot;&gt;1&lt;/font&gt;;&lt;/code&gt;&lt;br&gt;

&lt;code&gt;&lt;font color=&quot;#a52a2a&quot;&gt;14 &lt;/font&gt;&lt;/code&gt;&lt;br&gt;

&lt;code&gt;&lt;font color=&quot;#a52a2a&quot;&gt;15 &lt;/font&gt;        b = c;&lt;/code&gt;&lt;br&gt;

&lt;code&gt;&lt;font color=&quot;#a52a2a&quot;&gt;16 &lt;/font&gt;&lt;/code&gt;&lt;br&gt;

&lt;code&gt;&lt;font color=&quot;#a52a2a&quot;&gt;17 &lt;/font&gt;        &lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; *p;&lt;/code&gt;&lt;br&gt;

&lt;code&gt;&lt;font color=&quot;#a52a2a&quot;&gt;18 &lt;/font&gt;&lt;/code&gt;&lt;br&gt;

&lt;code&gt;&lt;font color=&quot;#a52a2a&quot;&gt;19 &lt;/font&gt;        b = *p;&lt;/code&gt;&lt;br&gt;

&lt;code&gt;&lt;font color=&quot;#a52a2a&quot;&gt;20 &lt;/font&gt;&lt;/code&gt;&lt;br&gt;

&lt;code&gt;&lt;font color=&quot;#a52a2a&quot;&gt;21 &lt;/font&gt;}&lt;/code&gt;&lt;br&gt;

&lt;/div&gt;



&lt;br&gt;



&lt;div class=&quot;codeblock&quot;&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;gcc -o remark remark.c&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;gcc -Wall -o remark remark.c&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;remark.c:7: warning: return type defaults to ‘int’&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;remark.c: In function ‘main’:&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;remark.c:13: warning: statement with no effect&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;remark.c:9: warning: unused variable ‘a’&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;remark.c:21: warning: control reaches end of non-void function&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;remark.c: At top level:&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;remark.c:3: warning: ‘k’ defined but not used&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;remark.c:4: warning: ‘l’ declared ‘static’ but never defined&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;remark.c: In function ‘main’:&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;remark.c:15: warning: ‘c’ is used uninitialized in this function&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;remark.c:19: warning: ‘p’ is used uninitialized in this function&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;/div&gt;



&lt;p&gt;&lt;b&gt;Опция &lt;span class=&quot;item&quot;&gt;-Werror&lt;/span&gt;&lt;/b&gt; - превращает все предупреждения в ошибки. В случае появления предупреждения прерывает процесс компиляции. Используется совместно с &lt;b&gt;опцией &lt;span class=&quot;item&quot;&gt;-Wall&lt;/span&gt;&lt;/b&gt;.&lt;/p&gt;



&lt;div class=&quot;codeblock&quot;&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;gcc -Werror -o remark remark.c&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;gcc -Werror -Wall -o remark remark.c&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;cc1: warnings being treated as errors&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;remark.c:7: error: return type defaults to ‘int’&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;remark.c: In function ‘main’:&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;remark.c:13: error: statement with no effect&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;remark.c:9: error: unused variable ‘a’&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;/div&gt;



&lt;p&gt;&lt;b&gt;Опция &lt;span class=&quot;item&quot;&gt;-g&lt;/span&gt;&lt;/b&gt; - помещает в объектный или исполняемый файл информацию необходимую для работы отладчика &lt;b&gt;gdb&lt;/b&gt;. При сборке какого-либо проекта с целью последующей отладки, &lt;b&gt;опцию &lt;span class=&quot;item&quot;&gt;-g&lt;/span&gt;&lt;/b&gt; необходимо включать как на этапе компиляции так и на этапе компоновки.&lt;/p&gt;



&lt;p&gt;&lt;b&gt;Опции &lt;span class=&quot;item&quot;&gt;-O1&lt;/span&gt;, &lt;span class=&quot;item&quot;&gt;-O2&lt;/span&gt;, &lt;span class=&quot;item&quot;&gt;-O3&lt;/span&gt;&lt;/b&gt; - задают уровень оптимизации кода генерируемого компилятором. С увеличением номера, степень оптимизации возрастает. Действие опций можно увидеть вот на таком примере.&lt;/p&gt;



&lt;p&gt;Исходный файл:&lt;/p&gt;



&lt;div class=&quot;codeblock&quot;&gt;

&lt;code&gt;&lt;font color=&quot;#0000ff&quot;&gt;/*&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; circle.c &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;*/&lt;/font&gt;&lt;/code&gt;&lt;br&gt;

&lt;br&gt;

&lt;code&gt;main(&lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;void&lt;/b&gt;&lt;/font&gt;)&lt;/code&gt;&lt;br&gt;

&lt;code&gt;{&lt;/code&gt;&lt;br&gt;

&lt;br&gt;

&lt;code&gt;        &lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; i;&lt;/code&gt;&lt;br&gt;

&lt;br&gt;

&lt;code&gt;        &lt;font color=&quot;#a52a2a&quot;&gt;&lt;b&gt;for&lt;/b&gt;&lt;/font&gt;(i = &lt;font color=&quot;#ff00ff&quot;&gt;0&lt;/font&gt;; i &amp;lt; &lt;font color=&quot;#ff00ff&quot;&gt;10&lt;/font&gt;; ++i)&lt;/code&gt;&lt;br&gt;

&lt;code&gt;                ;&lt;/code&gt;&lt;br&gt;

&lt;br&gt;        

&lt;code&gt;        &lt;font color=&quot;#a52a2a&quot;&gt;&lt;b&gt;return&lt;/b&gt;&lt;/font&gt; i;&lt;/code&gt;&lt;br&gt;

&lt;br&gt;

&lt;code&gt;}&lt;/code&gt;&lt;br&gt;

&lt;/div&gt;



&lt;p&gt;Компиляция с уровнем оптимизации по умолчанию:&lt;/p&gt;



&lt;div class=&quot;codeblock&quot;&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;gcc -S circle.c&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;less circle.s&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;        .file   &quot;circle.c&quot;&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;        .text&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;.globl main&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;        .type   main, @function&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;main:&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;        pushl   %ebp&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;        movl    %esp, %ebp&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;        subl    $16, %esp&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;        movl    $0, -4(%ebp)&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;        jmp     .L2&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;.L3:&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;        addl    $1, -4(%ebp)&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;.L2:&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;        cmpl    $9, -4(%ebp)&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;        jle     .L3&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;        movl    -4(%ebp), %eax&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;        leave&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;        ret&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;        .size   main, .-main&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;        .ident  &quot;GCC: (Ubuntu 4.4.3-4ubuntu5) 4.4.3&quot;&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;        .section        .note.GNU-stack,&quot;&quot;,@progbits&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;/div&gt;



&lt;p&gt;Компиляция с максимальным уровнем оптимизации:&lt;/p&gt;



&lt;div class=&quot;codeblock&quot;&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;gcc -S -O3 circle.c&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;less circle.s&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;        .file   &quot;circle.c&quot;&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;        .text&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;        .p2align 4,,15&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;.globl main&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;        .type   main, @function&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;main:&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;        pushl   %ebp&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;        movl    $10, %eax&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;        movl    %esp, %ebp&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;        popl    %ebp&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;        ret&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;        .size   main, .-main&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;        .ident  &quot;GCC: (Ubuntu 4.4.3-4ubuntu5) 4.4.3&quot;&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;        .section        .note.GNU-stack,&quot;&quot;,@progbits&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;/div&gt;



&lt;p&gt;Во втором случае в полученном коде даже нет намёка на какой-либо цикл. Действительно, значение &lt;span class=&quot;code&quot;&gt;i&lt;/span&gt;, можно вычислить ещё на этапе компиляции, что и было сделано.&lt;/p&gt;



&lt;p&gt;Увы, для реальных проектов разница в производительности при различных уровнях оптимизации практически не заметна...&lt;/p&gt;



&lt;p&gt;&lt;b&gt;Опция &lt;span class=&quot;item&quot;&gt;-O0&lt;/span&gt;&lt;/b&gt; - отменяет какую-либо оптимизацию кода. Опция необходима на этапе отладки приложения. Как было показано выше, оптимизация может привести к изменению структуры программы до неузнаваемости, связь между исполняемым и исходным кодом не будет явной, соответственно, пошаговая отладка программы будет не возможна. При включении опции &lt;b&gt;&lt;span class=&quot;item&quot;&gt;-g&lt;/span&gt;&lt;/b&gt;, рекомендуется включать и &lt;b&gt;&lt;span class=&quot;item&quot;&gt;-O0&lt;/span&gt;&lt;/b&gt;.&lt;/p&gt;



&lt;p&gt;&lt;b&gt;Опция &lt;span class=&quot;item&quot;&gt;-Os&lt;/span&gt;&lt;/b&gt; - задает оптимизацию не по эффективности кода, а по размеру получаемого файла. Производительность программы при этом должна быть сопоставима с производительностью кода полученного при компиляции с уровнем оптимизации заданным по умолчанию.&lt;/p&gt;



&lt;p&gt;&lt;b&gt;Опция &lt;span class=&quot;item&quot;&gt;-march=&lt;/span&gt;&lt;span class=&quot;gitem&quot;&gt;architecture&lt;/span&gt;&lt;/b&gt; - задает целевую архитектуру процессора. Список поддерживаемых архитектур обширен, например, для процессоров семейства &lt;b&gt;Intel/AMD&lt;/b&gt; можно задать &lt;b&gt;&lt;span class=&quot;gitem&quot;&gt;i386&lt;/span&gt;&lt;/b&gt;, &lt;b&gt;&lt;span class=&quot;gitem&quot;&gt;pentium&lt;/span&gt;&lt;/b&gt;, &lt;b&gt;&lt;span class=&quot;gitem&quot;&gt;prescott&lt;/span&gt;&lt;/b&gt;, &lt;b&gt;&lt;span class=&quot;gitem&quot;&gt;opteron-sse3&lt;/span&gt;&lt;/b&gt; и т.д. Пользователи бинарных дистрибутивов должны иметь в виду, что для корректной работы программ с указанной опцией желательно, что бы и все подключаемые библиотеки были откомпилированы с той же опцией.&lt;/p&gt;



&lt;p&gt;Об опциях передаваемых линковщику будет сказано ниже.&lt;/p&gt;



&lt;p&gt;Собственно о компиляции все. Далее поговорим о раздельной компиляции и создании библиотек.&lt;/p&gt;



&lt;p&gt;Небольшое дополнение:&lt;/p&gt;



&lt;div class=&quot;noteblock&quot;&gt;



&lt;p&gt;Выше было сказано, что &lt;b&gt;gcc&lt;/b&gt; определяет тип (язык программирования) переданных файлов по их расширению и, в соответствии с угаданным типом (языком), производит действия над ними. Пользователь обязан следить за расширениями создаваемых файлов, выбирая их так, как того требуют соглашения &lt;b&gt;gcc&lt;/b&gt;. В действительности &lt;b&gt;gcc&lt;/b&gt; можно подсовывать файлы с произвольными именами. &lt;b&gt;Опция gcc &lt;span class=&quot;item&quot;&gt;-x&lt;/span&gt;&lt;/b&gt; позволяет явно указать язык программирования компилируемых файлов. Действие опции распространяется на все последующие перечисленные в команде файлы (вплоть до появления следующей опции &lt;b&gt;&lt;span class=&quot;item&quot;&gt;-x&lt;/span&gt;&lt;/b&gt;). Возможные аргументы опции:&lt;/p&gt;



&lt;p class=&quot;pre&quot;&gt;&lt;b&gt;&lt;span class=&quot;gitem&quot;&gt;c                 c-header                 c-cpp-output&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p class=&quot;pre&quot;&gt;&lt;b&gt;&lt;span class=&quot;gitem&quot;&gt;c++               c++-header               c++-cpp-output&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p class=&quot;pre&quot;&gt;&lt;b&gt;&lt;span class=&quot;gitem&quot;&gt;objective-c       objective-c-header       objective-c-cpp-output&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p class=&quot;pre&quot;&gt;&lt;b&gt;&lt;span class=&quot;gitem&quot;&gt;objective-c++     objective-c++-header     objective-c++-cpp-output&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p class=&quot;pre&quot;&gt;&lt;b&gt;&lt;span class=&quot;gitem&quot;&gt;assembler         assembler-with-cpp&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p class=&quot;pre&quot;&gt;&lt;b&gt;&lt;span class=&quot;gitem&quot;&gt;ada&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p class=&quot;pre&quot;&gt;&lt;b&gt;&lt;span class=&quot;gitem&quot;&gt;f77               f77-cpp-input&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p class=&quot;pre&quot;&gt;&lt;b&gt;&lt;span class=&quot;gitem&quot;&gt;f95               f95-cpp-input&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;

&lt;p class=&quot;pre&quot;&gt;&lt;b&gt;&lt;span class=&quot;gitem&quot;&gt;java&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;



&lt;p&gt;Назначение аргументов должно быть понятно из их написания (здесь &lt;b&gt;&lt;span class=&quot;gitem&quot;&gt;cpp&lt;/span&gt;&lt;/b&gt; не имеет ни какого отношения к &lt;b&gt;C++&lt;/b&gt;, это файл исходного кода предварительно обработанный препроцессором). Проверим:&lt;/p&gt;



&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;mv hello.c hello.txt&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;gcc -Wall -x c -o hello hello.txt&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;./hello&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;Hello World&lt;/b&gt;&lt;/span&gt;&lt;br&gt;



&lt;/div&gt;



&lt;h3&gt;Раздельная компиляция&lt;/h3&gt;



&lt;p&gt;Сильной стороной языков &lt;b&gt;C/C++&lt;/b&gt; является возможность разделять исходный код программы по нескольким файлам. Даже можно сказать больше - возможность раздельной компиляции это основа языка, без неё эффективное использование &lt;b&gt;C&lt;/b&gt; не мыслимо. Именно мультифайловое программирование позволяет реализовать на &lt;b&gt;C&lt;/b&gt; крупные проекты, например такие как &lt;b&gt;Linux&lt;/b&gt; (здесь под словом &lt;b&gt;Linux&lt;/b&gt; подразумевается как ядро, так и система в целом). Что даёт раздельная компиляция программисту?&lt;/p&gt;



&lt;p&gt;&lt;b&gt;1.&lt;/b&gt;&amp;nbsp;&amp;nbsp;Позволяет сделать код программы (проекта) более удобочитаемым. Файл исходника на несколько десятков экранов становиться практически неохватным. Если, в соответствии с некой (заранее продуманной) логикой, разбить его на ряд небольших фрагментов (каждый в отдельном файле), совладать со сложностью проекта будет гораздо проще. &lt;/p&gt;



&lt;p&gt;&lt;b&gt;2.&lt;/b&gt;&amp;nbsp;&amp;nbsp;Позволяет сократить время повторной компиляции проекта. Если изменения внесены в один файл нет смысла перекомпилировать весь проект, достаточно заново откомпилировать только этот изменённый файл.&lt;/p&gt;



&lt;p&gt;&lt;b&gt;3.&lt;/b&gt;&amp;nbsp;&amp;nbsp;Позволяет распределить работу над проектом между несколькими разработчиками. Каждый программист творит и отлаживает свою часть проекта, но в любой момент можно будет собрать (пересобрать) все получающиеся наработки в конечный продукт.&lt;/p&gt;



&lt;p&gt;&lt;b&gt;4.&lt;/b&gt;&amp;nbsp;&amp;nbsp;Без раздельной компиляции не существовало бы библиотек. Посредством библиотек реализовано повторное использование и распространение кода на &lt;b&gt;C/C++&lt;/b&gt;, причем кода бинарного, что позволяет с одной стороны предоставить разработчикам простой механизм включения его в свои программы, с другой стороны скрыть от них конкретные детали реализации. Работая над проектом, всегда стоит задумываться над тем, а не понадобиться что-либо из уже сделанного когда-нибудь в будущем? Может стоит заранее выделить и оформить часть кода как библиотеку? По моему, такой подход, существенно упрощает жизнь и экономит массу времени.&lt;/p&gt;



&lt;p&gt;&lt;b&gt;GCC&lt;/b&gt;, разумеется, поддерживает раздельную компиляцию, причем не требует от пользователя каких либо специальных указаний. В общем все очень просто.&lt;/p&gt;



&lt;p&gt;Вот практический пример (правда весьма и весьма условный).&lt;/p&gt;



&lt;p&gt;Набор файлов исходного кода:&lt;/p&gt;



&lt;div class=&quot;codeblock&quot;&gt;

&lt;code&gt;&lt;font color=&quot;#0000ff&quot;&gt;/*&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; main.c &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;*/&lt;/font&gt;&lt;/code&gt;&lt;br&gt;

&lt;br&gt;

&lt;code&gt;&lt;font color=&quot;#a020f0&quot;&gt;#include &lt;/font&gt;&lt;font color=&quot;#ff00ff&quot;&gt;&amp;lt;stdio.h&amp;gt;&lt;/font&gt;&lt;/code&gt;&lt;br&gt;

&lt;br&gt;

&lt;code&gt;&lt;font color=&quot;#a020f0&quot;&gt;#include &lt;/font&gt;&lt;font color=&quot;#ff00ff&quot;&gt;&amp;quot;first.h&amp;quot;&lt;/font&gt;&lt;/code&gt;&lt;br&gt;

&lt;code&gt;&lt;font color=&quot;#a020f0&quot;&gt;#include &lt;/font&gt;&lt;font color=&quot;#ff00ff&quot;&gt;&amp;quot;second.h&amp;quot;&lt;/font&gt;&lt;/code&gt;&lt;br&gt;

&lt;br&gt;

&lt;code&gt;&lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt; main(&lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;void&lt;/b&gt;&lt;/font&gt;)&lt;/code&gt;&lt;br&gt;

&lt;code&gt;{&lt;/code&gt;&lt;br&gt;

&lt;br&gt;

&lt;code&gt;        first();&lt;/code&gt;&lt;br&gt;

&lt;code&gt;        second();&lt;/code&gt;&lt;br&gt;

&lt;br&gt;

&lt;code&gt;        printf(&lt;font color=&quot;#ff00ff&quot;&gt;&amp;quot;Main function...&lt;/font&gt;&lt;font color=&quot;#6a5acd&quot;&gt;\n&lt;/font&gt;&lt;font color=&quot;#ff00ff&quot;&gt;&amp;quot;&lt;/font&gt;);&lt;/code&gt;&lt;br&gt;

&lt;br&gt;

&lt;code&gt;        &lt;font color=&quot;#a52a2a&quot;&gt;&lt;b&gt;return&lt;/b&gt;&lt;/font&gt; &lt;font color=&quot;#ff00ff&quot;&gt;0&lt;/font&gt;;&lt;/code&gt;&lt;br&gt;

&lt;br&gt;

&lt;code&gt;}&lt;/code&gt;&lt;br&gt;

&lt;/div&gt;



&lt;br&gt;



&lt;div class=&quot;codeblock&quot;&gt;

&lt;code&gt;&lt;font color=&quot;#0000ff&quot;&gt;/*&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; first.h &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;*/&lt;/font&gt;&lt;/code&gt;&lt;br&gt;

&lt;br&gt;

&lt;code&gt;&lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;void&lt;/b&gt;&lt;/font&gt; first(&lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;void&lt;/b&gt;&lt;/font&gt;);&lt;/code&gt;&lt;br&gt;

&lt;/div&gt;



&lt;br&gt;



&lt;div class=&quot;codeblock&quot;&gt;

&lt;code&gt;&lt;font color=&quot;#0000ff&quot;&gt;/*&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; first.c &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;*/&lt;/font&gt;&lt;/code&gt;&lt;br&gt;

&lt;br&gt;

&lt;code&gt;&lt;font color=&quot;#a020f0&quot;&gt;#include &lt;/font&gt;&lt;font color=&quot;#ff00ff&quot;&gt;&amp;lt;stdio.h&amp;gt;&lt;/font&gt;&lt;/code&gt;&lt;br&gt;

&lt;br&gt;

&lt;code&gt;&lt;font color=&quot;#a020f0&quot;&gt;#include &lt;/font&gt;&lt;font color=&quot;#ff00ff&quot;&gt;&amp;quot;first.h&amp;quot;&lt;/font&gt;&lt;/code&gt;&lt;br&gt;

&lt;br&gt;

&lt;code&gt;&lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;void&lt;/b&gt;&lt;/font&gt; first(&lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;void&lt;/b&gt;&lt;/font&gt;)&lt;/code&gt;&lt;br&gt;

&lt;code&gt;{&lt;/code&gt;&lt;br&gt;

&lt;br&gt;

&lt;code&gt;        printf(&lt;font color=&quot;#ff00ff&quot;&gt;&amp;quot;First function...&lt;/font&gt;&lt;font color=&quot;#6a5acd&quot;&gt;\n&lt;/font&gt;&lt;font color=&quot;#ff00ff&quot;&gt;&amp;quot;&lt;/font&gt;);&lt;/code&gt;&lt;br&gt;

&lt;br&gt;

&lt;code&gt;}&lt;/code&gt;&lt;br&gt;

&lt;/div&gt;



&lt;br&gt;



&lt;div class=&quot;codeblock&quot;&gt;

&lt;code&gt;&lt;font color=&quot;#0000ff&quot;&gt;/*&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; second.h &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;*/&lt;/font&gt;&lt;/code&gt;&lt;br&gt;

&lt;br&gt;

&lt;code&gt;&lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;void&lt;/b&gt;&lt;/font&gt; second(&lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;void&lt;/b&gt;&lt;/font&gt;);&lt;/code&gt;&lt;br&gt;

&lt;/div&gt;



&lt;br&gt;



&lt;div class=&quot;codeblock&quot;&gt;

&lt;code&gt;&lt;font color=&quot;#0000ff&quot;&gt;/*&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; second.c &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;*/&lt;/font&gt;&lt;/code&gt;&lt;br&gt;

&lt;br&gt;

&lt;code&gt;&lt;font color=&quot;#a020f0&quot;&gt;#include &lt;/font&gt;&lt;font color=&quot;#ff00ff&quot;&gt;&amp;lt;stdio.h&amp;gt;&lt;/font&gt;&lt;/code&gt;&lt;br&gt;

&lt;br&gt;

&lt;code&gt;&lt;font color=&quot;#a020f0&quot;&gt;#include &lt;/font&gt;&lt;font color=&quot;#ff00ff&quot;&gt;&amp;quot;second.h&amp;quot;&lt;/font&gt;&lt;/code&gt;&lt;br&gt;

&lt;br&gt;

&lt;code&gt;&lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;void&lt;/b&gt;&lt;/font&gt; second(&lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;void&lt;/b&gt;&lt;/font&gt;)&lt;/code&gt;&lt;br&gt;

&lt;code&gt;{&lt;/code&gt;&lt;br&gt;

&lt;br&gt;

&lt;code&gt;        printf(&lt;font color=&quot;#ff00ff&quot;&gt;&amp;quot;Second function...&lt;/font&gt;&lt;font color=&quot;#6a5acd&quot;&gt;\n&lt;/font&gt;&lt;font color=&quot;#ff00ff&quot;&gt;&amp;quot;&lt;/font&gt;);&lt;/code&gt;&lt;br&gt;

&lt;br&gt;

&lt;code&gt;}&lt;/code&gt;&lt;br&gt;

&lt;/div&gt;



&lt;p&gt;В общем имеем вот что:&lt;/p&gt;



&lt;div class=&quot;codeblock&quot;&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;ls&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;first.c  first.h  main.c  second.c  second.h&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;/div&gt;



&lt;p&gt;Все это хозяйство можно скомпилировать в одну команду:&lt;/p&gt;



&lt;div class=&quot;codeblock&quot;&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;gcc -Wall -o main main.c first.c second.c&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;./main&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;First function...&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;Second function...&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;Main function...&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;/div&gt;



&lt;p&gt;Только это не даст нам практически ни каких бонусов, ну за исключением более структурированного и удобочитаемого кода, разнесённого по нескольким файлам. Все перечисленные выше преимущества появятся в случае такого подхода к компиляции:&lt;/p&gt;



&lt;div class=&quot;codeblock&quot;&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;gcc -Wall -c main.c&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;gcc -Wall -c first.c&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;gcc -Wall -c second.c&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;ls&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;first.c  first.h  first.o  main.c  main.o  second.c  second.h  second.o&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;gcc -o main main.o first.o second.o&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;./main&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;First function...&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;Second function...&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;Main function...&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;/div&gt;



&lt;p&gt;Что мы сделали? Из каждого исходного файла (компилируя с опцией &lt;b&gt;&lt;span class=&quot;item&quot;&gt;-c&lt;/span&gt;&lt;/b&gt;) получили объектный файл. Затем объектные файлы слинковали в итоговый исполняемый. Разумеется команд &lt;b&gt;gcc&lt;/b&gt; стало больше, но в ручную ни кто проекты не собирает, для этого есть утилиты сборщики (самая популярная &lt;b&gt;make&lt;/b&gt;). При использовании утилит сборщиков и проявятся все из перечисленных выше преимуществ раздельной компиляции.&lt;/p&gt;



&lt;p&gt;Возникает вопрос: как линковщик ухитряется собирать вместе объектные файлы, правильно вычисляя адресацию вызовов? Откуда он вообще узнаёт, что в файле &lt;span class=&quot;item&quot;&gt;second.o&lt;/span&gt; содержится код функции &lt;span class=&quot;item&quot;&gt;second()&lt;/span&gt;, а в коде файла &lt;span class=&quot;item&quot;&gt;main.o&lt;/span&gt; присутствует её вызов? Оказывается всё просто - в объектном файле присутствует так называемая &lt;i&gt;&lt;b&gt;таблица символов&lt;/b&gt;&lt;/i&gt;, включающая имена некоторых позиций кода (функций и внешних переменных). Линковщик просматривает таблицу символов каждого объектного файла, ищет общие (с совпадающими именами) позиции, на основании чего делает выводы о фактическом местоположении кода используемых функций (или блоков данных) и, соответственно, производит перерасчёт адресов вызовов в исполняемом файле.&lt;/p&gt;



&lt;p&gt;Просмотреть таблицу символов можно с помощью утилиты &lt;b&gt;nm&lt;/b&gt;.&lt;/p&gt;



&lt;div class=&quot;codeblock&quot;&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;nm main.o&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;         U first&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;00000000 T main&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;         U puts&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;         U second&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;nm first.o&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;00000000 T first&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;         U puts&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;nm second.o&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;         U puts&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;00000000 T second&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;/div&gt;



&lt;p&gt;Появление вызова &lt;span class=&quot;item&quot;&gt;puts&lt;/span&gt; объясняется использованием функции стандартной библиотеки &lt;span class=&quot;item&quot;&gt;printf()&lt;/span&gt;, превратившейся в &lt;span class=&quot;item&quot;&gt;puts()&lt;/span&gt; на этапе компиляции.&lt;/p&gt;



&lt;p&gt;Таблица символов прописывается не только в объектный, но и в исполняемый файл:&lt;/p&gt;



&lt;div class=&quot;codeblock&quot;&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;nm main&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;08049f20 d _DYNAMIC&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;08049ff4 d _GLOBAL_OFFSET_TABLE_&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;080484fc R _IO_stdin_used&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;         w _Jv_RegisterClasses&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;08049f10 d __CTOR_END__&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;08049f0c d __CTOR_LIST__&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;08049f18 D __DTOR_END__&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;08049f14 d __DTOR_LIST__&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;08048538 r __FRAME_END__&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;08049f1c d __JCR_END__&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;08049f1c d __JCR_LIST__&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;0804a014 A __bss_start&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;0804a00c D __data_start&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;080484b0 t __do_global_ctors_aux&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;08048360 t __do_global_dtors_aux&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;0804a010 D __dso_handle&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;         w __gmon_start__&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;080484aa T __i686.get_pc_thunk.bx&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;08049f0c d __init_array_end&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;08049f0c d __init_array_start&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;08048440 T __libc_csu_fini&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;08048450 T __libc_csu_init&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;         U __libc_start_main@@GLIBC_2.0&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;0804a014 A _edata&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;0804a01c A _end&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;080484dc T _fini&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;080484f8 R _fp_hw&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;080482b8 T _init&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;08048330 T _start&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;0804a014 b completed.7021&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;0804a00c W data_start&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;0804a018 b dtor_idx.7023&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;0804840c T first&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;080483c0 t frame_dummy&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;080483e4 T main&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;         U puts@@GLIBC_2.0&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;08048420 T second&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;/div&gt;



&lt;p&gt;Включение таблицы символов в исполняемый файл в частности необходимо для упрощения отладки. В принципе для выполнения приложения она не очень то и  нужна. Для исполняемых файлов реальных программ, с множеством определений функций и внешних переменных, задействующих кучу разных библиотек, таблица символов становиться весьма обширной. Для сокращения размеров выходного файла её можно удалить, воспользовавшись &lt;b&gt;опцией gcc &lt;span class=&quot;item&quot;&gt;-s&lt;/span&gt;&lt;/b&gt;.&lt;/p&gt;



&lt;div class=&quot;codeblock&quot;&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;gcc -s -o main main.o first.o second.o&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;./main&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;First function...&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;Second function...&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;Main function...&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;nm main&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;nm: main: no symbols&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;/div&gt;



&lt;p&gt;Необходимо отметить, что в ходе компоновки, линковщик не делает ни каких проверок контекста вызова функций, он не следит ни за типом возвращаемого значения, ни за типом и количеством принимаемых параметров (да ему и не откуда взять такую информацию). Все проверки корректности вызовов должны быть сделаны на этапе компиляции. В случае мультифайлового программирования для этого необходимо использовать механизм заголовочных файлов языка &lt;b&gt;C&lt;/b&gt;.&lt;/p&gt; 



&lt;h3&gt;Библиотеки&lt;/h3&gt;



&lt;p&gt;Библиотека - в языке &lt;b&gt;C&lt;/b&gt;, файл содержащий объектный код, который может быть присоединен к использующей библиотеку программе на этапе линковки. Фактически библиотека это набор особым образом скомпонованных объектных файлов.&lt;/p&gt;



&lt;p&gt;Назначение библиотек - предоставить программисту стандартный механизм повторного использования кода, причем механизм простой и надёжный.&lt;/p&gt;



&lt;p&gt;С точки зрения операционной системы и прикладного программного обеспечения библиотеки бывают &lt;i&gt;&lt;b&gt;статическими&lt;/b&gt;&lt;/i&gt; и &lt;i&gt;&lt;b&gt;разделяемыми&lt;/b&gt;&lt;/i&gt; (&lt;i&gt;&lt;b&gt;динамическими&lt;/b&gt;&lt;/i&gt;).&lt;/p&gt;



&lt;p&gt;Код статических библиотек включается в состав исполняемого файла в ходе линковки последнего. Библиотека оказывается &quot;зашитой&quot; в файл, код библиотеки &quot;сливается&quot; с остальным кодом файла. Программа использующая статические библиотеки становиться автономной и может быть запущена практически на любом компьютере с подходящей архитектурой и операционной системой.&lt;/p&gt;



&lt;p&gt;Код разделяемой библиотеки загружается и подключается к коду программы операционной системой, по запросу программы в ходе её исполнения. В состав исполняемого файла программы код динамической библиотеки не входит, в исполняемый файл включается только ссылка на библиотеку. В результате, программа использующая разделяемые библиотеки перестает быть автономной и может быть успешно запущена только в системе где задействованные библиотеки установлены.&lt;/p&gt;



&lt;p&gt;Парадигма разделяемых библиотек предоставляет три существенных преимущества:&lt;/p&gt;



&lt;p&gt;&lt;b&gt;1.&lt;/b&gt;&amp;nbsp;&amp;nbsp;Многократно сокращается размер исполняемого файла. В системе, включающей множество бинарных файлов, использующих один и тот же код, отпадает необходимость хранить копию этого кода для каждого исполняемого файла.&lt;/p&gt;   



&lt;p&gt;&lt;b&gt;2.&lt;/b&gt;&amp;nbsp;&amp;nbsp;Код разделяемой библиотеки используемый несколькими приложениями храниться в оперативной памяти в одном экземпляре (на самом деле не всё так просто...), в результате сокращается потребность системы в доступной оперативной памяти.&lt;/p&gt;



&lt;p&gt;&lt;b&gt;3.&lt;/b&gt;&amp;nbsp;&amp;nbsp;Отпадает необходимость пересобирать каждый исполняемый файл в случае внесения изменений в код общей для них библиотеки. Изменения и исправления кода динамической библиотеки автоматически отразятся на каждой из использующих её программ.&lt;/p&gt;



&lt;p&gt;Без парадигмы разделяемых библиотек не существовало бы прекомпиллированных (бинарных) дистрибутивов &lt;b&gt;Linux&lt;/b&gt; (да ни каких бы не существовало). Представьте размеры дистрибутива, в каждый бинарный файл которого, был бы помещен код стандартной библиотеки &lt;b&gt;C&lt;/b&gt; (и всех других подключаемых библиотек). Так же представьте что пришлось бы делать для того, что бы обновить систему, после устранения критической уязвимости в одной из широко задействованных библиотек...&lt;/p&gt;



&lt;p&gt;Теперь немного практики.&lt;/p&gt;



&lt;p&gt;Для иллюстрации воспользуемся набором исходных файлов из предыдущего примера. В нашу самодельную библиотеку поместим код (реализацию) функций &lt;span class=&quot;item&quot;&gt;first()&lt;/span&gt; и &lt;span class=&quot;item&quot;&gt;second()&lt;/span&gt;.&lt;/p&gt;



&lt;p&gt;В Linux принята следующая схема именования файлов библиотек (хотя соблюдается она не всегда) - имя файла библиотеки начинается с префикса &lt;span class=&quot;item&quot;&gt;lib&lt;/span&gt;, за ним следует собственно имя библиотеки, в конце расширение &lt;span class=&quot;item&quot;&gt;.a&lt;/span&gt; (&lt;i&gt;&lt;b&gt;archive&lt;/b&gt;&lt;/i&gt;) - для статической библиотеки, &lt;span class=&quot;item&quot;&gt;.so&lt;/span&gt; (&lt;i&gt;&lt;b&gt;shared object&lt;/b&gt;&lt;/i&gt;) - для разделяемой (динамической), после расширения через точку перечисляются цифры номера версии (только для динамической библиотеки). Имя, соответствующего библиотеке заголовочного файла (опять же как правило), состоит из имени библиотеки (без префикса и версии) и расширения &lt;span class=&quot;item&quot;&gt;.h&lt;/span&gt;. Например: &lt;span class=&quot;item&quot;&gt;libogg.a&lt;/span&gt;, &lt;span class=&quot;item&quot;&gt;libogg.so.0.7.0&lt;/span&gt;, &lt;span class=&quot;item&quot;&gt;ogg.h&lt;/span&gt;.&lt;/p&gt;



&lt;p&gt;В начале создадим и используем статическую библиотеку.&lt;/p&gt;



&lt;p&gt;Функции &lt;span class=&quot;item&quot;&gt;first()&lt;/span&gt; и &lt;span class=&quot;item&quot;&gt;second()&lt;/span&gt; составят содержимое нашей библиотеки &lt;span class=&quot;item&quot;&gt;libhello&lt;/span&gt;. Имя файла библиотеки, соответственно, будет &lt;span class=&quot;item&quot;&gt;libhello.a&lt;/span&gt;. Библиотеке сопоставим заголовочный файл &lt;span class=&quot;item&quot;&gt;hello.h&lt;/span&gt;.&lt;/p&gt; 



&lt;div class=&quot;codeblock&quot;&gt;

&lt;code&gt;&lt;font color=&quot;#0000ff&quot;&gt;/*&lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt; hello.h &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;*/&lt;/font&gt;&lt;/code&gt;&lt;br&gt;

&lt;br&gt;

&lt;code&gt;&lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;void&lt;/b&gt;&lt;/font&gt; first(&lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;void&lt;/b&gt;&lt;/font&gt;);&lt;/code&gt;&lt;br&gt;

&lt;code&gt;&lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;void&lt;/b&gt;&lt;/font&gt; second(&lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;void&lt;/b&gt;&lt;/font&gt;);&lt;/code&gt;&lt;br&gt;

&lt;/div&gt;



&lt;p&gt;Разумеется, строки:&lt;/p&gt;



&lt;div class=&quot;codeblock&quot;&gt;

&lt;code&gt;&lt;font color=&quot;#a020f0&quot;&gt;#include &lt;/font&gt;&lt;font color=&quot;#ff00ff&quot;&gt;&amp;quot;first.h&amp;quot;&lt;/font&gt;&lt;/code&gt;

&lt;/div&gt;



&lt;br&gt;



&lt;div class=&quot;codeblock&quot;&gt;

&lt;code&gt;&lt;font color=&quot;#a020f0&quot;&gt;#include &lt;/font&gt;&lt;font color=&quot;#ff00ff&quot;&gt;&amp;quot;second.h&amp;quot;&lt;/font&gt;&lt;/code&gt;

&lt;/div&gt;



&lt;p&gt;в файлах &lt;span class=&quot;item&quot;&gt;main.c&lt;/span&gt;, &lt;span class=&quot;item&quot;&gt;first.c&lt;/span&gt; и &lt;span class=&quot;item&quot;&gt;second.c&lt;/span&gt; необходимо заменить на:&lt;/p&gt;



&lt;div class=&quot;codeblock&quot;&gt;

&lt;code&gt;&lt;font color=&quot;#a020f0&quot;&gt;#include &lt;/font&gt;&lt;font color=&quot;#ff00ff&quot;&gt;&amp;quot;hello.h&amp;quot;&lt;/font&gt;&lt;/code&gt;

&lt;/div&gt;



&lt;p&gt;Ну а теперь, введем следующую последовательность команд:&lt;/p&gt;



&lt;div class=&quot;codeblock&quot;&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;gcc -Wall -c first.c&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;gcc -Wall -c second.c&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;ar crs libhello.a first.o second.o&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;file libhello.a&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;libhello.a: current ar archive&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;/div&gt;



&lt;p&gt;Как уже было сказано - библиотека это набор объектных файлов. Первыми двумя командами мы и создали эти объектные файлы.&lt;/p&gt;



&lt;p&gt;Далее необходимо объектные файлы скомпоновать в набор. Для этого используется архиватор &lt;b&gt;ar&lt;/b&gt; - утилита &quot;склеивает&quot; несколько файлов в один, в полученный архив включает информацию требуемую для восстановления (извлечения) каждого индивидуального файла (включая его атрибуты принадлежности, доступа, времени). Какого-либо &quot;сжатия&quot; содержимого архива или иного преобразования хранимых данных при этом не производится.&lt;/p&gt;



&lt;p&gt;&lt;b&gt;Опция &lt;span class=&quot;item&quot;&gt;c&lt;/span&gt; &lt;span class=&quot;gitem&quot;&gt;arname&lt;/span&gt;&lt;/b&gt; - создать архив, если архив с именем &lt;span class=&quot;gitem&quot;&gt;arname&lt;/span&gt; не существует он будет создан, в противном случае файлы будут добавлены к имеющемуся архиву.&lt;/p&gt;



&lt;p&gt;&lt;b&gt;Опция &lt;span class=&quot;item&quot;&gt;r&lt;/span&gt;&lt;/b&gt; - задает режим обновления архива, если в архиве файл с указанным именем уже существует, он будет удален, а новый файл дописан в конец архива.&lt;/p&gt;



&lt;p&gt;&lt;b&gt;Опция &lt;span class=&quot;item&quot;&gt;s&lt;/span&gt;&lt;/b&gt; - добавляет (обновляет) индекс архива. В данном случае индекс архива это таблица, в которой для каждого определенного в архивируемых файлах символического имени (имени функции или блока данных) сопоставлено соответствующее ему имя объектного файла. Индекс архива необходим для ускорения работы с библиотекой - для того чтобы найти нужное определение, отпадает необходимость просматривать таблицы символов всех файлов архива, можно сразу перейти к файлу, содержащему искомое имя. Просмотреть индекс архива можно с помощью уже знакомой утилиты &lt;b&gt;nm&lt;/b&gt; воспользовавшись её &lt;b&gt;опцией &lt;span class=&quot;item&quot;&gt;-s&lt;/span&gt;&lt;/b&gt; (так же будут показаны таблицы символов всех объектных файлов архива):&lt;/p&gt;



&lt;div class=&quot;codeblock&quot;&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;nm -s libhello.a&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;Archive index:&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;first in first.o&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;second in second.o&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;first.o:&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;00000000 T first&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;         U puts&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;second.o:&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;         U puts&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;00000000 T second&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;/div&gt;



&lt;p&gt;Для создания индекса архива существует специальная утилита &lt;b&gt;ranlib&lt;/b&gt;. Библиотеку &lt;span class=&quot;item&quot;&gt;libhello.a&lt;/span&gt; можно было сотворить и так:&lt;/p&gt;



&lt;div class=&quot;codeblock&quot;&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;ar cr libhello.a first.o second.o&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;ranlib libhello.a&lt;/span&gt;&lt;br&gt;

&lt;/div&gt;



&lt;p&gt;Впрочем библиотека будет прекрасно работать и без индекса архива.&lt;/p&gt;



&lt;p&gt;Теперь воспользуемся нашей библиотекой:&lt;/p&gt;



&lt;div class=&quot;codeblock&quot;&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;gcc -Wall -c main.c&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;gcc -o main main.o -L. -lhello&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;./main&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;First function...&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;Second function...&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;Main function...&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;/div&gt;



&lt;p&gt;Работает...&lt;/p&gt;



&lt;p&gt;Ну теперь комментарии... Появились две новые опции &lt;b&gt;gcc&lt;/b&gt;:&lt;/p&gt;



&lt;p&gt;&lt;b&gt;Опция &lt;span class=&quot;item&quot;&gt;-l&lt;/span&gt;&lt;span class=&quot;gitem&quot;&gt;name&lt;/span&gt;&lt;/b&gt; - передаётся линковщику, указывает на необходимость подключить к исполняемому файлу библиотеку &lt;span class=&quot;gitem&quot;&gt;libname&lt;/span&gt;. Подключить значит указать, что такие-то и такие-то функции (внешние переменные) определены в такой-то библиотеке. В нашем примере библиотека статическая, все символьные имена будут ссылаться на код находящийся непосредственно в исполняемом файле. Обратите внимание в опции &lt;b&gt;&lt;span class=&quot;item&quot;&gt;-l&lt;/span&gt;&lt;/b&gt; имя библиотеки  задается как &lt;span class=&quot;gitem&quot;&gt;name&lt;/span&gt; без приставки &lt;span class=&quot;gitem&quot;&gt;lib&lt;/span&gt;.&lt;/p&gt;



&lt;p&gt;&lt;b&gt;Опция &lt;span class=&quot;item&quot;&gt;-L&lt;/span&gt;&lt;span class=&quot;gitem&quot;&gt;/путь/к/каталогу/с/библиотеками&lt;/span&gt;&lt;/b&gt; - передаётся линковщику, указывает путь к каталогу содержащему подключаемые библиотеки. В нашем случае задана точка  &lt;b&gt;&lt;span class=&quot;gitem&quot;&gt;.&lt;/span&gt;&lt;/b&gt;, линковщик сначала будет искать библиотеки в текущем каталоге, затем в каталогах определённых в системе.&lt;/p&gt;


&lt;!-- Начало первого дополнения --&gt;

&lt;p&gt;Здесь необходимо сделать небольшое замечание. Дело в том, что для ряда опций &lt;b&gt;gcc&lt;/b&gt; важен порядок их следования в командной строке. Так линковщик ищет код, соответствующий указанным в таблице символов файла именам в библиотеках, перечисленных в командной строке &lt;b&gt;после&lt;/b&gt; имени этого файла. Содержимое библиотек перечисленных до имени файла линковщик игнорирует:&lt;/p&gt;

&lt;div class=&quot;codeblock&quot;&gt;
&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;gcc -Wall -c main.c&lt;/span&gt;&lt;br&gt;
&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;gcc -o main -L. -lhello main.o&lt;/span&gt;&lt;br&gt;
&lt;span class=&quot;console&quot;&gt;&lt;b&gt;main.o: In function `main&#39;:&lt;/b&gt;&lt;/span&gt;&lt;br&gt;
&lt;span class=&quot;console&quot;&gt;&lt;b&gt;main.c:(.text+0xa): undefined reference to `first&#39;&lt;/b&gt;&lt;/span&gt;&lt;br&gt;
&lt;span class=&quot;console&quot;&gt;&lt;b&gt;main.c:(.text+0xf): undefined reference to `second&#39;&lt;/b&gt;&lt;/span&gt;&lt;br&gt;
&lt;span class=&quot;console&quot;&gt;&lt;b&gt;collect2: ld returned 1 exit status&lt;/b&gt;&lt;/span&gt;&lt;br&gt;
&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;gcc -o main main.o -L. -lhello&lt;/span&gt;&lt;br&gt;
&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;./main&lt;/span&gt;&lt;br&gt;
&lt;span class=&quot;console&quot;&gt;&lt;b&gt;First function...&lt;/b&gt;&lt;/span&gt;&lt;br&gt;
&lt;span class=&quot;console&quot;&gt;&lt;b&gt;Second function...&lt;/b&gt;&lt;/span&gt;&lt;br&gt;
&lt;span class=&quot;console&quot;&gt;&lt;b&gt;Main function...&lt;/b&gt;&lt;/span&gt;&lt;br&gt;
&lt;/div&gt;

&lt;p&gt;Такая особенность поведения &lt;b&gt;gcc&lt;/b&gt; обусловлена желанием разработчиков предоставить пользователю возможность по разному комбинировать файлы с библиотеками, использовать пересекающие имена... На мой взгляд, если возможно, лучше этим не заморачиваться. В общем подключаемые библиотеки необходимо перечислять после имени ссылающегося на них файла.&lt;/p&gt;

&lt;!-- Конец первого дополнения --&gt;

&lt;p&gt;Существует альтернативный способ указания местоположения библиотек в системе. В зависимости от дистрибутива, переменная окружения &lt;span class=&quot;item&quot;&gt;LD_LIBRARY_PATH&lt;/span&gt; или &lt;span class=&quot;item&quot;&gt;LIBRARY_PATH&lt;/span&gt; может хранить список разделенных знаком двоеточия каталогов, в которых линковщик должен искать библиотеки. Как правило, по умолчанию эта переменная вообще не определена, но ни чего не мешает её создать:&lt;/p&gt; 



&lt;div class=&quot;codeblock&quot;&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;echo $LD_LIBRARY_PATH&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt; &lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;gcc -o main main.o -lhello&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;/usr/lib/gcc/i686-pc-linux-gnu/4.4.3/../../../../i686-pc-linux-gnu/bin/ld: cannot find -lhello&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;collect2: выполнение ld завершилось с кодом возврата 1&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;export LIBRARY_PATH=.&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;gcc -o main main.o -lhello&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;./main&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;First function...&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;Second function...&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;Main function...&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;/div&gt;



&lt;p&gt;Манипуляции с переменными окружения полезны при создании и отладке собственных библиотек, а так же если возникает необходимость подключить к приложению какую-нибудь нестандартную (устаревшую, обновленную, изменённую - в общем отличную от включенной в дистрибутив) разделяемую библиотеку.&lt;/p&gt;



&lt;p&gt;Теперь создадим и используем библиотеку динамическую.&lt;/p&gt;



&lt;p&gt;Набор исходных файлов остается без изменения. Вводим команды, смотрим что получилось, читаем комментарии:&lt;/p&gt;



&lt;div class=&quot;codeblock&quot;&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;gcc -Wall -fPIC -c first.c&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;gcc -Wall -fPIC -c second.c&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;gcc -shared -o libhello.so.2.4.0.5 -Wl,-soname,libhello.so.2 first.o second.o&lt;/span&gt;&lt;br&gt;

&lt;/div&gt;



&lt;p&gt;Что получили в результате?&lt;/p&gt;



&lt;div class=&quot;codeblock&quot;&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;file libhello.so.2.4.0.5&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;libhello.so.2.4.0.5: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, not stripped&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;/div&gt;



&lt;p&gt;Файл &lt;span class=&quot;item&quot;&gt;libhello.so.2.4.0.5&lt;/span&gt;, это и есть наша разделяемая библиотека. Как её использовать поговорим чуть ниже.&lt;/p&gt;



&lt;p&gt;Теперь комментарии:&lt;/p&gt;



&lt;p&gt;&lt;b&gt;Опция &lt;span class=&quot;item&quot;&gt;-fPIC&lt;/span&gt;&lt;/b&gt; - требует от компилятора, при создании объектных файлов, порождать &lt;i&gt;&lt;b&gt;позиционно-независимый код&lt;/b&gt;&lt;/i&gt; (&lt;i&gt;&lt;b&gt;PIC - Position Independent Code&lt;/b&gt;&lt;/i&gt;), его основное отличие в способе представления адресов. Вместо указания фиксированных (статических) позиций, все адреса вычисляются исходя из смещений заданных в &lt;i&gt;&lt;b&gt;глобальной таблицы смещений&lt;/b&gt;&lt;/i&gt; (&lt;i&gt;&lt;b&gt;global offset table - GOT&lt;/b&gt;&lt;/i&gt;). Формат позиционно-независимого кода позволяет подключать исполняемые модули к коду основной программы в момент её загрузки. Соответственно, основное назначение позиционно-независимого кода - создание динамических (разделяемых) библиотек.&lt;/p&gt;



&lt;p&gt;&lt;b&gt;Опция &lt;span class=&quot;item&quot;&gt;-shared&lt;/span&gt;&lt;/b&gt; - указывает &lt;b&gt;gcc&lt;/b&gt;, что в результате должен быть собран не исполняемый файл, а разделяемый объект - динамическая библиотека.&lt;/p&gt;



&lt;p&gt;&lt;b&gt;Опция &lt;span class=&quot;item&quot;&gt;-Wl,-soname,libhello.so.2&lt;/span&gt;&lt;/b&gt; - задает &lt;i&gt;&lt;b&gt;soname&lt;/b&gt;&lt;/i&gt; библиотеки. О soname подробно поговорим в следующем абзаце. Сейчас обсудим формат опции. Сея странная, на первый взгляд, конструкция с запятыми предназначена для непосредственного взаимодействия пользователя с линковщиком. По ходу компиляции &lt;b&gt;gcc&lt;/b&gt; вызывает линковщик автоматически, автоматически же, по собственному усмотрению, &lt;b&gt;gcc&lt;/b&gt; передает ему необходимые для успешного завершения задания опции. Если у пользователя возникает потребность самому вмешаться в процесс линковки он может воспользоваться специальной опцией &lt;b&gt;gcc&lt;/b&gt; &lt;b&gt;&lt;span class=&quot;item&quot;&gt;-Wl,&lt;/span&gt;&lt;span class=&quot;gitem&quot;&gt;-option&lt;/span&gt;&lt;span class=&quot;item&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;gitem&quot;&gt;value1&lt;/span&gt;&lt;span class=&quot;item&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;gitem&quot;&gt;value2&lt;/span&gt;&lt;span class=&quot;item&quot;&gt;...&lt;/span&gt;&lt;/b&gt;. Что означает передать линковщику (&lt;b&gt;&lt;span class=&quot;item&quot;&gt;-Wl&lt;/span&gt;&lt;/b&gt;) опцию &lt;b&gt;&lt;span class=&quot;gitem&quot;&gt;-option&lt;/span&gt;&lt;/b&gt; с аргументами &lt;b&gt;&lt;span class=&quot;gitem&quot;&gt;value1&lt;/span&gt;&lt;/b&gt;, &lt;b&gt;&lt;span class=&quot;gitem&quot;&gt;value2&lt;/span&gt;&lt;/b&gt; и так далее. В нашем случае линковщику была передана опция &lt;b&gt;&lt;span class=&quot;item&quot;&gt;-soname&lt;/span&gt;&lt;/b&gt; с аргументом &lt;b&gt;&lt;span class=&quot;item&quot;&gt;libhello.so.2&lt;/span&gt;&lt;/b&gt;.&lt;/p&gt;



&lt;p&gt;Теперь о soname. При создании и распространении библиотек встает проблема совместимости и контроля версий. Для того чтобы система, конкретно загрузчик динамических библиотек, имели представление о том библиотека какой версии была использована при компиляции приложения и, соответственно, необходима для его успешного функционирования, был предусмотрен специальный идентификатор - &lt;i&gt;&lt;b&gt;soname&lt;/b&gt;&lt;/i&gt;, помещаемый как в файл самой библиотеки, так и в исполняемый файл приложения. Идентификатор soname это строка, включающая имя библиотеки с префиксом &lt;span class=&quot;item&quot;&gt;lib&lt;/span&gt;, точку, расширение &lt;span class=&quot;item&quot;&gt;so&lt;/span&gt;, снова точку и оду или две (разделенные точкой) цифры версии библиотеки - &lt;span class=&quot;item&quot;&gt;lib&lt;/span&gt;&lt;span class=&quot;gitem&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;item&quot;&gt;.so.&lt;/span&gt;&lt;span class=&quot;gitem&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;item&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;gitem&quot;&gt;y&lt;/span&gt;. То есть soname совпадает с именем файла библиотеки вплоть до первой или второй цифры номера версии. Пусть имя исполняемого файла нашей библиотеки &lt;span class=&quot;item&quot;&gt;libhello.so.2.4.0.5&lt;/span&gt;, тогда soname библиотеки может быть &lt;span class=&quot;item&quot;&gt;libhello.so.2&lt;/span&gt;. При изменении интерфейса библиотеки её soname необходимо изменять! Любая модификация кода, приводящая к несовместимости с предыдущими релизами должна сопровождаться появлением нового soname.&lt;/p&gt;



&lt;p&gt;Как же это все работает? Пусть для успешного исполнения некоторого приложения необходима библиотека с именем &lt;span class=&quot;item&quot;&gt;hello&lt;/span&gt;, пусть в системе таковая имеется, при этом имя файла библиотеки &lt;span class=&quot;item&quot;&gt;libhello.so.2.4.0.5&lt;/span&gt;, а прописанное в нем soname библиотеки &lt;span class=&quot;item&quot;&gt;libhello.so.2&lt;/span&gt;. На этапе компиляции приложения, линковщик, в соответствии с опцией &lt;b&gt;&lt;span class=&quot;item&quot;&gt;-l&lt;/span&gt;&lt;span class=&quot;gitem&quot;&gt;hello&lt;/span&gt;&lt;/b&gt;, будет искать в системе файл с именем &lt;span class=&quot;item&quot;&gt;libhello.so&lt;/span&gt;. В реальной системе &lt;span class=&quot;item&quot;&gt;libhello.so&lt;/span&gt; это символическая ссылка на файл &lt;span class=&quot;item&quot;&gt;libhello.so.2.4.0.5&lt;/span&gt;. Получив доступ к файлу библиотеки, линковщик считает прописанное в нем значение soname и наряду с прочим поместит его в исполняемый файл приложения. Когда приложение будет запущено, загрузчик динамических библиотек получит запрос на подключение библиотеки с soname, считанным из исполняемого файла, и попытается найти в системе библиотеку, имя файла которой совпадает с soname. То есть загрузчик попытается отыскать файл &lt;span class=&quot;item&quot;&gt;libhello.so.2&lt;/span&gt;. Если система настроена корректно, в ней должна присутствовать символическая ссылка &lt;span class=&quot;item&quot;&gt;libhello.so.2&lt;/span&gt; на файл &lt;span class=&quot;item&quot;&gt;libhello.so.2.4.0.5&lt;/span&gt;, загрузчик получит доступ к требуемой библиотеки и далее не задумываясь (и ни чего более не проверяя) подключит её к приложению. Теперь представим, что мы перенесли откомпилированное таким образом приложение в другую систему, где развернута только предыдущая версия библиотеки с soname &lt;span class=&quot;item&quot;&gt;libhello.so.1&lt;/span&gt;. Попытка запустить программу приведет к ошибке, так как в этой системе файла с именем &lt;span class=&quot;item&quot;&gt;libhello.so.2&lt;/span&gt; нет.&lt;/p&gt;



&lt;p&gt;Таким образом, на этапе компиляции линковщику необходимо предоставить файл библиотеки (или символическую ссылку на файл библиотеки) с именем &lt;span class=&quot;item&quot;&gt;lib&lt;/span&gt;&lt;span class=&quot;gitem&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;item&quot;&gt;.so&lt;/span&gt;, на этапе исполнения загрузчику потребуется файл (или символическая ссылка) с именем &lt;span class=&quot;item&quot;&gt;lib&lt;/span&gt;&lt;span class=&quot;gitem&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;item&quot;&gt;.so.&lt;/span&gt;&lt;span class=&quot;gitem&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;item&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;gitem&quot;&gt;y&lt;/span&gt;. При чем имя &lt;span class=&quot;item&quot;&gt;lib&lt;/span&gt;&lt;span class=&quot;gitem&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;item&quot;&gt;.so.&lt;/span&gt;&lt;span class=&quot;gitem&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;item&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;gitem&quot;&gt;y&lt;/span&gt; должно совпадать со строкой soname использованной библиотеки.&lt;/p&gt;



&lt;p&gt;В бинарных дистрибутивах, как правило, файл библиотеки &lt;span class=&quot;item&quot;&gt;libhello.so.2.4.0.5&lt;/span&gt; и ссылка на него &lt;span class=&quot;item&quot;&gt;libhello.so.2&lt;/span&gt; будут помещены в пакет &lt;span class=&quot;item&quot;&gt;libhello&lt;/span&gt;, а необходимая только для компиляции ссылка &lt;span class=&quot;item&quot;&gt;libhello.so&lt;/span&gt;, вместе с заголовочным файлом библиотеки &lt;span class=&quot;item&quot;&gt;hello.h&lt;/span&gt; будет упакована в пакет &lt;span class=&quot;item&quot;&gt;libhello-devel&lt;/span&gt; (в &lt;span class=&quot;item&quot;&gt;devel&lt;/span&gt; пакете окажется и файл статической версии библиотеки &lt;span class=&quot;item&quot;&gt;libhello.a&lt;/span&gt;, статическая библиотека может быть использована, также только на этапе компиляции). При распаковке пакета все перечисленные файлы и ссылки (кроме &lt;span class=&quot;item&quot;&gt;hello.h&lt;/span&gt;) окажутся в одном каталоге.&lt;/p&gt;



&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgATJjFGNQKDkeN9L0x0p-7w8SIRB6_vm16Waq9-zoaEsrWtZ-HAcaEyaYq0GBzn9dKwGlYwmQ44eljXiKy7SnYoDZ1lOCZ-b-uX6q3i2Kj3LbeoOuYO-HPhATD9AnBPVRXvaK7Nq7CxSc/&quot; alt=&quot;Пример именования библиотек в Linux. Ubuntu&quot;/&gt;



&lt;p&gt;Убедимся, что заданная строка soname действительно прописана в файле нашей библиотеки. Воспользуемся мега утилитой &lt;b&gt;objdump&lt;/b&gt; с опцией &lt;span class=&quot;item&quot;&gt;&lt;b&gt;-p&lt;/b&gt;&lt;/span&gt;:&lt;/p&gt;



&lt;div class=&quot;codeblock&quot;&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;objdump -p libhello.so.2.4.0.5 | grep SONAME&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;  SONAME               libhello.so.2&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;/div&gt;



&lt;br&gt;



&lt;div class=&quot;noteblock&quot;&gt;



&lt;p&gt;Утилита &lt;b&gt;objdump&lt;/b&gt; - мощный инструмент, позволяющий получить исчерпывающую информацию о внутреннем содержании (и устройстве) объектного или исполняемого файла. В man странице утилиты сказано, что &lt;b&gt;objdump&lt;/b&gt; прежде всего будет полезен программистам, создающими средства отладки и компиляции, а не просто пишущих какие-нибудь прикладные программы :) В частности с опцией &lt;span class=&quot;item&quot;&gt;&lt;b&gt;-d&lt;/b&gt;&lt;/span&gt; это дизассемблер. Мы воспользовались опцией &lt;span class=&quot;item&quot;&gt;&lt;b&gt;-p&lt;/b&gt;&lt;/span&gt; - вывести различную метаинформацию о объектном файле.&lt;/p&gt;



&lt;/div&gt;



&lt;p&gt;В приведенном примере создания библиотеки мы неотступно следовали принципам раздельной компиляции. Разумеется скомпилировать библиотеку можно было бы и вот так, одним вызовом &lt;b&gt;gcc&lt;/b&gt;:&lt;/p&gt;



&lt;div class=&quot;codeblock&quot;&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;gcc -shared -Wall -fPIC -o libhello.so.2.4.0.5 -Wl,-soname,libhello.so.2 first.c second.c&lt;/span&gt;

&lt;/div&gt;



&lt;p&gt;Теперь попытаемся воспользоваться получившейся библиотекой:&lt;/p&gt;



&lt;div class=&quot;codeblock&quot;&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;gcc -Wall -c main.c&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;gcc -o main main.o -L. -lhello -Wl,-rpath,.&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;/usr/bin/ld: cannot find -lhello&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;collect2: ld returned 1 exit status&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;/div&gt;



&lt;p&gt;Линковщик ругается. Вспоминаем, что было сказано выше о символических ссылках. Создаем &lt;span class=&quot;item&quot;&gt;libhello.so&lt;/span&gt; и повторяем попытку:&lt;/p&gt;



&lt;div class=&quot;codeblock&quot;&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;ln -s libhello.so.2.4.0.5 libhello.so&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;gcc -o main main.o -L. -lhello -Wl,-rpath,.&lt;/span&gt;&lt;br&gt;

&lt;/div&gt;



&lt;p&gt;Теперь все довольны. Запускаем созданный бинарник:&lt;/p&gt;



&lt;div class=&quot;codeblock&quot;&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;./main&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;./main: error while loading shared libraries: libhello.so.2: cannot open shared object file: No such file or directory&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;/div&gt;



&lt;p&gt;Ошибка... Ругается загрузчик, не может найти библиотеку &lt;span class=&quot;item&quot;&gt;libhello.so.2&lt;/span&gt;. Убедимся, что в исполняемом файле действительно прописана ссылка на &lt;span class=&quot;item&quot;&gt;libhello.so.2&lt;/span&gt;:&lt;/p&gt;



&lt;div class=&quot;codeblock&quot;&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;objdump -p main | grep NEEDED&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;  NEEDED               libhello.so.2&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;  NEEDED               libc.so.6&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;/div&gt;



&lt;p&gt;Создаем соответствующую ссылку и повторно запускаем приложение:&lt;/p&gt;



&lt;div class=&quot;codeblock&quot;&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;ln -s libhello.so.2.4.0.5 libhello.so.2&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;./main&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;First function...&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;Second function...&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;Main function...&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;/div&gt;



&lt;p&gt;Заработало... Теперь комментарии по новым опциям &lt;b&gt;gcc&lt;/b&gt;.&lt;/p&gt;



&lt;p&gt;&lt;b&gt;Опция &lt;span class=&quot;item&quot;&gt;-Wl,-rpath,.&lt;/span&gt;&lt;/b&gt; - уже знакомая конструкция, передать линковщику опцию &lt;b&gt;&lt;span class=&quot;item&quot;&gt;-rpath&lt;/span&gt;&lt;/b&gt; с аргументом &lt;b&gt;&lt;span class=&quot;item&quot;&gt;.&lt;/span&gt;&lt;/b&gt;. С помощью &lt;b&gt;&lt;span class=&quot;item&quot;&gt;-rpath&lt;/span&gt;&lt;/b&gt; в исполняемый файл программы можно прописать дополнительные пути по которым загрузчик разделяемых библиотек будет производить поиск библиотечных файлов. В нашем случае прописан путь &lt;b&gt;&lt;span class=&quot;item&quot;&gt;.&lt;/span&gt;&lt;/b&gt; - поиск файлов библиотек будет начинаться с текущего каталога.&lt;/p&gt;



&lt;div class=&quot;codeblock&quot;&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;objdump -p main | grep RPATH&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;  RPATH                .&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;/div&gt;



&lt;p&gt;Благодаря указанной опции, при запуске программы отпала необходимость изменять переменные окружения. Понятно, что если перенести программу в другой каталог и попытаться запустить, файл библиотеки будет не найден и загрузчик выдаст сообщение об ошибке:&lt;/p&gt;



&lt;div class=&quot;codeblock&quot;&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;mv main ..&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;../main&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;First function...&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;Second function...&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;Main function...&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;cd ..&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;./main&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;./main: error while loading shared libraries: libhello.so.2: cannot open shared object file: No such file or directory&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;/div&gt;



&lt;p&gt;Узнать какие разделяемые библиотеки необходимы приложению можно и с помощью утилиты &lt;b&gt;ldd&lt;/b&gt;:&lt;/p&gt;



&lt;div class=&quot;codeblock&quot;&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;ldd main&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt; linux-vdso.so.1 =&gt;  (0x00007fffaddff000)&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt; libhello.so.2 =&gt; ./libhello.so.2 (0x00007f9689001000)&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt; libc.so.6 =&gt; /lib/libc.so.6 (0x00007f9688c62000)&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt; /lib64/ld-linux-x86-64.so.2 (0x00007f9689205000)&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;/div&gt;



&lt;p&gt;В выводе &lt;b&gt;ldd&lt;/b&gt; для каждой требуемой библиотеки указывается её soname и полный путь к файлу библиотеки, определённый в соответствии с настройками системы.&lt;/p&gt;



&lt;p&gt;Сейчас самое время поговорить о том где в системе положено размещать файлы библиотек, где загрузчик пытается их найти и как этим процессом управлять.&lt;/p&gt;



&lt;p&gt;В соответствии с соглашениями &lt;a href=&quot;http://ru.wikipedia.org/wiki/FHS&quot;&gt;&lt;b&gt;FHS (Filesystem Hierarchy Standard)&lt;/b&gt;&lt;/a&gt; в системе должны быть два (как минимум) каталога для хранения файлов библиотек:&lt;/p&gt;



&lt;p&gt;&lt;span class=&quot;item&quot;&gt;/lib&lt;/span&gt; - здесь собраны основные библиотеки дистрибутива, необходимые для работы программ из &lt;span class=&quot;item&quot;&gt;/bin&lt;/span&gt; и &lt;span class=&quot;item&quot;&gt;/sbin&lt;/span&gt;;&lt;/p&gt;



&lt;p&gt;&lt;span class=&quot;item&quot;&gt;/usr/lib&lt;/span&gt; - здесь хранятся библиотеки необходимые прикладным программам из &lt;span class=&quot;item&quot;&gt;/usr/bin&lt;/span&gt; и &lt;span class=&quot;item&quot;&gt;/usr/sbin&lt;/span&gt;;&lt;/p&gt;



&lt;p&gt;Соответствующие библиотекам заголовочные файлы должны находиться в каталоге &lt;span class=&quot;item&quot;&gt;/usr/include&lt;/span&gt;.&lt;/p&gt;



&lt;p&gt;Загрузчик по умолчанию будет искать файлы библиотек в этих каталогах.&lt;/p&gt;



&lt;p&gt;Кроме перечисленных выше, в системе должен присутствовать каталог &lt;span class=&quot;item&quot;&gt;/usr/local/lib&lt;/span&gt; - здесь должны находиться библиотеки, развернутые пользователем самостоятельно, минуя систему управления пакетами (не входящие в состав дистрибутива). Например в этом каталоге по умолчанию окажутся библиотеки скомпилированные из исходников (программы установленные из исходников будут размещены в &lt;span class=&quot;item&quot;&gt;/usr/local/bin&lt;/span&gt; и &lt;span class=&quot;item&quot;&gt;/usr/local/sbin&lt;/span&gt;, разумеется речь идет о бинарных дистрибутивах). Заголовочные файлы библиотек в этом случае будут помещены в &lt;span class=&quot;item&quot;&gt;/usr/local/include&lt;/span&gt;.&lt;/p&gt;



&lt;p&gt;В ряде дистрибутивов (в &lt;b&gt;Ubuntu&lt;/b&gt;) загрузчик не настроен просматривать каталог &lt;span class=&quot;item&quot;&gt;/usr/local/lib&lt;/span&gt;, соответственно, если пользователь установит библиотеку из исходников, система её не увидит. Сиё авторами дистрибутива сделано специально, что бы приучить пользователя устанавливать программное обеспечение только через систему управления пакетами. Как поступить в данном случае будет рассказано ниже.&lt;/p&gt;



&lt;p&gt;В действительности, для упрощения и ускорения процесса поиска файлов библиотек, загрузчик не просматривает при каждом обращении указанные выше каталоги, а пользуется базой данных, хранящейся в файле &lt;span class=&quot;item&quot;&gt;/etc/ld.so.cache&lt;/span&gt; (кэшем библиотек). Здесь собрана информация о том, где в системе находится соответствующий данному soname файл библиотеки. Загрузчик, получив список необходимых конкретному приложению библиотек (список soname библиотек, заданных в исполняемом файле программы), посредством &lt;span class=&quot;item&quot;&gt;/etc/ld.so.cache&lt;/span&gt; определяет путь к файлу каждой требуемой библиотеки и загружает её в память. Дополнительно, загрузчик может просмотреть каталоги перечисленные в системных переменных &lt;span class=&quot;item&quot;&gt;LD_LIBRARY_PATH&lt;/span&gt;, &lt;span class=&quot;item&quot;&gt;LIBRARY_PATH&lt;/span&gt; и в поле &lt;span class=&quot;item&quot;&gt;RPATH&lt;/span&gt; исполняемого файла (смотри выше).&lt;/p&gt;



&lt;p&gt;Для управления и поддержания в актуальном состоянии кэша библиотек используется утилита &lt;b&gt;ldconfig&lt;/b&gt;. Если запустить &lt;b&gt;ldconfig&lt;/b&gt; без каких-либо опций, программа просмотрит каталоги заданные в командной строке, доверенные каталоги &lt;span class=&quot;item&quot;&gt;/lib&lt;/span&gt; и &lt;span class=&quot;item&quot;&gt;/usr/lib&lt;/span&gt;, каталоги перечисленные в файле &lt;span class=&quot;item&quot;&gt;/etc/ld.so.conf&lt;/span&gt;. Для каждого файла библиотеки, оказавшегося в указанных каталогах, будет считано soname, создана основанная на soname символическая ссылка, обновлена информация в &lt;span class=&quot;item&quot;&gt;/etc/ld.so.cache&lt;/span&gt;.&lt;/p&gt;



&lt;p&gt;Убедимся в сказанном:&lt;/p&gt;



&lt;div class=&quot;codeblock&quot;&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;ls&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;hello.h  libhello.so  libhello.so.2.4.0.5  main.c&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;gcc -Wall -o main main.c -L. -lhello&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;./main&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;./main: error while loading shared libraries: libhello.so.2: cannot open shared object file: No such file or directory&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;sudo ldconfig /полный/путь/к/катаогу/c/примером&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;ls&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;hello.h  libhello.so  libhello.so.2  libhello.so.2.4.0.5  main  main.c&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;./main&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;First function...&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;Second function...&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;Main function...&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;sudo ldconfig&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;./main&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;./main: error while loading shared libraries: libhello.so.2: cannot open shared object file: No such file or directory&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;/div&gt;



&lt;p&gt;Первым вызовом &lt;b&gt;ldconfig&lt;/b&gt; мы внесли в кэш нашу библиотеку, вторым вызовом исключили. Обратите внимание, что при компиляции &lt;span class=&quot;item&quot;&gt;main&lt;/span&gt; была опущена опция &lt;b&gt;&lt;span class=&quot;item&quot;&gt;-Wl,-rpath,.&lt;/span&gt;&lt;/b&gt;, в результате загрузчик проводил поиск требуемых библиотек только в кэше.&lt;/p&gt;



&lt;p&gt;Теперь должно быть понятно как поступить если после установки библиотеки из исходников система её не видит. Прежде всего необходимо внести в файл &lt;span class=&quot;item&quot;&gt;/etc/ld.so.conf&lt;/span&gt; полный путь к каталогу с файлами библиотеки (по умолчанию &lt;span class=&quot;item&quot;&gt;/usr/local/lib&lt;/span&gt;). Формат &lt;span class=&quot;item&quot;&gt;/etc/ld.so.conf&lt;/span&gt; - файл содержит список разделённых двоеточием, пробелом, табуляцией или символом новой строки, каталогов, в которых производится поиск библиотек. После чего вызвать &lt;b&gt;ldconfig&lt;/b&gt; без каких-либо опций, но с правами суперпользователя. Всё должно заработать.&lt;/p&gt;



&lt;p&gt;Ну и в конце поговорим о том как уживаются вместе статические и динамические версии библиотек. В чем собственно вопрос? Выше, когда обсуждались принятые имена и расположение файлов библиотек было сказано, что файлы статической и динамической версий библиотеки хранятся в одном и том же каталоге. Как же &lt;b&gt;gcc&lt;/b&gt; узнает какой тип библиотеки мы хотим использовать? По умолчанию предпочтение отдается динамической библиотеки. Если линковщик находит файл динамической библиотеки, он не задумываясь цепляет его к исполняемому файлу программы:&lt;/p&gt;



&lt;div class=&quot;codeblock&quot;&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;ls&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;hello.h  libhello.a  libhello.so  libhello.so.2  libhello.so.2.4.0.5  main.c&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;gcc -Wall -c main.c&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;gcc -o main main.o -L. -lhello -Wl,-rpath,.&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;ldd main&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt; linux-vdso.so.1 =&gt;  (0x00007fffe1bb0000)&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt; libhello.so.2 =&gt; ./libhello.so.2 (0x00007fd50370b000)&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt; libc.so.6 =&gt; /lib/libc.so.6 (0x00007fd50336c000)&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt; /lib64/ld-linux-x86-64.so.2 (0x00007fd50390f000)&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;du -h main&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;12K main&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;/div&gt;



&lt;p&gt;Обратите внимание на размер исполняемого файла программы. Он минимально возможный. Все используемые библиотеки линкуются динамически.&lt;/p&gt;



&lt;p&gt;Существует &lt;b&gt;опция gcc &lt;span class=&quot;item&quot;&gt;-static&lt;/span&gt;&lt;/b&gt; - указание линковщику использовать только статические версии всех необходимых приложению библиотек:&lt;/p&gt;



&lt;div class=&quot;codeblock&quot;&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;gcc -static -o main main.o -L. -lhello&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;file main&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;main: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), statically linked, for GNU/Linux 2.6.15, not stripped&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;ldd main&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt; не является динамическим исполняемым файлом&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;du -h main&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;728K main&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;/div&gt;



&lt;p&gt;Размер исполняемого файла в 60 раз больше, чем в предыдущем примере - в файл включены стандартные библиотеки языка &lt;b&gt;C&lt;/b&gt;. Теперь наше приложение можно смело переносить из каталога в каталог и даже на другие машины, код библиотеки &lt;span class=&quot;item&quot;&gt;hello&lt;/span&gt; внутри файла, программа полностью автономна.&lt;/p&gt;



&lt;p&gt;Как же быть если необходимо осуществить статическую линковку только части использованных библиотек? Возможный вариант решения - сделать имя статической версии библиотеки отличным от имени разделяемой, а при компиляции приложения указывать какую версию мы хотим использовать на этот раз:&lt;/p&gt;



&lt;div class=&quot;codeblock&quot;&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;mv libhello.a libhello_s.a&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;gcc -o main main.o -L. -lhello_s&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;ldd main&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt; linux-vdso.so.1 =&gt;  (0x00007fff021f5000)&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt; libc.so.6 =&gt; /lib/libc.so.6 (0x00007fd0d0803000)&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt; /lib64/ld-linux-x86-64.so.2 (0x00007fd0d0ba4000)&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;du -h main&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;12K main&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;/div&gt;



&lt;p&gt;Так как размер кода библиотеки &lt;span class=&quot;item&quot;&gt;libhello&lt;/span&gt; ничтожен,&lt;/p&gt;



&lt;div class=&quot;codeblock&quot;&gt;

&lt;span class=&quot;console&quot;&gt;$&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;du -h libhello_s.a&lt;/span&gt;&lt;br&gt;

&lt;span class=&quot;console&quot;&gt;&lt;b&gt;4,0K libhello.a&lt;/b&gt;&lt;/span&gt;&lt;br&gt;

&lt;/div&gt;



&lt;p&gt;размер получившегося исполняемого файла практически не отличается от размера файла созданного с использованием динамической линковки.&lt;/p&gt;



&lt;p&gt;Ну вот пожалуй и все. Большое спасибо всем, кто закончил чтение на этом месте.&lt;/p&gt;



&lt;/span&gt;</description><link>http://pyviy.blogspot.com/2010/12/gcc.html</link><author>noreply@blogger.com (Вий)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgATJjFGNQKDkeN9L0x0p-7w8SIRB6_vm16Waq9-zoaEsrWtZ-HAcaEyaYq0GBzn9dKwGlYwmQ44eljXiKy7SnYoDZ1lOCZ-b-uX6q3i2Kj3LbeoOuYO-HPhATD9AnBPVRXvaK7Nq7CxSc/s72-c" height="72" width="72"/><thr:total>54</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-920988537392180762.post-2561400527735838727</guid><pubDate>Wed, 30 Sep 2009 11:45:00 +0000</pubDate><atom:updated>2009-09-30T17:50:15.936+06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">matplotlib</category><category domain="http://www.blogger.com/atom/ns#">Python</category><title>Пакет matplotlib. Наводим красивости</title><description>&lt;p&gt;Продолжаем разговор о пакете &lt;strong&gt;matplotlib&lt;/strong&gt;. Сегодня обсудим способы изменения внешнего вида элементов диаграмм - другими словами способы наведения красивостей.&lt;/p&gt;

&lt;span class=&quot;fullpost&quot;&gt;

&lt;h3&gt;Изменение свойств графических элементов пакета matplotlib&lt;/h3&gt;

&lt;p&gt;Как уже неоднократно отмечалось - в логике &lt;strong&gt;matplotlib&lt;/strong&gt; каждый графический элемент (линия, подпись, рамка, сетка и т.д.) представлен объектом соответствующего класса. Команды (функции) пакета &lt;strong&gt;matplotlib&lt;/strong&gt;, отвечающие за создание какого-либо элемента, как результат выполнения возвращают ссылку на объект представляющий данный элемент:&lt;/p&gt;

&lt;pre class=&quot;codeblock&quot;&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; import matplotlib.pyplot as plt&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; line, = plt.plot([1, 2, 3])&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; line&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;&amp;lt;matplotlib.lines.Line2D object at 0x030509D0&amp;gt;&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; type(line)&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;&amp;lt;class &#39;matplotlib.lines.Line2D&#39;&amp;gt;&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; caption = plt.title(u&#39;Заголовок диаграммы&#39;)&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; caption&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;&amp;lt;matplotlib.text.Text object at 0x0308FC90&amp;gt;&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; type(caption)&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;&amp;lt;class &#39;matplotlib.text.Text&#39;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;Авторы пакета &lt;strong&gt;matplotlib&lt;/strong&gt; предусмотрели три способа изменения свойств графических объектов.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Первый способ.&lt;/b&gt; Каждая команда пакета, создающая тот или иной графический элемент, принимает набор именованных переменных (для каждой из этих переменных уже задано значение по умолчанию), имена которых, как правило, совпадают с именами соответствующих полей (свойств) объекта. Изменяя значения именованных переменных можно изменять свойства создаваемого объекта:&lt;/p&gt; 

&lt;pre class=&quot;codeblock&quot;&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; plt.plot([1, 2, 3], color = &#39;red&#39;, marker = &#39;^&#39;, linestyle = &#39;--&#39;, linewidth = 2, markersize = 5, label = u&#39;Прямая линия&#39;)&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;[&amp;lt;matplotlib.lines.Line2D object at 0x02E3E150&amp;gt;]&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; plt.title(u&#39;Заголовок диаграммы&#39;, color = &#39;black&#39;, family = &#39;fantasy&#39;, fontsize = &#39;x-large&#39;)&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;&amp;lt;matplotlib.text.Text object at 0x02E66E10&amp;gt;&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;&lt;b&gt;Второй способ.&lt;/b&gt; Как и подобает в соответствии с догмами объектно-ориентированного программирования, для каждого поля объекта существуют методы, предоставляющие возможность читать/писать значение поля. Уже существующий объект можно настроить посредством указанных методов:&lt;/p&gt;

&lt;pre class=&quot;codeblock&quot;&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; line, = plt.plot([1, 2, 3])&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; line.set_color(&#39;red&#39;)&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; line.set_marker(&#39;^&#39;)&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; line.set_linestyle(&#39;--&#39;)&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; line.set_linewidth(2)&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;В &lt;strong&gt;matplotlib&lt;/strong&gt; принято следующее соглашение по именованию методов - метод возвращающий значение свойства &lt;span class=&quot;code&quot;&gt;property&lt;/span&gt; именуется &lt;span class=&quot;code&quot;&gt;get_property()&lt;/span&gt;, метод изменяющий значение свойства &lt;span class=&quot;code&quot;&gt;set_property()&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Третий способ.&lt;/b&gt; Часто возникает необходимость для группы объектов (не обязательно экземпляров одного и того же класса) установить одинаковые значения для одного (нескольких) общих свойств. На этот случай авторы &lt;strong&gt;matplotlib&lt;/strong&gt; предусмотрели специальную функцию &lt;span class=&quot;code&quot;&gt;matplotlib.pyplot.setp(*args, **kwargs)&lt;/span&gt; - &quot;setup property&quot; - установить свойство. Функция принимает ссылку или список ссылок на объекты и произвольный набор именованных переменных соответствующих изменяемым свойствам:&lt;/p&gt;

&lt;pre class=&quot;codeblock&quot;&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; import matplotlib.pyplot as plt&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; import numpy as np&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; X = np.linspace(0.0, 5.0, 10)&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; Y1 = X&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; Y2 = 3 * X&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; Y3 = 7 * X&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; lines = plt.plot(X, Y1, X, Y2, X, Y3)&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; plt.setp(lines, color = &#39;red&#39;, marker = &#39;^&#39;, linestyle = &#39;--&#39;, linewidth = 2)&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;[None, None, None, None, None, None, None, None, None, None, None, None]&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; plt.show()&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;В результате выполнения кода примера появиться вот такое окно:&lt;/p&gt;

&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh5O7YvxYaEHCyLCuHP1r5Wh-88Wj-2Llwr_Ku0pnrTXzvtOHM53s0uWPs0PCUu5ExGhgl5kfnsSaWEYe6fuMHqxB-vO5xuUugIPD3MJloRsOWe2xhF-GwLvTCmmh8hGakgVSm3xW6ZlUo/&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh5O7YvxYaEHCyLCuHP1r5Wh-88Wj-2Llwr_Ku0pnrTXzvtOHM53s0uWPs0PCUu5ExGhgl5kfnsSaWEYe6fuMHqxB-vO5xuUugIPD3MJloRsOWe2xhF-GwLvTCmmh8hGakgVSm3xW6ZlUo/s400/setp_example.png&quot; border = &quot;0&quot; alt=&quot;Пакет matplotlib. Пример использования функции setp()&quot;/&gt;&lt;/a&gt;

&lt;p&gt;Все три линии на диаграмме оформлены одинаково.&lt;/p&gt;

&lt;p&gt;А какой глубокий смысл кроется в структуре возвращаемой функцией &lt;span class=&quot;code&quot;&gt;setp()&lt;/span&gt; я, честно говоря, не знаю.&lt;/p&gt;

&lt;p&gt;Возможен и альтернативный синтаксис вызова функции. Вместо набора именованных переменных функция принимает набор пар: строка - имя свойства, произвольный тип - значение свойства (так принято работать с объектами в Matlab):&lt;/p&gt;

&lt;pre class=&quot;codeblock&quot;&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; plt.setp(lines, &#39;color&#39;, &#39;red&#39;, &#39;marker&#39;, &#39;^&#39;, &#39;linestyle&#39;, &#39;--&#39;, &#39;linewidth&#39;, 2)&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;Если необходимо узнать какие значения допустимы для того или иного свойства объекта, можно вызвать функцию &lt;span class=&quot;code&quot;&gt;setp()&lt;/span&gt; передав ей ссылку на объект и строку - имя свойства.&lt;/p&gt;

&lt;pre class=&quot;codeblock&quot;&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; plt.setp(line, &#39;linestyle&#39;)&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt; linestyle: [ &#39;-&#39; | &#39;--&#39; | &#39;-.&#39; | &#39;:&#39; | &#39;None&#39; | &#39; &#39; | &#39;&#39; ] and any drawstyle in combination with a linestyle, e.g. &#39;steps--&#39;.&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; plt.setp(line, &#39;color&#39;)&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt; color: any matplotlib color&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;Если вызвать функцию &lt;span class=&quot;code&quot;&gt;setp()&lt;/span&gt;, передав только ссылку на объект, будет выведен список всех свойств объекта и список возможных значений для каждого из свойств:&lt;/p&gt; 

&lt;pre class=&quot;codeblock&quot;&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; plt.setp(line)&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;  alpha: float (0.0 transparent through 1.0 opaque)
  animated: [True | False]
  antialiased or aa: [True | False]
  axes: an :class:`~matplotlib.axes.Axes` instance
  ...&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;Ну и если первый аргумент функции - список ссылок на объекты, описанные выше действия производятся для объекта, ссылка на который стоит в переданном списке первой.&lt;/p&gt;

&lt;p&gt;В качестве примера приведу код программы использующей все три способа настройки объектов.&lt;/p&gt;

&lt;p&gt;Для начала построим диаграмму без каких либо дополнительных настроек, пусть все свойства всех объектов будут инициализированы системой значениями по умолчанию.&lt;/p&gt;

&lt;pre class=&quot;codeblock&quot;&gt;
&lt;font color=&quot;#0000ff&quot;&gt;# -*- coding: UTF-8 -*-&lt;/font&gt;

&lt;font color=&quot;#a020f0&quot;&gt;import&lt;/font&gt;&amp;nbsp;numpy &lt;font color=&quot;#a020f0&quot;&gt;as&lt;/font&gt;&amp;nbsp;np
&lt;font color=&quot;#a020f0&quot;&gt;import&lt;/font&gt;&amp;nbsp;matplotlib &lt;font color=&quot;#a020f0&quot;&gt;as&lt;/font&gt;&amp;nbsp;mpl
&lt;font color=&quot;#a020f0&quot;&gt;import&lt;/font&gt;&amp;nbsp;matplotlib.pyplot &lt;font color=&quot;#a020f0&quot;&gt;as&lt;/font&gt;&amp;nbsp;plt

&lt;font color=&quot;#0000ff&quot;&gt;# Значения по оси X&lt;/font&gt;
X = np.linspace(0.0, 2.0, 15)
&lt;font color=&quot;#0000ff&quot;&gt;# Значения по оси Y&lt;/font&gt;
Y_01 = X
Y_02 = X * 3
Y_03 = X * 7

&lt;font color=&quot;#0000ff&quot;&gt;# Задаем размер диаграммы&lt;/font&gt;
mpl.rcParams[&#39;&lt;font color=&quot;#ff00ff&quot;&gt;figure.figsize&lt;/font&gt;&#39;] = (8.0, 6.0)

&lt;font color=&quot;#0000ff&quot;&gt;# Строим диаграмму&lt;/font&gt;
&lt;font color=&quot;#0000ff&quot;&gt;# Линии&lt;/font&gt;
line_01 = plt.plot(X, Y_01)
line_02 = plt.plot(X, Y_02)
line_03 = plt.plot(X, Y_03)

&lt;font color=&quot;#0000ff&quot;&gt;# Сохраняем диаграмму в файл&lt;/font&gt;
plt.savefig(&#39;&lt;font color=&quot;#ff00ff&quot;&gt;set_exmp_01.png&lt;/font&gt;&#39;, format = &#39;&lt;font color=&quot;#ff00ff&quot;&gt;png&lt;/font&gt;&#39;)
&lt;/pre&gt;

&lt;p&gt;В результате получим вот такое изображение:&lt;/p&gt;

&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgatZOPMeLO1CrjstV6EeLyn0o7qvf3Mosuh4gt_b6CziRcIXImfvmBjWURjLhvelpNBrK3_wIYZaOjK_FPR0h6uDJyS4Mx3SCmLDjoipUZSHjRlrvN_m2RDRY-fC11jrmPzOzUBfQagFE/&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgatZOPMeLO1CrjstV6EeLyn0o7qvf3Mosuh4gt_b6CziRcIXImfvmBjWURjLhvelpNBrK3_wIYZaOjK_FPR0h6uDJyS4Mx3SCmLDjoipUZSHjRlrvN_m2RDRY-fC11jrmPzOzUBfQagFE/s400/set_exmp_01.png&quot; border=&quot;0&quot; title=&quot;Пакет matplotlib. Пример диаграммы при значениях свойств объектов по умолчанию&quot;/&gt;&lt;/a&gt;

&lt;p&gt;Теперь, взяв за основу код предыдущего примера, настроим, как хотим, свойства каждой прямой.&lt;/p&gt;

&lt;pre class=&quot;codeblock&quot;&gt;
&lt;font color=&quot;#0000ff&quot;&gt;# -*- coding: UTF-8 -*-&lt;/font&gt;

&lt;font color=&quot;#a020f0&quot;&gt;import&lt;/font&gt;&amp;nbsp;numpy &lt;font color=&quot;#a020f0&quot;&gt;as&lt;/font&gt;&amp;nbsp;np
&lt;font color=&quot;#a020f0&quot;&gt;import&lt;/font&gt;&amp;nbsp;matplotlib &lt;font color=&quot;#a020f0&quot;&gt;as&lt;/font&gt;&amp;nbsp;mpl
&lt;font color=&quot;#a020f0&quot;&gt;import&lt;/font&gt;&amp;nbsp;matplotlib.pyplot &lt;font color=&quot;#a020f0&quot;&gt;as&lt;/font&gt;&amp;nbsp;plt

&lt;font color=&quot;#0000ff&quot;&gt;# Значения по оси X&lt;/font&gt;
X = np.linspace(0.0, 2.0, 15)
&lt;font color=&quot;#0000ff&quot;&gt;# Значения по оси Y&lt;/font&gt;
Y_01 = X 
Y_02 = X * 3
Y_03 = X * 7

&lt;font color=&quot;#0000ff&quot;&gt;# Задаем размер диаграммы&lt;/font&gt;
mpl.rcParams[&#39;&lt;font color=&quot;#ff00ff&quot;&gt;figure.figsize&lt;/font&gt;&#39;] = (8.0, 6.0)

&lt;font color=&quot;#0000ff&quot;&gt;# Строим диаграмму&lt;/font&gt;

&lt;font color=&quot;#0000ff&quot;&gt;# Линии&lt;/font&gt;

&lt;font color=&quot;#0000ff&quot;&gt;# Первый способ настройки объектов&lt;/font&gt;
line_01, = plt.plot(X, Y_01, color = &#39;&lt;font color=&quot;#ff00ff&quot;&gt;blue&lt;/font&gt;&#39;, linestyle = &#39;&lt;font color=&quot;#ff00ff&quot;&gt;:&lt;/font&gt;&#39;, linewidth = 1, marker = &#39;&lt;font color=&quot;#ff00ff&quot;&gt;s&lt;/font&gt;&#39;,&amp;nbsp;&amp;nbsp;markersize = 6, markeredgecolor = &#39;&lt;font color=&quot;#ff00ff&quot;&gt;black&lt;/font&gt;&#39;, markerfacecolor = &#39;&lt;font color=&quot;#ff00ff&quot;&gt;blue&lt;/font&gt;&#39;, markeredgewidth = 1, label = u&#39;&lt;font color=&quot;#ff00ff&quot;&gt;y = x&lt;/font&gt;&#39;&amp;nbsp;)

line_02,&amp;nbsp;&amp;nbsp;= plt.plot(X, Y_02)
line_03,&amp;nbsp;&amp;nbsp;= plt.plot(X, Y_03)

&lt;font color=&quot;#0000ff&quot;&gt;# Второй способ настройки объектов&lt;/font&gt;
line_02.set_color(&#39;&lt;font color=&quot;#ff00ff&quot;&gt;red&lt;/font&gt;&#39;)
line_02.set_linestyle(&#39;&lt;font color=&quot;#ff00ff&quot;&gt;:&lt;/font&gt;&#39;)
line_02.set_linewidth(1)
line_02.set_marker(&#39;&lt;font color=&quot;#ff00ff&quot;&gt;D&lt;/font&gt;&#39;)
line_02.set_markersize(5)
line_02.set_markeredgecolor(&#39;&lt;font color=&quot;#ff00ff&quot;&gt;black&lt;/font&gt;&#39;)
line_02.set_markerfacecolor(&#39;&lt;font color=&quot;#ff00ff&quot;&gt;red&lt;/font&gt;&#39;)
line_02.set_markeredgewidth(1)
line_02.set_label(u&#39;&lt;font color=&quot;#ff00ff&quot;&gt;y = 3 * x&lt;/font&gt;&#39;)

&lt;font color=&quot;#0000ff&quot;&gt;# Третьий способ настройки объектов&lt;/font&gt;
plt.setp(line_03, color = &#39;&lt;font color=&quot;#ff00ff&quot;&gt;magenta&lt;/font&gt;&#39;, linestyle = &#39;&lt;font color=&quot;#ff00ff&quot;&gt;:&lt;/font&gt;&#39;, linewidth = 1, marker = &#39;&lt;font color=&quot;#ff00ff&quot;&gt;o&lt;/font&gt;&#39;, markersize = 6, markeredgecolor = &#39;&lt;font color=&quot;#ff00ff&quot;&gt;black&lt;/font&gt;&#39;, markerfacecolor = &#39;&lt;font color=&quot;#ff00ff&quot;&gt;magenta&lt;/font&gt;&#39;, markeredgewidth = 1, label = u&#39;&lt;font color=&quot;#ff00ff&quot;&gt;y = 7 * x&lt;/font&gt;&#39;)

&lt;font color=&quot;#0000ff&quot;&gt;# Задаем интервалы значений по осям X, Y&lt;/font&gt;
plt.axis((-0.03, 2.03, -0.2, 14.2))

&lt;font color=&quot;#0000ff&quot;&gt;# Добавим легенду&lt;/font&gt;
plt.legend(loc = &#39;&lt;font color=&quot;#ff00ff&quot;&gt;best&lt;/font&gt;&#39;)

&lt;font color=&quot;#0000ff&quot;&gt;# Сохраняем диаграмму в файл&lt;/font&gt;
plt.savefig(&#39;&lt;font color=&quot;#ff00ff&quot;&gt;set_exmp_02.png&lt;/font&gt;&#39;, format = &#39;&lt;font color=&quot;#ff00ff&quot;&gt;png&lt;/font&gt;&#39;)
&lt;/pre&gt;

&lt;p&gt;Теперь изображение будет выглядеть вот так:&lt;/p&gt;

&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhoQF7uvKZ4H4BdkISZZ9lBtyXjmTrxgE0i8gSOVCKFGahDO5d_CZRsF2xfrYa9iJu5200nB3ScrKlO3HHNJo5FQyLDYSUq91xLMmSr_PSzYAwt8sXqTsrH_t36cKpjd5JqULIIEJYZ6e0/&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhoQF7uvKZ4H4BdkISZZ9lBtyXjmTrxgE0i8gSOVCKFGahDO5d_CZRsF2xfrYa9iJu5200nB3ScrKlO3HHNJo5FQyLDYSUq91xLMmSr_PSzYAwt8sXqTsrH_t36cKpjd5JqULIIEJYZ6e0/s400/set_exmp_02.png&quot; border=&quot;0&quot; alt=&quot;Пакет matplotlib. Пример диаграммы при измененных значениях свойств объектов&quot;/&gt;&lt;/a&gt;

&lt;p&gt;В примерах, для формирования массивов значений был использован модуль &lt;strong&gt;NumPy&lt;/strong&gt;. С описанием использованных функций этого модуля можно познакомиться прочтя пост &lt;a href=&quot;http://pyviy.blogspot.com/2009/09/numpy.html&quot; title=&quot;Пакет NumPy. Краткое введение&quot;&gt;Пакет NumPy. Краткое введение&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Остановимся подробнее на свойствах объектов класса &lt;span class=&quot;code&quot;&gt;matplotlib.lines.Line2D&lt;/span&gt; - линии, которая неизбежно присутствует практически на каждой диаграмме.&lt;/p&gt;

&lt;h3&gt;О свойствах объектов класса matplotlib.lines.Line2D&lt;/h3&gt;

&lt;p&gt;Ниже в таблице приведены основные свойства объекта класса &lt;span class=&quot;code&quot;&gt;matplotlib.lines.Line2D&lt;/span&gt;.&lt;/p&gt;

&lt;table  class=&quot;my&quot;&gt;

&lt;tbody&gt;

&lt;tr&gt;
&lt;th class=&quot;my&quot; width=&quot;20%&quot;&gt;Свойство&lt;/th&gt;
&lt;th class=&quot;my&quot; width=&quot;20%&quot;&gt;Значение&lt;/th&gt;
&lt;th class=&quot;my&quot;&gt;Описание&lt;/th&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class=&quot;my&quot;&gt;&lt;b&gt;alpha&lt;/b&gt;&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;Вещественное число в интервале [0.0, 1.0]&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;Степень прозрачность элементов линии (собственно линии и маркеров) - от полностью прозрачного 0.0, до полностью непрозрачного 1.0. Пример использования смотри &lt;a href=&quot;#alpha&quot;&gt;ниже&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class=&quot;my&quot;&gt;&lt;b&gt;antialiased&lt;/b&gt; или &lt;b&gt;aa&lt;/b&gt;&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;True, False&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;Включить (True), выключить (False) режим антиалиазинга элементов линии&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class=&quot;my&quot;&gt;&lt;b&gt;color&lt;/b&gt; или &lt;b&gt;c&lt;/b&gt;&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;Один из возможных способов представления цвета в &lt;strong&gt;matplotlib&lt;/strong&gt;, подробности смотри &lt;a href=&quot;#color&quot;&gt;ниже&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;Цвет линии&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class=&quot;my&quot;&gt;&lt;b&gt;dash_capstyle&lt;/b&gt;&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;Строки: &#39;butt&#39;, &#39;round&#39;, &#39;projecting&#39;&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;Стиль оконечностей пунктирной линии. Пример использования смотри &lt;a href=&quot;#dash_capstyle&quot;&gt;ниже&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class=&quot;my&quot;&gt;&lt;b&gt;dash_joinstyle&lt;/b&gt;&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;Строки: &#39;miter&#39;, &#39;round&#39;, &#39;bevel&#39;&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;Стиль соединения пунктирных линий&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class=&quot;my&quot;&gt;&lt;b&gt;dashes&lt;/b&gt;&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;Список (кортеж) целых чисел, количество элементов списка должно быть четным&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;Каждая пара чисел в списке рассматривается как количество индуцируемых точек, количество погашенных точек. С помощью свойства &lt;b&gt;dashes&lt;/b&gt; можно рисовать линии состоящие из произвольного повторяющегося набора штрихов и пунктиров. Пример использования смотри &lt;a href=&quot;#dashes&quot;&gt;ниже&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class=&quot;my&quot;&gt;&lt;b&gt;drawstyle&lt;/b&gt;&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;Строки: &#39;default&#39;, &#39;steps&#39;, &#39;steps-pre&#39;, &#39;steps-mid&#39;, &#39;steps-post&#39;&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;Стиль отображения линии: &#39;default&#39; - соседние точки соединены прямой, остальные значения - соседние точки соединены пересекающимися под прямым углом отрезками (&quot;ступенькой&quot;) с различными вариациями пересечения отрезков. Пример использования смотри &lt;a href=&quot;#drawstyle&quot;&gt;ниже&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class=&quot;my&quot;&gt;&lt;b&gt;label&lt;/b&gt;&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;Произвольная строка&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;Подпись к линии, используется при создании легенды диаграммы&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class=&quot;my&quot;&gt;&lt;b&gt;linestyle&lt;/b&gt; или &lt;b&gt;ls&lt;/b&gt;&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;Строки: &#39;-&#39;, &#39;--&#39;, &#39;-.&#39;, &#39;:&#39;, &#39;steps&#39;, &#39;steps-pre&#39;, &#39;steps-mid&#39;, &#39;steps-post&#39;, &#39;None&#39;, &#39; &#39;, &#39;&#39;&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;Стиль линии. Пример использования первых четырех стилей был приведен &lt;a href=&quot;http://pyviy.blogspot.com/2009/08/matplotlib.html&quot; title=&quot;Пакет matplotlib. Строим банальный график&quot;&gt;ранее&lt;/a&gt;, пример использования следующих четырех (можно задавать и через свойство &lt;b&gt;drawstyle&lt;/b&gt;) смотри &lt;a href=&quot;#drawstyle&quot;&gt;ниже&lt;/a&gt;, &#39;None&#39;, пробел и пустая строка выключают отображение линии, (собственно линии, маркеры, при этом, будут отображаться)&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class=&quot;my&quot;&gt;&lt;b&gt;linewidth&lt;/b&gt; или &lt;b&gt;lw&lt;/b&gt;&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;float&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;Толщина линии в точках&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class=&quot;my&quot;&gt;&lt;b&gt;marker&lt;/b&gt;&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;Строки: &#39;.&#39;, &#39;,&#39;, &#39;o&#39;, &#39;v&#39;, &#39;^&#39;, &#39;&amp;lt;&#39;, &#39;&amp;gt;&#39;, &#39;1&#39;, &#39;2&#39;, &#39;3&#39;, &#39;4&#39;, &#39;s&#39;, &#39;p&#39;, &#39;*&#39;, &#39;h&#39;, &#39;H&#39;, &#39;+&#39;, &#39;x&#39;, &#39;D&#39;, &#39;d&#39;, &#39;|&#39;, &#39;_&#39;&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;Стиль маркера. Пример использования был приведен &lt;a href=&quot;http://pyviy.blogspot.com/2009/08/matplotlib.html&quot; title=&quot;Пакет matplotlib. Строим банальный график&quot;&gt;ранее&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class=&quot;my&quot;&gt;&lt;b&gt;markeredgecolor&lt;/b&gt; или &lt;b&gt;mec&lt;/b&gt;&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;Один из возможных способов представления цвета в &lt;strong&gt;matplotlib&lt;/strong&gt;, подробности смотри &lt;a href=&quot;#color&quot;&gt;ниже&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;Цвет границы маркера&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class=&quot;my&quot;&gt;&lt;b&gt;markeredgewidth&lt;/b&gt; или &lt;b&gt;mew&lt;/b&gt;&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;float&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;Толщина границы маркера в точках&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class=&quot;my&quot;&gt;&lt;b&gt;markerfacecolor&lt;/b&gt; или &lt;b&gt;mfc&lt;/b&gt;&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;Один из возможных способов представления цвета в &lt;strong&gt;matplotlib&lt;/strong&gt;, подробности смотри &lt;a href=&quot;#color&quot;&gt;ниже&lt;/a&gt;&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;Цвет маркера&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class=&quot;my&quot;&gt;&lt;b&gt;markersize&lt;/b&gt; или &lt;b&gt;ms&lt;/b&gt;&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;float&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;Размер маркера в точках&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class=&quot;my&quot;&gt;&lt;b&gt;markevery&lt;/b&gt;&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;None, integer N, список/кортеж (integer start, integer N)&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;Свойство определяет, как будут использоваться маркеры при построении данной линии. Если None будут отображены все маркеры. Если целое число N, будет отображен каждый N-ый маркер. Если кортеж целых чисел (start, N) будет отображен каждый N-ый маркер начиная с start. Пример использования смотри &lt;a href=&quot;#markevery&quot;&gt;ниже&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class=&quot;my&quot;&gt;&lt;b&gt;solid_capstyle&lt;/b&gt;&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;Строки: &#39;butt&#39;, &#39;round&#39;, &#39;projecting&#39;&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;Стиль оконечностей непрерывной линии&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class=&quot;my&quot;&gt;&lt;b&gt;solid_joinstyle&lt;/b&gt;&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;Строки: &#39;miter&#39;, &#39;round&#39;, &#39;bevel&#39;&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;Стиль соединения непрерывных линий&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class=&quot;my&quot;&gt;&lt;b&gt;visible&lt;/b&gt;&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;True, False&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;В случае False линия и маркеры становятся невидимыми. True включает отображение элементов линии&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class=&quot;my&quot;&gt;&lt;b&gt;zorder&lt;/b&gt;&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;integer&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;Порядок наложения элементов диаграммы (Z-order). Элемент с наибольшим значением &lt;b&gt;zorder&lt;/b&gt; будет отображен на переднем плане (по отношению к наблюдателю) или, другими словами, элемент с наибольшим &lt;b&gt;zorder&lt;/b&gt; будет отображен последним (самым верхним).  Пример использования смотри &lt;a href=&quot;#zorder&quot;&gt;ниже&lt;/a&gt;&lt;/td&gt;
&lt;/tr&gt;

&lt;/tbody&gt;

&lt;/table&gt;

&lt;a name=&quot;color&quot;&gt;&lt;/a&gt;&lt;h4&gt;Способы представления цвета в пакете matplotlib&lt;/h4&gt;

&lt;p&gt;Как следует из названия подраздела цвет в &lt;strong&gt;matplotlib&lt;/strong&gt; может быть задан несколькими способами.&lt;/p&gt;

&lt;p&gt;&lt;b&gt;Способ первый.&lt;/b&gt; Из системы &lt;b&gt;Matlab&lt;/b&gt; позаимствованы обозначения для восьми базовых цветов в виде отдельных символов.&lt;/p&gt;

&lt;table class=&quot;my&quot;&gt;

&lt;tbody&gt;

&lt;tr&gt;
&lt;th class=&quot;my&quot; width=&quot;30%&quot;&gt;Символ&lt;/th&gt;

&lt;th class=&quot;my&quot; colspan=&quot;2&quot;&gt;Цвет&lt;/th&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class=&quot;my&quot;&gt;&#39;b&#39;&lt;/td&gt;
&lt;td class=&quot;my&quot; width=&quot;35%&quot;&gt;blue&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;синий&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class=&quot;my&quot;&gt;&#39;g&#39;&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;green&lt;/td&gt;

&lt;td class=&quot;my&quot;&gt;зеленый&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class=&quot;my&quot;&gt;&#39;r&#39;&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;red&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;красный&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class=&quot;my&quot;&gt;&#39;c&#39;&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;cyan&lt;/td&gt;

&lt;td class=&quot;my&quot;&gt;бирюзовый&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class=&quot;my&quot;&gt;&#39;m&#39;&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;magenta&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;пурпурный&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class=&quot;my&quot;&gt;&#39;y&#39;&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;yellow&lt;/td&gt;

&lt;td class=&quot;my&quot;&gt;желтый&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class=&quot;my&quot;&gt;&#39;k&#39;&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;black&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;черный&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class=&quot;my&quot;&gt;&#39;w&#39;&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;white&lt;/td&gt;

&lt;td class=&quot;my&quot;&gt;белый&lt;/td&gt;
&lt;/tr&gt;

&lt;/tbody&gt;

&lt;/table&gt;

&lt;pre class=&quot;codeblock&quot;&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; plt.plot(X, Y_02, color = &#39;m&#39;)&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;&lt;b&gt;Способ второй.&lt;/b&gt; Цвет можно задать используя стандартные обозначения цветов принятые в html, как то &#39;red&#39;, &#39;silver&#39;, &#39;olive&#39; и так далее.&lt;/p&gt;

&lt;pre class=&quot;codeblock&quot;&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; plt.plot(X, Y_02, color = &#39;navy&#39;)&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;&lt;b&gt;Способ третий.&lt;/b&gt; Произвольный цвет можно задать воспользовавшись HEX стилем представления цвета в html: &#39;#cc00cc&#39;, &#39;#9900ff&#39;, &#39;#0099cc&#39;.&lt;/p&gt;

&lt;pre class=&quot;codeblock&quot;&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; plt.plot(X, Y_02, color = &#39;#003399&#39;)&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;&lt;b&gt;Способ четвертый.&lt;/b&gt; Произвольный цвет так же можно задать передав кортеж из трех вещественных чисел, каждое из которых пренадлежит интервалу [0.0, 1.0]. Числа соответствуют представлению цвета в системе RGB: (0.75, 0.0, 1.0), (1.0, 0.33, 0.33), (0.0, 0.47, 0.21).&lt;/p&gt;

&lt;pre class=&quot;codeblock&quot;&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; plt.plot(X, Y_02, color = (0.0, 0.5, 0.32))&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;&lt;b&gt;Способ пятый.&lt;/b&gt; Вариация на тему четвертого способа. Цвет в градации серого можно задать передав &lt;b&gt;строку&lt;/b&gt; являющуюся представлением вещественного числа в диапазоне [0.0, 1.0], &#39;0.0&#39; - совсем черный, &#39;1.0&#39; - совсем белый.&lt;/p&gt;

&lt;pre class=&quot;codeblock&quot;&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; plt.plot(X, Y_02, color = &#39;0.75&#39;)&lt;/span&gt;
&lt;/pre&gt;

&lt;a name=&quot;drawstyle&quot;&gt;&lt;/a&gt;&lt;h4&gt;Свойства linestyle и drawstyle&lt;/h4&gt;

&lt;p&gt;Свойство &lt;span class=&quot;code&quot;&gt;linestyle&lt;/span&gt; включает в себя свойство &lt;span class=&quot;code&quot;&gt;drawstyle&lt;/span&gt; - стили отрисовки &quot;ступенек&quot; можно задать как через &lt;span class=&quot;code&quot;&gt;drawstyle&lt;/span&gt; так и через &lt;span class=&quot;code&quot;&gt;linestyle&lt;/span&gt;. Пример использования на рисунке ниже:&lt;/p&gt;

&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhw9qtzVzLMsdDzwStwibpO_0HkmOAGPNsCJ0Gqu_IBmr4XhUJ4n4Lo5g9BK887ce_NqyhWdeOAyF2RvKLfND5eOPJE4judMI3H7qHJscRZYZVlrvPzFx3xsIwtkJh86nOBnOg7p4kDzR4/&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhw9qtzVzLMsdDzwStwibpO_0HkmOAGPNsCJ0Gqu_IBmr4XhUJ4n4Lo5g9BK887ce_NqyhWdeOAyF2RvKLfND5eOPJE4judMI3H7qHJscRZYZVlrvPzFx3xsIwtkJh86nOBnOg7p4kDzR4/s400/line_style_01.png&quot; border=&quot;0&quot; alt=&quot;Пакет matplotlib. Пример использования свойства drawstyle&quot;/&gt;&lt;/a&gt;

&lt;p&gt;Значения свойства &lt;span class=&quot;code&quot;&gt;drawstyle&lt;/span&gt; и остальные значения свойства &lt;span class=&quot;code&quot;&gt;linestyle&lt;/span&gt; можно комбинировать. Пример на рисунке ниже:&lt;/p&gt;

&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjg0DFS0qklHRRCbVaXiOIHiIOu_665iCaho1vR5zq5j0H02yQS4opMjDOuly7friljUlNA5JXT6l8ztVSF_7ek4mkIe4g8jtt3fnQYnDPm3Vhg0o-ginAYJEN58ZJ6HguK8qgvv-YTm3c/&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjg0DFS0qklHRRCbVaXiOIHiIOu_665iCaho1vR5zq5j0H02yQS4opMjDOuly7friljUlNA5JXT6l8ztVSF_7ek4mkIe4g8jtt3fnQYnDPm3Vhg0o-ginAYJEN58ZJ6HguK8qgvv-YTm3c/s400/line_style_02.png&quot; border=&quot;0&quot; alt=&quot;Пакет matplotlib. Пример использования свойства linestyle&quot;/&gt;&lt;/a&gt;

&lt;a name=&quot;dash_capstyle&quot;&gt;&lt;/a&gt;&lt;h4&gt;Свойство dash_capstyle&lt;/h4&gt;

&lt;p&gt;Для того, чтобы ясно углядеть различия в начертаниях &quot;кончика штриха&quot; необходимо установить толщину линии как минимум в четыре точки. Пример использования на рисунке:&lt;/p&gt;

&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZqMpNCS108uYjgW0Id6Dv17zyUycK1t_lFG0BTDRP97wsbESG7m2dSA0VZsV08V_WvUbo6nZKj1R2ppGaL5EhV9bKbOlOnei_CiNsr4PeO8UFDRFa5A4cGcc8Lb-xBknke4GmE5v3ieg/&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhZqMpNCS108uYjgW0Id6Dv17zyUycK1t_lFG0BTDRP97wsbESG7m2dSA0VZsV08V_WvUbo6nZKj1R2ppGaL5EhV9bKbOlOnei_CiNsr4PeO8UFDRFa5A4cGcc8Lb-xBknke4GmE5v3ieg/s400/dash_capstyle.png&quot; border=&quot;0&quot; alt=&quot;Пакет matplotlib. Пример использования свойства dash_capstyle&quot;/&gt;&lt;/a&gt;

&lt;a name=&quot;dashes&quot;&gt;&lt;/a&gt;&lt;h4&gt;Свойство dashes&lt;/h4&gt;

&lt;p&gt;Когда существующие стили пунктирных линий не устраивают, можно поиграться с значениями свойства &lt;span class=&quot;code&quot;&gt;dashes&lt;/span&gt;:&lt;/p&gt;

&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxBThOaX20v8CoBJBbPr7pNTX3fuwUnT7UNgTLuLhXadTSW03vWE0R_iM_oPt-PdWNFy9A7qQwIRkR2hnQOesmnTB67fnDS7qPytvXV6JCM5IrSaa3au9H78PB3i6j6peCEOqed8pmM7g/&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxBThOaX20v8CoBJBbPr7pNTX3fuwUnT7UNgTLuLhXadTSW03vWE0R_iM_oPt-PdWNFy9A7qQwIRkR2hnQOesmnTB67fnDS7qPytvXV6JCM5IrSaa3au9H78PB3i6j6peCEOqed8pmM7g/s400/dashes.png&quot; border=&quot;0&quot; alt=&quot;Пакет matplotlib. Пример использования свойства dashes&quot;/&gt;&lt;/a&gt;

&lt;a name=&quot;markevery&quot;&gt;&lt;/a&gt;&lt;h4&gt;Свойство markevery&lt;/h4&gt;

&lt;p&gt;Когда данных много и при этом хочется отобразить линию с маркерами, избыточные маркеры, во избежании их слияния, необходимо как то удалить. Можно конечно специально отфильтровать данные (сделать выборку данных), но проще воспользоваться свойством &lt;span class=&quot;code&quot;&gt;markevery&lt;/span&gt;. Вот код примера:&lt;/p&gt;

&lt;pre class=&quot;codeblock&quot;&gt;
&lt;font color=&quot;#0000ff&quot;&gt;# -*- coding: UTF-8 -*-&lt;/font&gt;

&lt;font color=&quot;#a020f0&quot;&gt;import&lt;/font&gt;&amp;nbsp;numpy &lt;font color=&quot;#a020f0&quot;&gt;as&lt;/font&gt;&amp;nbsp;np
&lt;font color=&quot;#a020f0&quot;&gt;import&lt;/font&gt;&amp;nbsp;matplotlib &lt;font color=&quot;#a020f0&quot;&gt;as&lt;/font&gt;&amp;nbsp;mpl
&lt;font color=&quot;#a020f0&quot;&gt;import&lt;/font&gt;&amp;nbsp;matplotlib.pyplot &lt;font color=&quot;#a020f0&quot;&gt;as&lt;/font&gt;&amp;nbsp;plt

&lt;font color=&quot;#0000ff&quot;&gt;# Значения по оси X&lt;/font&gt;
X = np.linspace(0.0, 2.0, 36)
&lt;font color=&quot;#0000ff&quot;&gt;# Значения по оси Y&lt;/font&gt;
Y_01 = np.exp(X)
Y_02 = np.exp(X) + 5.0

&lt;font color=&quot;#0000ff&quot;&gt;# Задаем размер диаграммы&lt;/font&gt;
mpl.rcParams[&#39;&lt;font color=&quot;#ff00ff&quot;&gt;figure.figsize&lt;/font&gt;&#39;] = (8.0, 6.0)

&lt;font color=&quot;#0000ff&quot;&gt;# Строим диаграмму&lt;/font&gt;

&lt;font color=&quot;#0000ff&quot;&gt;# Линии&lt;/font&gt;
line_01,&amp;nbsp;&amp;nbsp;= plt.plot(X, Y_01, &#39;&lt;font color=&quot;#ff00ff&quot;&gt;ro--&lt;/font&gt;&#39;, markevery = None, label =&#39;&lt;font color=&quot;#ff00ff&quot;&gt;markevery = None&lt;/font&gt;&#39;)
line_02,&amp;nbsp;&amp;nbsp;= plt.plot(X, Y_02, &#39;&lt;font color=&quot;#ff00ff&quot;&gt;bo--&lt;/font&gt;&#39;, markevery = (0, 5), label = &#39;&lt;font color=&quot;#ff00ff&quot;&gt;markevery = (0, 5)&lt;/font&gt;&#39;)
&lt;font color=&quot;#0000ff&quot;&gt;# Подпись к диаграмме&lt;/font&gt;
plt.title(u&#39;&lt;font color=&quot;#ff00ff&quot;&gt;Свойство markevery&lt;/font&gt;&#39;)
&lt;font color=&quot;#0000ff&quot;&gt;# Добавляем легенду&lt;/font&gt;
plt.legend(loc = &#39;&lt;font color=&quot;#ff00ff&quot;&gt;best&lt;/font&gt;&#39;)
&lt;font color=&quot;#0000ff&quot;&gt;# Задаем интервалы значений по осям X, Y&lt;/font&gt;
plt.axis((-0.03, 2.03, -0.03, 14.0))

&lt;font color=&quot;#0000ff&quot;&gt;# Сохраняем диаграмму в файл&lt;/font&gt;
plt.savefig(&#39;&lt;font color=&quot;#ff00ff&quot;&gt;markevery.png&lt;/font&gt;&#39;, format = &#39;&lt;font color=&quot;#ff00ff&quot;&gt;png&lt;/font&gt;&#39;)
&lt;/pre&gt;

&lt;p&gt;А вот результат прогона кода:&lt;/p&gt;

&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5AOqR-ji75P0DwyMCph-yNDKrUz3ehqHN8TZLLKDe7gEihG-qDJXu05rHDRitSQI2D92aKU16d4ADAm51UexsIq8BI9jS7nMNxjnFBY4zYr74pfD96MWqQTkyG2Xj3YpjQYRMyVCvAr4/&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5AOqR-ji75P0DwyMCph-yNDKrUz3ehqHN8TZLLKDe7gEihG-qDJXu05rHDRitSQI2D92aKU16d4ADAm51UexsIq8BI9jS7nMNxjnFBY4zYr74pfD96MWqQTkyG2Xj3YpjQYRMyVCvAr4/s400/markevery.png&quot; border=&quot;0&quot; alt=&quot;Пакет matplotlib. Пример использования свойства markevery&quot;/&gt;&lt;/a&gt;

&lt;a name=&quot;zorder&quot;&gt;&lt;/a&gt;&lt;h4&gt;Свойство zorder&lt;/h4&gt;

&lt;p&gt;Чем больше значение свойства &lt;span class=&quot;code&quot;&gt;zorder&lt;/span&gt; тем ближе к наблюдателю объект:&lt;/p&gt;

&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigiNVhthkpSDuCDCIbi930GrKO6pWIvNDvElE3MVJ6ReuciOqoMXC5Q_Y_vRAMMrQE0su0Cg4891M3PMkQ8zCGuhto0beutzxUK18TmOe-FlR9N4Yk06pjPsMz38nbRENyxPFX8-xuinM/&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEigiNVhthkpSDuCDCIbi930GrKO6pWIvNDvElE3MVJ6ReuciOqoMXC5Q_Y_vRAMMrQE0su0Cg4891M3PMkQ8zCGuhto0beutzxUK18TmOe-FlR9N4Yk06pjPsMz38nbRENyxPFX8-xuinM/s400/circle.png&quot; border=&quot;0&quot; alt=&quot;Пакет matplotlib. Пример использования свойства zorder&quot;/&gt;&lt;/a&gt;

&lt;a name=&quot;alpha&quot;&gt;&lt;/a&gt;&lt;h4&gt;Свойство alpha&lt;/h4&gt;

&lt;p&gt;Для иллюстрации &quot;прозрачности&quot; воспользуемся предыдущим рисунком. Получилось коряво, но смысл свойства &lt;span class=&quot;code&quot;&gt;alpha&lt;/span&gt; понять можно (в &lt;strong&gt;matplotlib&lt;/strong&gt; атрибут прозрачности жутко портит некоторые цвета)&lt;/p&gt;

 &lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgK80HOi82xzWmhZD2qdmHur2t4ggy0CvzRIU26mGH9vI7oLeW6-v3IA-U5TjP2bSo_xCsFgfaotf-TTYTpL-iQqznNvDh2b_W4bbrlIdWC7ywhbCwcML0_OkXlkhQk2LIsuWFfmc1Jyd8/&quot;&gt;&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgK80HOi82xzWmhZD2qdmHur2t4ggy0CvzRIU26mGH9vI7oLeW6-v3IA-U5TjP2bSo_xCsFgfaotf-TTYTpL-iQqznNvDh2b_W4bbrlIdWC7ywhbCwcML0_OkXlkhQk2LIsuWFfmc1Jyd8/s400/alpha.png&quot; border=&quot;0&quot; alt=&quot;Пакет matplotlib. Пример использования свойства alpha&quot;/&gt;&lt;/a&gt;

&lt;p&gt;Ну вот пожалуй на сегодня и все...&lt;/p&gt;

&lt;p&gt;Предыдущий пост по теме: &lt;a href=&quot;http://pyviy.blogspot.com/2009/08/matplotlib_21.html&quot;&gt;Пакет matplotlib. График с дополнительной осью ординат&lt;/a&gt;.&lt;/p&gt;

&lt;/span&gt;</description><link>http://pyviy.blogspot.com/2009/09/matplotlib.html</link><author>noreply@blogger.com (Вий)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh5O7YvxYaEHCyLCuHP1r5Wh-88Wj-2Llwr_Ku0pnrTXzvtOHM53s0uWPs0PCUu5ExGhgl5kfnsSaWEYe6fuMHqxB-vO5xuUugIPD3MJloRsOWe2xhF-GwLvTCmmh8hGakgVSm3xW6ZlUo/s72-c/setp_example.png" height="72" width="72"/><thr:total>7</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-920988537392180762.post-3059752249298123160</guid><pubDate>Tue, 15 Sep 2009 12:07:00 +0000</pubDate><atom:updated>2009-09-15T18:15:15.635+06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">blogger</category><title>Подсветка синтаксиса в блоге. Используем онлайновые маркеры синтаксиса</title><description>&lt;p&gt;О том, как вставить в блог фрагмент кода с подсвеченным синтаксисом, &lt;a href=&quot;http://pyviy.blogspot.com/2009/08/blog-post_18.html&quot; title=&quot;Как вставить в блог фрагмент кода с подсветкой синтаксиса&quot;&gt;используя редактор Vim&lt;/a&gt;, я уже писал. А недавно мне подсказали еще более простое решение, не требующее для своей реализации ни чего кроме браузера - в сети имеются специальные (абсолютно бесплатные) сервисы, позволяющие разукрашивать, перед публикацией, практически любой код. Принцип работы с клиентом у таких сервисов-маркеров общий: пользователь вводит в форму фрагмент кода, выбирает из выпадающего списка тип оформляемого кода, включает (если нужно) пару дополнительных опций и, нажав соответствующую кнопку, отправляет запрос сервису. Сервис возвращает подсвеченный код в виде блока тегов html, который можно скопировать и вставить в свою страницу. Список поддерживаемых языков кода у сервисов весьма обширный, разукрасить можно практически все что угодно.&lt;/p&gt;

&lt;p&gt;Вот два таких онлайновых маркера.&lt;/p&gt;

&lt;span class=&quot;fullpost&quot;&gt;

&lt;h3&gt;Online syntax highlighting&lt;/h3&gt;

&lt;p&gt;&lt;a href=&quot;http://www.tohtml.com/&quot; title=&quot;Online syntax highlighting&quot;&gt;Online syntax highlighting&lt;/a&gt;, способен автоматически угадывать тип введенного кода, позволяет выбрать несколько стилей оформления. Вставляем код в редактор &lt;span class=&quot;item&quot;&gt;Source code&lt;/span&gt;, выбираем язык программирования в списке &lt;span class=&quot;item&quot;&gt;Type&lt;/span&gt;, стиль оформления в списке &lt;span class=&quot;item&quot;&gt;Style&lt;/span&gt;, жмем кнопку &lt;span class=&quot;item&quot;&gt;Highlight&lt;/span&gt;, в появившемся редакторе выделяем и копируем блок html тегов.&lt;/p&gt;

&lt;p&gt;Примеры подсвеченного кода при различных стилях оформления:&lt;/p&gt;

&lt;p&gt;Стиль: &lt;span class=&quot;item&quot;&gt;white&lt;/span&gt;&lt;/p&gt;

&lt;pre style=&#39;color:#000000;background:#ffffff;border : 2px solid #c1b496;padding : 20px; overflow : auto;&#39;&gt;&lt;span style=&#39;color:#696969; &#39;&gt;# -*- coding: UTF-8 -*-&lt;/span&gt;

&lt;span style=&#39;color:#800000; font-weight:bold; &#39;&gt;import&lt;/span&gt; matplotlib&lt;span style=&#39;color:#808030; &#39;&gt;.&lt;/span&gt;pyplot as plt

&lt;span style=&#39;color:#696969; &#39;&gt;# Значения по оси X&lt;/span&gt;
X &lt;span style=&#39;color:#808030; &#39;&gt;=&lt;/span&gt; &lt;span style=&#39;color:#808030; &#39;&gt;[&lt;/span&gt;&lt;span style=&#39;color:#008000; &#39;&gt;20.0&lt;/span&gt;&lt;span style=&#39;color:#808030; &#39;&gt;,&lt;/span&gt; &lt;span style=&#39;color:#008000; &#39;&gt;40.0&lt;/span&gt;&lt;span style=&#39;color:#808030; &#39;&gt;,&lt;/span&gt; &lt;span style=&#39;color:#008000; &#39;&gt;60.0&lt;/span&gt;&lt;span style=&#39;color:#808030; &#39;&gt;,&lt;/span&gt; &lt;span style=&#39;color:#008000; &#39;&gt;80.0&lt;/span&gt;&lt;span style=&#39;color:#808030; &#39;&gt;,&lt;/span&gt; &lt;span style=&#39;color:#008000; &#39;&gt;100.0&lt;/span&gt;&lt;span style=&#39;color:#808030; &#39;&gt;]&lt;/span&gt;
&lt;span style=&#39;color:#696969; &#39;&gt;# Набор значений по оси Y&lt;/span&gt;
Y_10 &lt;span style=&#39;color:#808030; &#39;&gt;=&lt;/span&gt; &lt;span style=&#39;color:#808030; &#39;&gt;[&lt;/span&gt;&lt;span style=&#39;color:#008000; &#39;&gt;0.97252&lt;/span&gt;&lt;span style=&#39;color:#808030; &#39;&gt;,&lt;/span&gt; &lt;span style=&#39;color:#008000; &#39;&gt;0.94238&lt;/span&gt;&lt;span style=&#39;color:#808030; &#39;&gt;,&lt;/span&gt; &lt;span style=&#39;color:#008000; &#39;&gt;0.89927&lt;/span&gt;&lt;span style=&#39;color:#808030; &#39;&gt;,&lt;/span&gt; &lt;span style=&#39;color:#008000; &#39;&gt;0.85197&lt;/span&gt;&lt;span style=&#39;color:#808030; &#39;&gt;,&lt;/span&gt; &lt;span style=&#39;color:#008000; &#39;&gt;0.79784&lt;/span&gt;&lt;span style=&#39;color:#808030; &#39;&gt;]&lt;/span&gt;
Y_20 &lt;span style=&#39;color:#808030; &#39;&gt;=&lt;/span&gt; &lt;span style=&#39;color:#808030; &#39;&gt;[&lt;/span&gt;&lt;span style=&#39;color:#008000; &#39;&gt;0.96864&lt;/span&gt;&lt;span style=&#39;color:#808030; &#39;&gt;,&lt;/span&gt; &lt;span style=&#39;color:#008000; &#39;&gt;0.93518&lt;/span&gt;&lt;span style=&#39;color:#808030; &#39;&gt;,&lt;/span&gt; &lt;span style=&#39;color:#008000; &#39;&gt;0.89113&lt;/span&gt;&lt;span style=&#39;color:#808030; &#39;&gt;,&lt;/span&gt; &lt;span style=&#39;color:#008000; &#39;&gt;0.84344&lt;/span&gt;&lt;span style=&#39;color:#808030; &#39;&gt;,&lt;/span&gt; &lt;span style=&#39;color:#008000; &#39;&gt;0.78934&lt;/span&gt;&lt;span style=&#39;color:#808030; &#39;&gt;]&lt;/span&gt;
Y_30 &lt;span style=&#39;color:#808030; &#39;&gt;=&lt;/span&gt; &lt;span style=&#39;color:#808030; &#39;&gt;[&lt;/span&gt;&lt;span style=&#39;color:#008000; &#39;&gt;0.96395&lt;/span&gt;&lt;span style=&#39;color:#808030; &#39;&gt;,&lt;/span&gt; &lt;span style=&#39;color:#008000; &#39;&gt;0.92770&lt;/span&gt;&lt;span style=&#39;color:#808030; &#39;&gt;,&lt;/span&gt; &lt;span style=&#39;color:#008000; &#39;&gt;0.88278&lt;/span&gt;&lt;span style=&#39;color:#808030; &#39;&gt;,&lt;/span&gt; &lt;span style=&#39;color:#008000; &#39;&gt;0.83473&lt;/span&gt;&lt;span style=&#39;color:#808030; &#39;&gt;,&lt;/span&gt; &lt;span style=&#39;color:#008000; &#39;&gt;0.78075&lt;/span&gt;&lt;span style=&#39;color:#808030; &#39;&gt;]&lt;/span&gt;

&lt;span style=&#39;color:#696969; &#39;&gt;# Строим диаграмму&lt;/span&gt;
plt&lt;span style=&#39;color:#808030; &#39;&gt;.&lt;/span&gt;plot&lt;span style=&#39;color:#808030; &#39;&gt;(&lt;/span&gt;X&lt;span style=&#39;color:#808030; &#39;&gt;,&lt;/span&gt; Y_10&lt;span style=&#39;color:#808030; &#39;&gt;,&lt;/span&gt; &lt;span style=&#39;color:#0000e6; &#39;&gt;&#39;bD:&#39;&lt;/span&gt;&lt;span style=&#39;color:#808030; &#39;&gt;,&lt;/span&gt;  label &lt;span style=&#39;color:#808030; &#39;&gt;=&lt;/span&gt; &lt;span style=&#39;color:#0000e6; &#39;&gt;u&#39;Температура 10 \u00b0C&#39;&lt;/span&gt;&lt;span style=&#39;color:#808030; &#39;&gt;)&lt;/span&gt;
plt&lt;span style=&#39;color:#808030; &#39;&gt;.&lt;/span&gt;plot&lt;span style=&#39;color:#808030; &#39;&gt;(&lt;/span&gt;X&lt;span style=&#39;color:#808030; &#39;&gt;,&lt;/span&gt; Y_20&lt;span style=&#39;color:#808030; &#39;&gt;,&lt;/span&gt; &lt;span style=&#39;color:#0000e6; &#39;&gt;&#39;r^:&#39;&lt;/span&gt;&lt;span style=&#39;color:#808030; &#39;&gt;,&lt;/span&gt;  label &lt;span style=&#39;color:#808030; &#39;&gt;=&lt;/span&gt; &lt;span style=&#39;color:#0000e6; &#39;&gt;u&#39;Температура 20 \u00b0C&#39;&lt;/span&gt;&lt;span style=&#39;color:#808030; &#39;&gt;)&lt;/span&gt;
plt&lt;span style=&#39;color:#808030; &#39;&gt;.&lt;/span&gt;plot&lt;span style=&#39;color:#808030; &#39;&gt;(&lt;/span&gt;X&lt;span style=&#39;color:#808030; &#39;&gt;,&lt;/span&gt; Y_30&lt;span style=&#39;color:#808030; &#39;&gt;,&lt;/span&gt; &lt;span style=&#39;color:#0000e6; &#39;&gt;&#39;go:&#39;&lt;/span&gt;&lt;span style=&#39;color:#808030; &#39;&gt;,&lt;/span&gt;  label &lt;span style=&#39;color:#808030; &#39;&gt;=&lt;/span&gt; &lt;span style=&#39;color:#0000e6; &#39;&gt;u&#39;Температура 30 \u00b0C&#39;&lt;/span&gt;&lt;span style=&#39;color:#808030; &#39;&gt;)&lt;/span&gt;
&lt;span style=&#39;color:#696969; &#39;&gt;# Задаем подписи&lt;/span&gt;
plt&lt;span style=&#39;color:#808030; &#39;&gt;.&lt;/span&gt;title&lt;span style=&#39;color:#808030; &#39;&gt;(&lt;/span&gt;&lt;span style=&#39;color:#0000e6; &#39;&gt;u&#39;Зависимость плотности водных растворов этилового спирта от температуры&#39;&lt;/span&gt;&lt;span style=&#39;color:#808030; &#39;&gt;)&lt;/span&gt;
plt&lt;span style=&#39;color:#808030; &#39;&gt;.&lt;/span&gt;xlabel&lt;span style=&#39;color:#808030; &#39;&gt;(&lt;/span&gt;&lt;span style=&#39;color:#0000e6; &#39;&gt;u&#39;Массовая доля этилового спирта, %&#39;&lt;/span&gt;&lt;span style=&#39;color:#808030; &#39;&gt;)&lt;/span&gt;
plt&lt;span style=&#39;color:#808030; &#39;&gt;.&lt;/span&gt;ylabel&lt;span style=&#39;color:#808030; &#39;&gt;(&lt;/span&gt;&lt;span style=&#39;color:#0000e6; &#39;&gt;u&#39;Плотность, г/мл&#39;&lt;/span&gt;&lt;span style=&#39;color:#808030; &#39;&gt;)&lt;/span&gt;
&lt;span style=&#39;color:#696969; &#39;&gt;# Включаем легенду&lt;/span&gt;
plt&lt;span style=&#39;color:#808030; &#39;&gt;.&lt;/span&gt;legend&lt;span style=&#39;color:#808030; &#39;&gt;(&lt;/span&gt;loc &lt;span style=&#39;color:#808030; &#39;&gt;=&lt;/span&gt; &lt;span style=&#39;color:#0000e6; &#39;&gt;&#39;best&#39;&lt;/span&gt;&lt;span style=&#39;color:#808030; &#39;&gt;)&lt;/span&gt;
&lt;span style=&#39;color:#696969; &#39;&gt;# Сохраняем построенную диаграмму в файл&lt;/span&gt;
plt&lt;span style=&#39;color:#808030; &#39;&gt;.&lt;/span&gt;savefig&lt;span style=&#39;color:#808030; &#39;&gt;(&lt;/span&gt;&lt;span style=&#39;color:#0000e6; &#39;&gt;&#39;spirit.png&#39;&lt;/span&gt;&lt;span style=&#39;color:#808030; &#39;&gt;,&lt;/span&gt; format &lt;span style=&#39;color:#808030; &#39;&gt;=&lt;/span&gt; &lt;span style=&#39;color:#0000e6; &#39;&gt;&#39;png&#39;&lt;/span&gt;&lt;span style=&#39;color:#808030; &#39;&gt;)&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;Стиль: &lt;span class=&quot;item&quot;&gt;navy&lt;/span&gt;&lt;/p&gt;

&lt;pre style=&#39;color:#000020;background:#f6f8ff;border : 2px solid #c1b496;padding : 20px; overflow : auto;&#39;&gt;&lt;span style=&#39;color:#595979; &#39;&gt;# -*- coding: UTF-8 -*-&lt;/span&gt;

&lt;span style=&#39;color:#200080; font-weight:bold; &#39;&gt;import&lt;/span&gt; matplotlib&lt;span style=&#39;color:#308080; &#39;&gt;.&lt;/span&gt;pyplot as plt

&lt;span style=&#39;color:#595979; &#39;&gt;# Значения по оси X&lt;/span&gt;
X &lt;span style=&#39;color:#308080; &#39;&gt;=&lt;/span&gt; &lt;span style=&#39;color:#308080; &#39;&gt;[&lt;/span&gt;&lt;span style=&#39;color:#008000; &#39;&gt;20.0&lt;/span&gt;&lt;span style=&#39;color:#308080; &#39;&gt;,&lt;/span&gt; &lt;span style=&#39;color:#008000; &#39;&gt;40.0&lt;/span&gt;&lt;span style=&#39;color:#308080; &#39;&gt;,&lt;/span&gt; &lt;span style=&#39;color:#008000; &#39;&gt;60.0&lt;/span&gt;&lt;span style=&#39;color:#308080; &#39;&gt;,&lt;/span&gt; &lt;span style=&#39;color:#008000; &#39;&gt;80.0&lt;/span&gt;&lt;span style=&#39;color:#308080; &#39;&gt;,&lt;/span&gt; &lt;span style=&#39;color:#008000; &#39;&gt;100.0&lt;/span&gt;&lt;span style=&#39;color:#308080; &#39;&gt;]&lt;/span&gt;
&lt;span style=&#39;color:#595979; &#39;&gt;# Набор значений по оси Y&lt;/span&gt;
Y_10 &lt;span style=&#39;color:#308080; &#39;&gt;=&lt;/span&gt; &lt;span style=&#39;color:#308080; &#39;&gt;[&lt;/span&gt;&lt;span style=&#39;color:#008000; &#39;&gt;0.97252&lt;/span&gt;&lt;span style=&#39;color:#308080; &#39;&gt;,&lt;/span&gt; &lt;span style=&#39;color:#008000; &#39;&gt;0.94238&lt;/span&gt;&lt;span style=&#39;color:#308080; &#39;&gt;,&lt;/span&gt; &lt;span style=&#39;color:#008000; &#39;&gt;0.89927&lt;/span&gt;&lt;span style=&#39;color:#308080; &#39;&gt;,&lt;/span&gt; &lt;span style=&#39;color:#008000; &#39;&gt;0.85197&lt;/span&gt;&lt;span style=&#39;color:#308080; &#39;&gt;,&lt;/span&gt; &lt;span style=&#39;color:#008000; &#39;&gt;0.79784&lt;/span&gt;&lt;span style=&#39;color:#308080; &#39;&gt;]&lt;/span&gt;
Y_20 &lt;span style=&#39;color:#308080; &#39;&gt;=&lt;/span&gt; &lt;span style=&#39;color:#308080; &#39;&gt;[&lt;/span&gt;&lt;span style=&#39;color:#008000; &#39;&gt;0.96864&lt;/span&gt;&lt;span style=&#39;color:#308080; &#39;&gt;,&lt;/span&gt; &lt;span style=&#39;color:#008000; &#39;&gt;0.93518&lt;/span&gt;&lt;span style=&#39;color:#308080; &#39;&gt;,&lt;/span&gt; &lt;span style=&#39;color:#008000; &#39;&gt;0.89113&lt;/span&gt;&lt;span style=&#39;color:#308080; &#39;&gt;,&lt;/span&gt; &lt;span style=&#39;color:#008000; &#39;&gt;0.84344&lt;/span&gt;&lt;span style=&#39;color:#308080; &#39;&gt;,&lt;/span&gt; &lt;span style=&#39;color:#008000; &#39;&gt;0.78934&lt;/span&gt;&lt;span style=&#39;color:#308080; &#39;&gt;]&lt;/span&gt;
Y_30 &lt;span style=&#39;color:#308080; &#39;&gt;=&lt;/span&gt; &lt;span style=&#39;color:#308080; &#39;&gt;[&lt;/span&gt;&lt;span style=&#39;color:#008000; &#39;&gt;0.96395&lt;/span&gt;&lt;span style=&#39;color:#308080; &#39;&gt;,&lt;/span&gt; &lt;span style=&#39;color:#008000; &#39;&gt;0.92770&lt;/span&gt;&lt;span style=&#39;color:#308080; &#39;&gt;,&lt;/span&gt; &lt;span style=&#39;color:#008000; &#39;&gt;0.88278&lt;/span&gt;&lt;span style=&#39;color:#308080; &#39;&gt;,&lt;/span&gt; &lt;span style=&#39;color:#008000; &#39;&gt;0.83473&lt;/span&gt;&lt;span style=&#39;color:#308080; &#39;&gt;,&lt;/span&gt; &lt;span style=&#39;color:#008000; &#39;&gt;0.78075&lt;/span&gt;&lt;span style=&#39;color:#308080; &#39;&gt;]&lt;/span&gt;

&lt;span style=&#39;color:#595979; &#39;&gt;# Строим диаграмму&lt;/span&gt;
plt&lt;span style=&#39;color:#308080; &#39;&gt;.&lt;/span&gt;plot&lt;span style=&#39;color:#308080; &#39;&gt;(&lt;/span&gt;X&lt;span style=&#39;color:#308080; &#39;&gt;,&lt;/span&gt; Y_10&lt;span style=&#39;color:#308080; &#39;&gt;,&lt;/span&gt; &lt;span style=&#39;color:#1060b6; &#39;&gt;&#39;bD:&#39;&lt;/span&gt;&lt;span style=&#39;color:#308080; &#39;&gt;,&lt;/span&gt;  label &lt;span style=&#39;color:#308080; &#39;&gt;=&lt;/span&gt; &lt;span style=&#39;color:#1060b6; &#39;&gt;u&#39;Температура 10 \u00b0C&#39;&lt;/span&gt;&lt;span style=&#39;color:#308080; &#39;&gt;)&lt;/span&gt;
plt&lt;span style=&#39;color:#308080; &#39;&gt;.&lt;/span&gt;plot&lt;span style=&#39;color:#308080; &#39;&gt;(&lt;/span&gt;X&lt;span style=&#39;color:#308080; &#39;&gt;,&lt;/span&gt; Y_20&lt;span style=&#39;color:#308080; &#39;&gt;,&lt;/span&gt; &lt;span style=&#39;color:#1060b6; &#39;&gt;&#39;r^:&#39;&lt;/span&gt;&lt;span style=&#39;color:#308080; &#39;&gt;,&lt;/span&gt;  label &lt;span style=&#39;color:#308080; &#39;&gt;=&lt;/span&gt; &lt;span style=&#39;color:#1060b6; &#39;&gt;u&#39;Температура 20 \u00b0C&#39;&lt;/span&gt;&lt;span style=&#39;color:#308080; &#39;&gt;)&lt;/span&gt;
plt&lt;span style=&#39;color:#308080; &#39;&gt;.&lt;/span&gt;plot&lt;span style=&#39;color:#308080; &#39;&gt;(&lt;/span&gt;X&lt;span style=&#39;color:#308080; &#39;&gt;,&lt;/span&gt; Y_30&lt;span style=&#39;color:#308080; &#39;&gt;,&lt;/span&gt; &lt;span style=&#39;color:#1060b6; &#39;&gt;&#39;go:&#39;&lt;/span&gt;&lt;span style=&#39;color:#308080; &#39;&gt;,&lt;/span&gt;  label &lt;span style=&#39;color:#308080; &#39;&gt;=&lt;/span&gt; &lt;span style=&#39;color:#1060b6; &#39;&gt;u&#39;Температура 30 \u00b0C&#39;&lt;/span&gt;&lt;span style=&#39;color:#308080; &#39;&gt;)&lt;/span&gt;
&lt;span style=&#39;color:#595979; &#39;&gt;# Задаем подписи&lt;/span&gt;
plt&lt;span style=&#39;color:#308080; &#39;&gt;.&lt;/span&gt;title&lt;span style=&#39;color:#308080; &#39;&gt;(&lt;/span&gt;&lt;span style=&#39;color:#1060b6; &#39;&gt;u&#39;Зависимость плотности водных растворов этилового спирта от температуры&#39;&lt;/span&gt;&lt;span style=&#39;color:#308080; &#39;&gt;)&lt;/span&gt;
plt&lt;span style=&#39;color:#308080; &#39;&gt;.&lt;/span&gt;xlabel&lt;span style=&#39;color:#308080; &#39;&gt;(&lt;/span&gt;&lt;span style=&#39;color:#1060b6; &#39;&gt;u&#39;Массовая доля этилового спирта, %&#39;&lt;/span&gt;&lt;span style=&#39;color:#308080; &#39;&gt;)&lt;/span&gt;
plt&lt;span style=&#39;color:#308080; &#39;&gt;.&lt;/span&gt;ylabel&lt;span style=&#39;color:#308080; &#39;&gt;(&lt;/span&gt;&lt;span style=&#39;color:#1060b6; &#39;&gt;u&#39;Плотность, г/мл&#39;&lt;/span&gt;&lt;span style=&#39;color:#308080; &#39;&gt;)&lt;/span&gt;
&lt;span style=&#39;color:#595979; &#39;&gt;# Включаем легенду&lt;/span&gt;
plt&lt;span style=&#39;color:#308080; &#39;&gt;.&lt;/span&gt;legend&lt;span style=&#39;color:#308080; &#39;&gt;(&lt;/span&gt;loc &lt;span style=&#39;color:#308080; &#39;&gt;=&lt;/span&gt; &lt;span style=&#39;color:#1060b6; &#39;&gt;&#39;best&#39;&lt;/span&gt;&lt;span style=&#39;color:#308080; &#39;&gt;)&lt;/span&gt;
&lt;span style=&#39;color:#595979; &#39;&gt;# Сохраняем построенную диаграмму в файл&lt;/span&gt;
plt&lt;span style=&#39;color:#308080; &#39;&gt;.&lt;/span&gt;savefig&lt;span style=&#39;color:#308080; &#39;&gt;(&lt;/span&gt;&lt;span style=&#39;color:#1060b6; &#39;&gt;&#39;spirit.png&#39;&lt;/span&gt;&lt;span style=&#39;color:#308080; &#39;&gt;,&lt;/span&gt; format &lt;span style=&#39;color:#308080; &#39;&gt;=&lt;/span&gt; &lt;span style=&#39;color:#1060b6; &#39;&gt;&#39;png&#39;&lt;/span&gt;&lt;span style=&#39;color:#308080; &#39;&gt;)&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;Стиль: &lt;span class=&quot;item&quot;&gt;Bred3&lt;/span&gt;&lt;/p&gt;

&lt;pre style=&#39;color:#000000;background:#f1f0f0;border : 2px solid #c1b496;padding : 20px; overflow : auto;&#39;&gt;&lt;span style=&#39;color:#c34e00; &#39;&gt;# -*- coding: UTF-8 -*-&lt;/span&gt;

&lt;span style=&#39;color:#400000; font-weight:bold; &#39;&gt;import&lt;/span&gt; matplotlib&lt;span style=&#39;color:#806030; &#39;&gt;.&lt;/span&gt;pyplot as plt

&lt;span style=&#39;color:#c34e00; &#39;&gt;# Значения по оси X&lt;/span&gt;
X &lt;span style=&#39;color:#806030; &#39;&gt;=&lt;/span&gt; &lt;span style=&#39;color:#806030; &#39;&gt;[&lt;/span&gt;&lt;span style=&#39;color:#800000; &#39;&gt;20.0&lt;/span&gt;&lt;span style=&#39;color:#806030; &#39;&gt;,&lt;/span&gt; &lt;span style=&#39;color:#800000; &#39;&gt;40.0&lt;/span&gt;&lt;span style=&#39;color:#806030; &#39;&gt;,&lt;/span&gt; &lt;span style=&#39;color:#800000; &#39;&gt;60.0&lt;/span&gt;&lt;span style=&#39;color:#806030; &#39;&gt;,&lt;/span&gt; &lt;span style=&#39;color:#800000; &#39;&gt;80.0&lt;/span&gt;&lt;span style=&#39;color:#806030; &#39;&gt;,&lt;/span&gt; &lt;span style=&#39;color:#800000; &#39;&gt;100.0&lt;/span&gt;&lt;span style=&#39;color:#806030; &#39;&gt;]&lt;/span&gt;
&lt;span style=&#39;color:#c34e00; &#39;&gt;# Набор значений по оси Y&lt;/span&gt;
Y_10 &lt;span style=&#39;color:#806030; &#39;&gt;=&lt;/span&gt; &lt;span style=&#39;color:#806030; &#39;&gt;[&lt;/span&gt;&lt;span style=&#39;color:#800000; &#39;&gt;0.97252&lt;/span&gt;&lt;span style=&#39;color:#806030; &#39;&gt;,&lt;/span&gt; &lt;span style=&#39;color:#800000; &#39;&gt;0.94238&lt;/span&gt;&lt;span style=&#39;color:#806030; &#39;&gt;,&lt;/span&gt; &lt;span style=&#39;color:#800000; &#39;&gt;0.89927&lt;/span&gt;&lt;span style=&#39;color:#806030; &#39;&gt;,&lt;/span&gt; &lt;span style=&#39;color:#800000; &#39;&gt;0.85197&lt;/span&gt;&lt;span style=&#39;color:#806030; &#39;&gt;,&lt;/span&gt; &lt;span style=&#39;color:#800000; &#39;&gt;0.79784&lt;/span&gt;&lt;span style=&#39;color:#806030; &#39;&gt;]&lt;/span&gt;
Y_20 &lt;span style=&#39;color:#806030; &#39;&gt;=&lt;/span&gt; &lt;span style=&#39;color:#806030; &#39;&gt;[&lt;/span&gt;&lt;span style=&#39;color:#800000; &#39;&gt;0.96864&lt;/span&gt;&lt;span style=&#39;color:#806030; &#39;&gt;,&lt;/span&gt; &lt;span style=&#39;color:#800000; &#39;&gt;0.93518&lt;/span&gt;&lt;span style=&#39;color:#806030; &#39;&gt;,&lt;/span&gt; &lt;span style=&#39;color:#800000; &#39;&gt;0.89113&lt;/span&gt;&lt;span style=&#39;color:#806030; &#39;&gt;,&lt;/span&gt; &lt;span style=&#39;color:#800000; &#39;&gt;0.84344&lt;/span&gt;&lt;span style=&#39;color:#806030; &#39;&gt;,&lt;/span&gt; &lt;span style=&#39;color:#800000; &#39;&gt;0.78934&lt;/span&gt;&lt;span style=&#39;color:#806030; &#39;&gt;]&lt;/span&gt;
Y_30 &lt;span style=&#39;color:#806030; &#39;&gt;=&lt;/span&gt; &lt;span style=&#39;color:#806030; &#39;&gt;[&lt;/span&gt;&lt;span style=&#39;color:#800000; &#39;&gt;0.96395&lt;/span&gt;&lt;span style=&#39;color:#806030; &#39;&gt;,&lt;/span&gt; &lt;span style=&#39;color:#800000; &#39;&gt;0.92770&lt;/span&gt;&lt;span style=&#39;color:#806030; &#39;&gt;,&lt;/span&gt; &lt;span style=&#39;color:#800000; &#39;&gt;0.88278&lt;/span&gt;&lt;span style=&#39;color:#806030; &#39;&gt;,&lt;/span&gt; &lt;span style=&#39;color:#800000; &#39;&gt;0.83473&lt;/span&gt;&lt;span style=&#39;color:#806030; &#39;&gt;,&lt;/span&gt; &lt;span style=&#39;color:#800000; &#39;&gt;0.78075&lt;/span&gt;&lt;span style=&#39;color:#806030; &#39;&gt;]&lt;/span&gt;

&lt;span style=&#39;color:#c34e00; &#39;&gt;# Строим диаграмму&lt;/span&gt;
plt&lt;span style=&#39;color:#806030; &#39;&gt;.&lt;/span&gt;plot&lt;span style=&#39;color:#806030; &#39;&gt;(&lt;/span&gt;X&lt;span style=&#39;color:#806030; &#39;&gt;,&lt;/span&gt; Y_10&lt;span style=&#39;color:#806030; &#39;&gt;,&lt;/span&gt; &lt;span style=&#39;color:#e60000; &#39;&gt;&#39;bD:&#39;&lt;/span&gt;&lt;span style=&#39;color:#806030; &#39;&gt;,&lt;/span&gt;  label &lt;span style=&#39;color:#806030; &#39;&gt;=&lt;/span&gt; &lt;span style=&#39;color:#e60000; &#39;&gt;u&#39;Температура 10 \u00b0C&#39;&lt;/span&gt;&lt;span style=&#39;color:#806030; &#39;&gt;)&lt;/span&gt;
plt&lt;span style=&#39;color:#806030; &#39;&gt;.&lt;/span&gt;plot&lt;span style=&#39;color:#806030; &#39;&gt;(&lt;/span&gt;X&lt;span style=&#39;color:#806030; &#39;&gt;,&lt;/span&gt; Y_20&lt;span style=&#39;color:#806030; &#39;&gt;,&lt;/span&gt; &lt;span style=&#39;color:#e60000; &#39;&gt;&#39;r^:&#39;&lt;/span&gt;&lt;span style=&#39;color:#806030; &#39;&gt;,&lt;/span&gt;  label &lt;span style=&#39;color:#806030; &#39;&gt;=&lt;/span&gt; &lt;span style=&#39;color:#e60000; &#39;&gt;u&#39;Температура 20 \u00b0C&#39;&lt;/span&gt;&lt;span style=&#39;color:#806030; &#39;&gt;)&lt;/span&gt;
plt&lt;span style=&#39;color:#806030; &#39;&gt;.&lt;/span&gt;plot&lt;span style=&#39;color:#806030; &#39;&gt;(&lt;/span&gt;X&lt;span style=&#39;color:#806030; &#39;&gt;,&lt;/span&gt; Y_30&lt;span style=&#39;color:#806030; &#39;&gt;,&lt;/span&gt; &lt;span style=&#39;color:#e60000; &#39;&gt;&#39;go:&#39;&lt;/span&gt;&lt;span style=&#39;color:#806030; &#39;&gt;,&lt;/span&gt;  label &lt;span style=&#39;color:#806030; &#39;&gt;=&lt;/span&gt; &lt;span style=&#39;color:#e60000; &#39;&gt;u&#39;Температура 30 \u00b0C&#39;&lt;/span&gt;&lt;span style=&#39;color:#806030; &#39;&gt;)&lt;/span&gt;
&lt;span style=&#39;color:#c34e00; &#39;&gt;# Задаем подписи&lt;/span&gt;
plt&lt;span style=&#39;color:#806030; &#39;&gt;.&lt;/span&gt;title&lt;span style=&#39;color:#806030; &#39;&gt;(&lt;/span&gt;&lt;span style=&#39;color:#e60000; &#39;&gt;u&#39;Зависимость плотности водных растворов этилового спирта от температуры&#39;&lt;/span&gt;&lt;span style=&#39;color:#806030; &#39;&gt;)&lt;/span&gt;
plt&lt;span style=&#39;color:#806030; &#39;&gt;.&lt;/span&gt;xlabel&lt;span style=&#39;color:#806030; &#39;&gt;(&lt;/span&gt;&lt;span style=&#39;color:#e60000; &#39;&gt;u&#39;Массовая доля этилового спирта, %&#39;&lt;/span&gt;&lt;span style=&#39;color:#806030; &#39;&gt;)&lt;/span&gt;
plt&lt;span style=&#39;color:#806030; &#39;&gt;.&lt;/span&gt;ylabel&lt;span style=&#39;color:#806030; &#39;&gt;(&lt;/span&gt;&lt;span style=&#39;color:#e60000; &#39;&gt;u&#39;Плотность, г/мл&#39;&lt;/span&gt;&lt;span style=&#39;color:#806030; &#39;&gt;)&lt;/span&gt;
&lt;span style=&#39;color:#c34e00; &#39;&gt;# Включаем легенду&lt;/span&gt;
plt&lt;span style=&#39;color:#806030; &#39;&gt;.&lt;/span&gt;legend&lt;span style=&#39;color:#806030; &#39;&gt;(&lt;/span&gt;loc &lt;span style=&#39;color:#806030; &#39;&gt;=&lt;/span&gt; &lt;span style=&#39;color:#e60000; &#39;&gt;&#39;best&#39;&lt;/span&gt;&lt;span style=&#39;color:#806030; &#39;&gt;)&lt;/span&gt;
&lt;span style=&#39;color:#c34e00; &#39;&gt;# Сохраняем построенную диаграмму в файл&lt;/span&gt;
plt&lt;span style=&#39;color:#806030; &#39;&gt;.&lt;/span&gt;savefig&lt;span style=&#39;color:#806030; &#39;&gt;(&lt;/span&gt;&lt;span style=&#39;color:#e60000; &#39;&gt;&#39;spirit.png&#39;&lt;/span&gt;&lt;span style=&#39;color:#806030; &#39;&gt;,&lt;/span&gt; format &lt;span style=&#39;color:#806030; &#39;&gt;=&lt;/span&gt; &lt;span style=&#39;color:#e60000; &#39;&gt;&#39;png&#39;&lt;/span&gt;&lt;span style=&#39;color:#806030; &#39;&gt;)&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;Стиль: &lt;span class=&quot;item&quot;&gt;black&lt;/span&gt;&lt;/p&gt;

&lt;pre style=&#39;color:#d1d1d1;background:#000000;border : 2px solid #c1b496;padding : 20px; overflow : auto;&#39;&gt;&lt;span style=&#39;color:#9999a9; &#39;&gt;# -*- coding: UTF-8 -*-&lt;/span&gt;

&lt;span style=&#39;color:#e66170; font-weight:bold; &#39;&gt;import&lt;/span&gt; matplotlib&lt;span style=&#39;color:#d2cd86; &#39;&gt;.&lt;/span&gt;pyplot as plt

&lt;span style=&#39;color:#9999a9; &#39;&gt;# Значения по оси X&lt;/span&gt;
X &lt;span style=&#39;color:#d2cd86; &#39;&gt;=&lt;/span&gt; &lt;span style=&#39;color:#d2cd86; &#39;&gt;[&lt;/span&gt;&lt;span style=&#39;color:#009f00; &#39;&gt;20.0&lt;/span&gt;&lt;span style=&#39;color:#d2cd86; &#39;&gt;,&lt;/span&gt; &lt;span style=&#39;color:#009f00; &#39;&gt;40.0&lt;/span&gt;&lt;span style=&#39;color:#d2cd86; &#39;&gt;,&lt;/span&gt; &lt;span style=&#39;color:#009f00; &#39;&gt;60.0&lt;/span&gt;&lt;span style=&#39;color:#d2cd86; &#39;&gt;,&lt;/span&gt; &lt;span style=&#39;color:#009f00; &#39;&gt;80.0&lt;/span&gt;&lt;span style=&#39;color:#d2cd86; &#39;&gt;,&lt;/span&gt; &lt;span style=&#39;color:#009f00; &#39;&gt;100.0&lt;/span&gt;&lt;span style=&#39;color:#d2cd86; &#39;&gt;]&lt;/span&gt;
&lt;span style=&#39;color:#9999a9; &#39;&gt;# Набор значений по оси Y&lt;/span&gt;
Y_10 &lt;span style=&#39;color:#d2cd86; &#39;&gt;=&lt;/span&gt; &lt;span style=&#39;color:#d2cd86; &#39;&gt;[&lt;/span&gt;&lt;span style=&#39;color:#009f00; &#39;&gt;0.97252&lt;/span&gt;&lt;span style=&#39;color:#d2cd86; &#39;&gt;,&lt;/span&gt; &lt;span style=&#39;color:#009f00; &#39;&gt;0.94238&lt;/span&gt;&lt;span style=&#39;color:#d2cd86; &#39;&gt;,&lt;/span&gt; &lt;span style=&#39;color:#009f00; &#39;&gt;0.89927&lt;/span&gt;&lt;span style=&#39;color:#d2cd86; &#39;&gt;,&lt;/span&gt; &lt;span style=&#39;color:#009f00; &#39;&gt;0.85197&lt;/span&gt;&lt;span style=&#39;color:#d2cd86; &#39;&gt;,&lt;/span&gt; &lt;span style=&#39;color:#009f00; &#39;&gt;0.79784&lt;/span&gt;&lt;span style=&#39;color:#d2cd86; &#39;&gt;]&lt;/span&gt;
Y_20 &lt;span style=&#39;color:#d2cd86; &#39;&gt;=&lt;/span&gt; &lt;span style=&#39;color:#d2cd86; &#39;&gt;[&lt;/span&gt;&lt;span style=&#39;color:#009f00; &#39;&gt;0.96864&lt;/span&gt;&lt;span style=&#39;color:#d2cd86; &#39;&gt;,&lt;/span&gt; &lt;span style=&#39;color:#009f00; &#39;&gt;0.93518&lt;/span&gt;&lt;span style=&#39;color:#d2cd86; &#39;&gt;,&lt;/span&gt; &lt;span style=&#39;color:#009f00; &#39;&gt;0.89113&lt;/span&gt;&lt;span style=&#39;color:#d2cd86; &#39;&gt;,&lt;/span&gt; &lt;span style=&#39;color:#009f00; &#39;&gt;0.84344&lt;/span&gt;&lt;span style=&#39;color:#d2cd86; &#39;&gt;,&lt;/span&gt; &lt;span style=&#39;color:#009f00; &#39;&gt;0.78934&lt;/span&gt;&lt;span style=&#39;color:#d2cd86; &#39;&gt;]&lt;/span&gt;
Y_30 &lt;span style=&#39;color:#d2cd86; &#39;&gt;=&lt;/span&gt; &lt;span style=&#39;color:#d2cd86; &#39;&gt;[&lt;/span&gt;&lt;span style=&#39;color:#009f00; &#39;&gt;0.96395&lt;/span&gt;&lt;span style=&#39;color:#d2cd86; &#39;&gt;,&lt;/span&gt; &lt;span style=&#39;color:#009f00; &#39;&gt;0.92770&lt;/span&gt;&lt;span style=&#39;color:#d2cd86; &#39;&gt;,&lt;/span&gt; &lt;span style=&#39;color:#009f00; &#39;&gt;0.88278&lt;/span&gt;&lt;span style=&#39;color:#d2cd86; &#39;&gt;,&lt;/span&gt; &lt;span style=&#39;color:#009f00; &#39;&gt;0.83473&lt;/span&gt;&lt;span style=&#39;color:#d2cd86; &#39;&gt;,&lt;/span&gt; &lt;span style=&#39;color:#009f00; &#39;&gt;0.78075&lt;/span&gt;&lt;span style=&#39;color:#d2cd86; &#39;&gt;]&lt;/span&gt;

&lt;span style=&#39;color:#9999a9; &#39;&gt;# Строим диаграмму&lt;/span&gt;
plt&lt;span style=&#39;color:#d2cd86; &#39;&gt;.&lt;/span&gt;plot&lt;span style=&#39;color:#d2cd86; &#39;&gt;(&lt;/span&gt;X&lt;span style=&#39;color:#d2cd86; &#39;&gt;,&lt;/span&gt; Y_10&lt;span style=&#39;color:#d2cd86; &#39;&gt;,&lt;/span&gt; &lt;span style=&#39;color:#00c4c4; &#39;&gt;&#39;bD:&#39;&lt;/span&gt;&lt;span style=&#39;color:#d2cd86; &#39;&gt;,&lt;/span&gt;  label &lt;span style=&#39;color:#d2cd86; &#39;&gt;=&lt;/span&gt; &lt;span style=&#39;color:#00c4c4; &#39;&gt;u&#39;Температура 10 \u00b0C&#39;&lt;/span&gt;&lt;span style=&#39;color:#d2cd86; &#39;&gt;)&lt;/span&gt;
plt&lt;span style=&#39;color:#d2cd86; &#39;&gt;.&lt;/span&gt;plot&lt;span style=&#39;color:#d2cd86; &#39;&gt;(&lt;/span&gt;X&lt;span style=&#39;color:#d2cd86; &#39;&gt;,&lt;/span&gt; Y_20&lt;span style=&#39;color:#d2cd86; &#39;&gt;,&lt;/span&gt; &lt;span style=&#39;color:#00c4c4; &#39;&gt;&#39;r^:&#39;&lt;/span&gt;&lt;span style=&#39;color:#d2cd86; &#39;&gt;,&lt;/span&gt;  label &lt;span style=&#39;color:#d2cd86; &#39;&gt;=&lt;/span&gt; &lt;span style=&#39;color:#00c4c4; &#39;&gt;u&#39;Температура 20 \u00b0C&#39;&lt;/span&gt;&lt;span style=&#39;color:#d2cd86; &#39;&gt;)&lt;/span&gt;
plt&lt;span style=&#39;color:#d2cd86; &#39;&gt;.&lt;/span&gt;plot&lt;span style=&#39;color:#d2cd86; &#39;&gt;(&lt;/span&gt;X&lt;span style=&#39;color:#d2cd86; &#39;&gt;,&lt;/span&gt; Y_30&lt;span style=&#39;color:#d2cd86; &#39;&gt;,&lt;/span&gt; &lt;span style=&#39;color:#00c4c4; &#39;&gt;&#39;go:&#39;&lt;/span&gt;&lt;span style=&#39;color:#d2cd86; &#39;&gt;,&lt;/span&gt;  label &lt;span style=&#39;color:#d2cd86; &#39;&gt;=&lt;/span&gt; &lt;span style=&#39;color:#00c4c4; &#39;&gt;u&#39;Температура 30 \u00b0C&#39;&lt;/span&gt;&lt;span style=&#39;color:#d2cd86; &#39;&gt;)&lt;/span&gt;
&lt;span style=&#39;color:#9999a9; &#39;&gt;# Задаем подписи&lt;/span&gt;
plt&lt;span style=&#39;color:#d2cd86; &#39;&gt;.&lt;/span&gt;title&lt;span style=&#39;color:#d2cd86; &#39;&gt;(&lt;/span&gt;&lt;span style=&#39;color:#00c4c4; &#39;&gt;u&#39;Зависимость плотности водных растворов этилового спирта от температуры&#39;&lt;/span&gt;&lt;span style=&#39;color:#d2cd86; &#39;&gt;)&lt;/span&gt;
plt&lt;span style=&#39;color:#d2cd86; &#39;&gt;.&lt;/span&gt;xlabel&lt;span style=&#39;color:#d2cd86; &#39;&gt;(&lt;/span&gt;&lt;span style=&#39;color:#00c4c4; &#39;&gt;u&#39;Массовая доля этилового спирта, %&#39;&lt;/span&gt;&lt;span style=&#39;color:#d2cd86; &#39;&gt;)&lt;/span&gt;
plt&lt;span style=&#39;color:#d2cd86; &#39;&gt;.&lt;/span&gt;ylabel&lt;span style=&#39;color:#d2cd86; &#39;&gt;(&lt;/span&gt;&lt;span style=&#39;color:#00c4c4; &#39;&gt;u&#39;Плотность, г/мл&#39;&lt;/span&gt;&lt;span style=&#39;color:#d2cd86; &#39;&gt;)&lt;/span&gt;
&lt;span style=&#39;color:#9999a9; &#39;&gt;# Включаем легенду&lt;/span&gt;
plt&lt;span style=&#39;color:#d2cd86; &#39;&gt;.&lt;/span&gt;legend&lt;span style=&#39;color:#d2cd86; &#39;&gt;(&lt;/span&gt;loc &lt;span style=&#39;color:#d2cd86; &#39;&gt;=&lt;/span&gt; &lt;span style=&#39;color:#00c4c4; &#39;&gt;&#39;best&#39;&lt;/span&gt;&lt;span style=&#39;color:#d2cd86; &#39;&gt;)&lt;/span&gt;
&lt;span style=&#39;color:#9999a9; &#39;&gt;# Сохраняем построенную диаграмму в файл&lt;/span&gt;
plt&lt;span style=&#39;color:#d2cd86; &#39;&gt;.&lt;/span&gt;savefig&lt;span style=&#39;color:#d2cd86; &#39;&gt;(&lt;/span&gt;&lt;span style=&#39;color:#00c4c4; &#39;&gt;&#39;spirit.png&#39;&lt;/span&gt;&lt;span style=&#39;color:#d2cd86; &#39;&gt;,&lt;/span&gt; format &lt;span style=&#39;color:#d2cd86; &#39;&gt;=&lt;/span&gt; &lt;span style=&#39;color:#00c4c4; &#39;&gt;&#39;png&#39;&lt;/span&gt;&lt;span style=&#39;color:#d2cd86; &#39;&gt;)&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;Во всех примерах использован код из поста &lt;a href=&quot;http://pyviy.blogspot.com/2009/08/matplotlib.html&quot; title=&quot;Пакет matplotlib. Строим банальный график&quot;&gt;Пакет matplotlib. Строим банальный график&lt;/a&gt; 

&lt;h3&gt;Syntax Highlighter&lt;/h3&gt;

&lt;p&gt;В целом порядок работы с сервисом &lt;a href=&quot;http://highlight.hohli.com/&quot;&gt;Syntax Highlighter&lt;/a&gt; аналогичен описанному выше. Имеются опции: &lt;span class=&quot;item&quot;&gt;Line numbers&lt;/span&gt; - включить/выключить автоматическую нумерацию строк кода, &lt;span class=&quot;item&quot;&gt;Use &amp;lt;font&amp;gt; tag (for Habrahabr)&lt;/span&gt; - если включена, код оформляется посредством тега &lt;span class=&quot;code&quot;&gt;&amp;lt;font&amp;gt;&lt;/span&gt;, в противном случае с помощью классов css (внешний вид подсвеченного кода при этом несколько отличается).&lt;/p&gt;

&lt;p&gt;Примеры:&lt;/p&gt;

&lt;p&gt;При включенной опции &lt;span class=&quot;item&quot;&gt;Use &amp;lt;font&amp;gt; tag (for Habrahabr)&lt;/span&gt;:&lt;/p&gt;

&lt;pre style=&quot;border : 2px solid #c1b496; padding : 20px; overflow : auto;&quot;&gt;
&lt;blockquote&gt;&lt;ol&gt;&lt;li&gt;&lt;font color=&quot;#339900&quot;&gt;#&amp;nbsp;-*-&amp;nbsp;coding:&amp;nbsp;UTF-8&amp;nbsp;-*-&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;import&amp;nbsp;matplotlib.&lt;font color=&quot;#007788&quot;&gt;pyplot&lt;/font&gt;&amp;nbsp;as&amp;nbsp;plt&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;font color=&quot;#339900&quot;&gt;#&amp;nbsp;Значения&amp;nbsp;по&amp;nbsp;оси&amp;nbsp;X&lt;/font&gt;&lt;/li&gt;&lt;li&gt;X&amp;nbsp;&lt;font color=&quot;#000080&quot;&gt;=&lt;/font&gt;&amp;nbsp;&lt;font color=&quot;#008000&quot;&gt;&amp;#91;&lt;/font&gt;&lt;font&gt;20.0&lt;/font&gt;,&amp;nbsp;&lt;font&gt;40.0&lt;/font&gt;,&amp;nbsp;&lt;font&gt;60.0&lt;/font&gt;,&amp;nbsp;&lt;font&gt;80.0&lt;/font&gt;,&amp;nbsp;&lt;font&gt;100.0&lt;/font&gt;&lt;font color=&quot;#008000&quot;&gt;&amp;#93;&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;font color=&quot;#339900&quot;&gt;#&amp;nbsp;Набор&amp;nbsp;значений&amp;nbsp;по&amp;nbsp;оси&amp;nbsp;Y&lt;/font&gt;&lt;/li&gt;&lt;li&gt;Y_10&amp;nbsp;&lt;font color=&quot;#000080&quot;&gt;=&lt;/font&gt;&amp;nbsp;&lt;font color=&quot;#008000&quot;&gt;&amp;#91;&lt;/font&gt;&lt;font&gt;0.97252&lt;/font&gt;,&amp;nbsp;&lt;font&gt;0.94238&lt;/font&gt;,&amp;nbsp;&lt;font&gt;0.89927&lt;/font&gt;,&amp;nbsp;&lt;font&gt;0.85197&lt;/font&gt;,&amp;nbsp;&lt;font&gt;0.79784&lt;/font&gt;&lt;font color=&quot;#008000&quot;&gt;&amp;#93;&lt;/font&gt;&lt;/li&gt;&lt;li&gt;Y_20&amp;nbsp;&lt;font color=&quot;#000080&quot;&gt;=&lt;/font&gt;&amp;nbsp;&lt;font color=&quot;#008000&quot;&gt;&amp;#91;&lt;/font&gt;&lt;font&gt;0.96864&lt;/font&gt;,&amp;nbsp;&lt;font&gt;0.93518&lt;/font&gt;,&amp;nbsp;&lt;font&gt;0.89113&lt;/font&gt;,&amp;nbsp;&lt;font&gt;0.84344&lt;/font&gt;,&amp;nbsp;&lt;font&gt;0.78934&lt;/font&gt;&lt;font color=&quot;#008000&quot;&gt;&amp;#93;&lt;/font&gt;&lt;/li&gt;&lt;li&gt;Y_30&amp;nbsp;&lt;font color=&quot;#000080&quot;&gt;=&lt;/font&gt;&amp;nbsp;&lt;font color=&quot;#008000&quot;&gt;&amp;#91;&lt;/font&gt;&lt;font&gt;0.96395&lt;/font&gt;,&amp;nbsp;&lt;font&gt;0.92770&lt;/font&gt;,&amp;nbsp;&lt;font&gt;0.88278&lt;/font&gt;,&amp;nbsp;&lt;font&gt;0.83473&lt;/font&gt;,&amp;nbsp;&lt;font&gt;0.78075&lt;/font&gt;&lt;font color=&quot;#008000&quot;&gt;&amp;#93;&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&amp;nbsp;&lt;/li&gt;&lt;li&gt;&lt;font color=&quot;#339900&quot;&gt;#&amp;nbsp;Строим&amp;nbsp;диаграмму&lt;/font&gt;&lt;/li&gt;&lt;li&gt;plt.&lt;font color=&quot;#007788&quot;&gt;plot&lt;/font&gt;&lt;font color=&quot;#008000&quot;&gt;&amp;#40;&lt;/font&gt;X,&amp;nbsp;Y_10,&amp;nbsp;&lt;font color=&quot;#FF0000&quot;&gt;&#39;bD:&#39;&lt;/font&gt;,&amp;nbsp;&amp;nbsp;label&amp;nbsp;&lt;font color=&quot;#000080&quot;&gt;=&lt;/font&gt;&amp;nbsp;u&lt;font color=&quot;#FF0000&quot;&gt;&#39;Температура&amp;nbsp;10&amp;nbsp;&lt;font color=&quot;#660099&quot;&gt;\u00b0&lt;/font&gt;C&#39;&lt;/font&gt;&lt;font color=&quot;#008000&quot;&gt;&amp;#41;&lt;/font&gt;&lt;/li&gt;&lt;li&gt;plt.&lt;font color=&quot;#007788&quot;&gt;plot&lt;/font&gt;&lt;font color=&quot;#008000&quot;&gt;&amp;#40;&lt;/font&gt;X,&amp;nbsp;Y_20,&amp;nbsp;&lt;font color=&quot;#FF0000&quot;&gt;&#39;r^:&#39;&lt;/font&gt;,&amp;nbsp;&amp;nbsp;label&amp;nbsp;&lt;font color=&quot;#000080&quot;&gt;=&lt;/font&gt;&amp;nbsp;u&lt;font color=&quot;#FF0000&quot;&gt;&#39;Температура&amp;nbsp;20&amp;nbsp;&lt;font color=&quot;#660099&quot;&gt;\u00b0&lt;/font&gt;C&#39;&lt;/font&gt;&lt;font color=&quot;#008000&quot;&gt;&amp;#41;&lt;/font&gt;&lt;/li&gt;&lt;li&gt;plt.&lt;font color=&quot;#007788&quot;&gt;plot&lt;/font&gt;&lt;font color=&quot;#008000&quot;&gt;&amp;#40;&lt;/font&gt;X,&amp;nbsp;Y_30,&amp;nbsp;&lt;font color=&quot;#FF0000&quot;&gt;&#39;go:&#39;&lt;/font&gt;,&amp;nbsp;&amp;nbsp;label&amp;nbsp;&lt;font color=&quot;#000080&quot;&gt;=&lt;/font&gt;&amp;nbsp;u&lt;font color=&quot;#FF0000&quot;&gt;&#39;Температура&amp;nbsp;30&amp;nbsp;&lt;font color=&quot;#660099&quot;&gt;\u00b0&lt;/font&gt;C&#39;&lt;/font&gt;&lt;font color=&quot;#008000&quot;&gt;&amp;#41;&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;font color=&quot;#339900&quot;&gt;#&amp;nbsp;Задаем&amp;nbsp;подписи&lt;/font&gt;&lt;/li&gt;&lt;li&gt;plt.&lt;font color=&quot;#007788&quot;&gt;title&lt;/font&gt;&lt;font color=&quot;#008000&quot;&gt;&amp;#40;&lt;/font&gt;u&lt;font color=&quot;#FF0000&quot;&gt;&#39;Зависимость&amp;nbsp;плотности&amp;nbsp;водных&amp;nbsp;растворов&amp;nbsp;этилового&amp;nbsp;спирта&amp;nbsp;от&amp;nbsp;температуры&#39;&lt;/font&gt;&lt;font color=&quot;#008000&quot;&gt;&amp;#41;&lt;/font&gt;&lt;/li&gt;&lt;li&gt;plt.&lt;font color=&quot;#007788&quot;&gt;xlabel&lt;/font&gt;&lt;font color=&quot;#008000&quot;&gt;&amp;#40;&lt;/font&gt;u&lt;font color=&quot;#FF0000&quot;&gt;&#39;Массовая&amp;nbsp;доля&amp;nbsp;этилового&amp;nbsp;спирта,&amp;nbsp;%&#39;&lt;/font&gt;&lt;font color=&quot;#008000&quot;&gt;&amp;#41;&lt;/font&gt;&lt;/li&gt;&lt;li&gt;plt.&lt;font color=&quot;#007788&quot;&gt;ylabel&lt;/font&gt;&lt;font color=&quot;#008000&quot;&gt;&amp;#40;&lt;/font&gt;u&lt;font color=&quot;#FF0000&quot;&gt;&#39;Плотность,&amp;nbsp;г/мл&#39;&lt;/font&gt;&lt;font color=&quot;#008000&quot;&gt;&amp;#41;&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;font color=&quot;#339900&quot;&gt;#&amp;nbsp;Включаем&amp;nbsp;легенду&lt;/font&gt;&lt;/li&gt;&lt;li&gt;plt.&lt;font color=&quot;#007788&quot;&gt;legend&lt;/font&gt;&lt;font color=&quot;#008000&quot;&gt;&amp;#40;&lt;/font&gt;loc&amp;nbsp;&lt;font color=&quot;#000080&quot;&gt;=&lt;/font&gt;&amp;nbsp;&lt;font color=&quot;#FF0000&quot;&gt;&#39;best&#39;&lt;/font&gt;&lt;font color=&quot;#008000&quot;&gt;&amp;#41;&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;font color=&quot;#339900&quot;&gt;#&amp;nbsp;Сохраняем&amp;nbsp;построенную&amp;nbsp;диаграмму&amp;nbsp;в&amp;nbsp;файл&lt;/font&gt;&lt;/li&gt;&lt;li&gt;plt.&lt;font color=&quot;#007788&quot;&gt;savefig&lt;/font&gt;&lt;font color=&quot;#008000&quot;&gt;&amp;#40;&lt;/font&gt;&lt;font color=&quot;#FF0000&quot;&gt;&#39;spirit.png&#39;&lt;/font&gt;,&amp;nbsp;format&amp;nbsp;&lt;font color=&quot;#000080&quot;&gt;=&lt;/font&gt;&amp;nbsp;&lt;font color=&quot;#FF0000&quot;&gt;&#39;png&#39;&lt;/font&gt;&lt;font color=&quot;#008000&quot;&gt;&amp;#41;&lt;/font&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/blockquote&gt;
&lt;/pre&gt;

&lt;p&gt;При выключенной опции &lt;span class=&quot;item&quot;&gt;Use &amp;lt;font&amp;gt; tag (for Habrahabr)&lt;/span&gt;:&lt;/p&gt;

&lt;pre class=&quot;cpp&quot; style=&quot;font-family:monospace;border : 2px solid #c1b496;padding : 20px; overflow : auto;&quot;&gt;&lt;ol&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #339900;&quot;&gt;# -*- coding: UTF-8 -*-&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;import matplotlib.&lt;span style=&quot;color: #007788;&quot;&gt;pyplot&lt;/span&gt; as plt&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: bold; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #339900;&quot;&gt;# Значения по оси X&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;X &lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color:#800080;&quot;&gt;20.0&lt;/span&gt;, &lt;span style=&quot;color:#800080;&quot;&gt;40.0&lt;/span&gt;, &lt;span style=&quot;color:#800080;&quot;&gt;60.0&lt;/span&gt;, &lt;span style=&quot;color:#800080;&quot;&gt;80.0&lt;/span&gt;, &lt;span style=&quot;color:#800080;&quot;&gt;100.0&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#93;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #339900;&quot;&gt;# Набор значений по оси Y&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;Y_10 &lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color:#800080;&quot;&gt;0.97252&lt;/span&gt;, &lt;span style=&quot;color:#800080;&quot;&gt;0.94238&lt;/span&gt;, &lt;span style=&quot;color:#800080;&quot;&gt;0.89927&lt;/span&gt;, &lt;span style=&quot;color:#800080;&quot;&gt;0.85197&lt;/span&gt;, &lt;span style=&quot;color:#800080;&quot;&gt;0.79784&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#93;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;Y_20 &lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color:#800080;&quot;&gt;0.96864&lt;/span&gt;, &lt;span style=&quot;color:#800080;&quot;&gt;0.93518&lt;/span&gt;, &lt;span style=&quot;color:#800080;&quot;&gt;0.89113&lt;/span&gt;, &lt;span style=&quot;color:#800080;&quot;&gt;0.84344&lt;/span&gt;, &lt;span style=&quot;color:#800080;&quot;&gt;0.78934&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#93;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: bold; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;Y_30 &lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color:#800080;&quot;&gt;0.96395&lt;/span&gt;, &lt;span style=&quot;color:#800080;&quot;&gt;0.92770&lt;/span&gt;, &lt;span style=&quot;color:#800080;&quot;&gt;0.88278&lt;/span&gt;, &lt;span style=&quot;color:#800080;&quot;&gt;0.83473&lt;/span&gt;, &lt;span style=&quot;color:#800080;&quot;&gt;0.78075&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#93;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&amp;nbsp;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #339900;&quot;&gt;# Строим диаграмму&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;plt.&lt;span style=&quot;color: #007788;&quot;&gt;plot&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;X, Y_10, &lt;span style=&quot;color: #FF0000;&quot;&gt;&#39;bD:&#39;&lt;/span&gt;,  label &lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt; u&lt;span style=&quot;color: #FF0000;&quot;&gt;&#39;Температура 10 &lt;span style=&quot;color: #660099; font-weight: bold;&quot;&gt;\u00b0&lt;/span&gt;C&#39;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;plt.&lt;span style=&quot;color: #007788;&quot;&gt;plot&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;X, Y_20, &lt;span style=&quot;color: #FF0000;&quot;&gt;&#39;r^:&#39;&lt;/span&gt;,  label &lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt; u&lt;span style=&quot;color: #FF0000;&quot;&gt;&#39;Температура 20 &lt;span style=&quot;color: #660099; font-weight: bold;&quot;&gt;\u00b0&lt;/span&gt;C&#39;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: bold; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;plt.&lt;span style=&quot;color: #007788;&quot;&gt;plot&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;X, Y_30, &lt;span style=&quot;color: #FF0000;&quot;&gt;&#39;go:&#39;&lt;/span&gt;,  label &lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt; u&lt;span style=&quot;color: #FF0000;&quot;&gt;&#39;Температура 30 &lt;span style=&quot;color: #660099; font-weight: bold;&quot;&gt;\u00b0&lt;/span&gt;C&#39;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #339900;&quot;&gt;# Задаем подписи&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;plt.&lt;span style=&quot;color: #007788;&quot;&gt;title&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;u&lt;span style=&quot;color: #FF0000;&quot;&gt;&#39;Зависимость плотности водных растворов этилового спирта от температуры&#39;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;plt.&lt;span style=&quot;color: #007788;&quot;&gt;xlabel&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;u&lt;span style=&quot;color: #FF0000;&quot;&gt;&#39;Массовая доля этилового спирта, %&#39;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;plt.&lt;span style=&quot;color: #007788;&quot;&gt;ylabel&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;u&lt;span style=&quot;color: #FF0000;&quot;&gt;&#39;Плотность, г/мл&#39;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: bold; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #339900;&quot;&gt;# Включаем легенду&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;plt.&lt;span style=&quot;color: #007788;&quot;&gt;legend&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;loc &lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #FF0000;&quot;&gt;&#39;best&#39;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;&lt;span style=&quot;color: #339900;&quot;&gt;# Сохраняем построенную диаграмму в файл&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;li style=&quot;font-weight: normal; vertical-align:top;&quot;&gt;&lt;div style=&quot;font: normal normal 1em/1.2em monospace; margin:0; padding:0; background:none; vertical-align:top;&quot;&gt;plt.&lt;span style=&quot;color: #007788;&quot;&gt;savefig&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #FF0000;&quot;&gt;&#39;spirit.png&#39;&lt;/span&gt;, format &lt;span style=&quot;color: #000080;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #FF0000;&quot;&gt;&#39;png&#39;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;
&lt;/pre&gt;

&lt;p&gt;Ну вот на этом и все. Спасибо за внимание.&lt;p&gt;

&lt;p&gt;Предыдущий пост по теме: &lt;a href=&quot;http://pyviy.blogspot.com/2009/08/blog-post_18.html&quot; title=&quot;Как вставить в блог фрагмент кода с подсветкой синтаксиса&quot;&gt;Как вставить в блог фрагмент кода с подсветкой синтаксиса&lt;/a&gt;&lt;/p&gt;

&lt;/span&gt;</description><link>http://pyviy.blogspot.com/2009/09/blog-post.html</link><author>noreply@blogger.com (Вий)</author><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-920988537392180762.post-5901391057332995573</guid><pubDate>Fri, 11 Sep 2009 12:15:00 +0000</pubDate><atom:updated>2009-09-11T19:03:40.973+06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">NumPy</category><category domain="http://www.blogger.com/atom/ns#">Python</category><title>Пакет NumPy. Краткое введение</title><description>&lt;h3&gt;Введение. Пакет NumPy - зачем нужен, где взять&lt;/h3&gt;

&lt;p&gt;Пакет (библиотека) языка &lt;a href=&quot;http://www.python.org/&quot;&gt;Pyton&lt;/a&gt; &lt;a href=&quot;http://numpy.scipy.org/&quot;&gt;&lt;strong&gt;NumPy&lt;/strong&gt;&lt;/a&gt; предоставляет программисту средства для высокоэффективной работы с огромными многомерными массивами данных. Как составная часть и основа, пакет &lt;strong&gt;NumPy&lt;/strong&gt; входит в большинство проектов, использующих язык Python и требующих мало-мальски громоздких вычислений. В частности, с его использованием написаны популярные пакеты вычислительной математики и научной графики &lt;a href=&quot;http://www.scipy.org/&quot;&gt;SciPy&lt;/a&gt; и &lt;a href=&quot;http://matplotlib.sourceforge.net/&quot;&gt;mathplotLib&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Python интерпретируемый язык программирования, как следствие, математические алгоритмы, написанные на Python&#39;е, часто работают заметно медленнее по сравнению с теми же алгоритмами, реализованными на компилируемых языках. Авторы &lt;strong&gt;NumPy&lt;/strong&gt; постарались разрешить эту проблему в части обработки массивов, предложив модуль, включающий набор функций для создания многомерных массивов и работы с ними, причем исполняемый код функций реализован на языках C и Fortran. Кроме того, в пакете определены функции линейной алгебры, преобразования Фурье и генерации случайных чисел.&lt;/p&gt;

&lt;p&gt;Сейчас я постараюсь дать самое краткое описание основ использования пакета.&lt;/p&gt;

&lt;p&gt;Взять дистрибутив &lt;strong&gt;NumPy&lt;/strong&gt; можно из репозитория &lt;a href=&quot;http://sourceforge.net/projects/numpy/files/&quot;&gt;SourceForge&lt;/a&gt;. На момент написания крайняя версия 1.3.0, выпущена 05 апреля 2009 года. Установка пакета не должна вызвать каких-либо затруднений, какой-либо особой настройки пакет так же не требует.&lt;/p&gt;

&lt;p&gt;Модуль &lt;strong&gt;NumPy&lt;/strong&gt; предназначен для работы с массивами, соответственно основной тип данных определенных в модуле - массив (&lt;span class=&quot;code&quot;&gt;nump.ndarray&lt;/span&gt;). Массив - контейнер, содержащий элементы одного типа (и одной длинны, если элементы вложенные массивы), организованные в упорядоченную 
многомерную таблицу. Доступ к элементам осуществляется по индексу - кортежу целых чисел.&lt;/p&gt;

&lt;p&gt;Создать массив можно несколькими способами.&lt;/p&gt;

&lt;span class=&quot;fullpost&quot;&gt;

&lt;h3&gt;Способы создания массивов&lt;/h3&gt;

&lt;p&gt;Массив может быть создан &lt;b&gt;на основе имеющегося списка:&lt;/b&gt;&lt;/p&gt;

&lt;pre class=&quot;codeblock&quot;&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; import numpy as np&lt;/span&gt;

&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; a = np.array([.1, .2, .3, .4, .5])&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; a&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;array([ 0.1,  0.2,  0.3,  0.4,  0.5])&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; type(a)&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;&amp;lt;type &#39;numpy.ndarray&#39;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;Имя класса &lt;span class=&quot;code&quot;&gt;numpy.ndarray&lt;/span&gt; выбрано специально, чтобы не было путаницы со стандартным классом Python &lt;span class=&quot;code&quot;&gt;array&lt;/span&gt;.&lt;/p&gt;

&lt;p&gt;Аналогично можно создать многомерный массив:&lt;/p&gt;

&lt;pre class=&quot;codeblock&quot;&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; a3 = np.array([ [ [1, 2], [3, 4], [5, 6] ], [ [7, 8], [9, 10], [11, 12] ] ])&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; a3&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;array([[[ 1,  2],
        [ 3,  4],
        [ 5,  6]],

       [[ 7,  8],
        [ 9, 10],
        [11, 12]]])&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; type(a3)&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;&amp;lt;type &#39;numpy.ndarray&#39;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;Массивы &lt;strong&gt;NumPy&lt;/strong&gt; во многом аналогичны стандартным спискам Python.&lt;/p&gt;

&lt;p&gt;Доступ к элементам массива получают по индексу (разумеется, индекс первого элемента &lt;span class=&quot;code&quot;&gt;0&lt;/span&gt;):&lt;/p&gt;

&lt;pre class=&quot;codeblock&quot;&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt;print a[0]&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;0.1&lt;/span&gt;

&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt;print a[3]&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;0.4&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;Для индексации многомерных массивов используют кортежи (индексы перечисляют через запятую):&lt;/p&gt;

&lt;pre class=&quot;codeblock&quot;&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; a3[1]&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;array([[ 7,  8],
       [ 9, 10],
       [11, 12]])&lt;/span&gt;

&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; a3[1, 1]&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;array([ 9, 10])&lt;/span&gt;

&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; a3[1, 1, 1]&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;10&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;От массивов можно брать срезы:&lt;/p&gt;

&lt;pre class=&quot;codeblock&quot;&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; a[2:4]&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;array([ 0.3,  0.4])&lt;/span&gt;

&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; a3[0, 1:]&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;array([[3, 4],
       [5, 6]])&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;Массивы можно использовать в различных итерациях:&lt;/p&gt;

&lt;pre class=&quot;codeblock&quot;&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; for i in a:&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;...&lt;/span&gt;&lt;span class=&quot;code&quot;&gt;     print i&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;...
0.1
0.2
0.3
0.4
0.5&lt;/span&gt;

&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; for i in a3:&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;...&lt;/span&gt;&lt;span class=&quot;code&quot;&gt;     for j in i:&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;...&lt;/span&gt;&lt;span class=&quot;code&quot;&gt;             print j&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;...
[1 2]
[3 4]
[5 6]
[7 8]
[ 9 10]
[11 12]&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;Каждый объект &lt;span class=&quot;code&quot;&gt;numpy.ndarray&lt;/span&gt; имеет атрибут &lt;span class=&quot;code&quot;&gt;shape&lt;/span&gt; - кортеж целых чисел, который определяет шаблон массива. Здесь под шаблоном подразумевается количество элементов каждой размерности массива, так для матрицы с &lt;span class=&quot;code&quot;&gt;n&lt;/span&gt; строк и &lt;span class=&quot;code&quot;&gt;m&lt;/span&gt; столбцов шаблон &lt;span class=&quot;code&quot;&gt;(n, m)&lt;/span&gt;.&lt;/p&gt;

&lt;pre class=&quot;codeblock&quot;&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; a.shape&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;(5,)&lt;/span&gt;

&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; a3.shape&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;(2, 3, 2)&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;Изменяя атрибут &lt;span class=&quot;code&quot;&gt;shape&lt;/span&gt;, можно изменять размерность и структуру массива, но при этом число элементов массива должно оставаться неизменным:&lt;/p&gt;

&lt;pre class=&quot;codeblock&quot;&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; a3.shape = (6, 2)&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; a3&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;array([[ 1,  2],
       [ 3,  4],
       [ 5,  6],
       [ 7,  8],
       [ 9, 10],
       [11, 12]])&lt;/span&gt;

&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; a3.shape = (12)&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; a3&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12])&lt;/span&gt;

&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; a3.shape = (3, 3)&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;Traceback (most recent call last):
  File &quot;&amp;lt;stdin&amp;gt;&quot;, line 1, in &amp;lt;module&amp;gt;
ValueError: total size of new array must be unchanged&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;Массив может быть создан &lt;b&gt;с помощью функции &lt;span class=&quot;code&quot;&gt;numpy.arange()&lt;/span&gt;.&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;Функция &lt;span class=&quot;code&quot;&gt;arange()&lt;/span&gt; в самом простом варианте вызова принимает в качестве аргумента целое положительное число &lt;span class=&quot;code&quot;&gt;n&lt;/span&gt;, возвращает массив из &lt;span class=&quot;code&quot;&gt;n&lt;/span&gt; элементов от &lt;span class=&quot;code&quot;&gt;0&lt;/span&gt; до &lt;span class=&quot;code&quot;&gt;n-1&lt;/span&gt;:&lt;/p&gt;

&lt;pre class=&quot;codeblock&quot;&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; b = np.arange(5)&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; b&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;array([0, 1, 2, 3, 4])&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; type(b)&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;&amp;lt;type &#39;numpy.ndarray&#39;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;Полный формат вызова функции: &lt;span class=&quot;code&quot;&gt;numpy.arange([start,] stop[, step,], dtype = None)&lt;/span&gt;,&lt;/p&gt;

&lt;p&gt;где:&lt;/p&gt;

&lt;p&gt;&lt;span class=&quot;code&quot;&gt;start&lt;/span&gt; - опциональный аргумент, начальное значение интервала, по умолчанию равен &lt;span class=&quot;code&quot;&gt;0&lt;/span&gt;;&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;code&quot;&gt;stop&lt;/span&gt; - обязательный аргумент, конечное значение интервала, не входящее в сам интервал, интервал замыкает значение &lt;span class=&quot;code&quot;&gt;stop - step&lt;/span&gt;;&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;code&quot;&gt;step&lt;/span&gt; - опциональный аргумент, шаг итерации, разность между каждым последующим и предыдущим значениями интервала, по умолчанию равен &lt;span class=&quot;code&quot;&gt;1&lt;/span&gt;;&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;code&quot;&gt;dtype&lt;/span&gt; - тип элементов массива, по умолчанию &lt;span class=&quot;code&quot;&gt;None&lt;/span&gt;, в этом случае тип элементов определяется по типу переданных функции аргуметов &lt;span class=&quot;code&quot;&gt;start&lt;/span&gt;, &lt;span class=&quot;code&quot;&gt;stop&lt;/span&gt;.&lt;/p&gt;

&lt;p&gt;Массив может быть создан &lt;b&gt;с помощью функции &lt;span class=&quot;code&quot;&gt;numpy.linspace()&lt;/span&gt;.&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;Функция &lt;span class=&quot;code&quot;&gt;linspace()&lt;/span&gt; в простейшем случае принимает три аргумента - числа: начальный элемент массива, конечный элемент массива, количество элементов массива. Возвращает массив чисел равномерно распределенных от начального до конечного значения.&lt;/p&gt;

&lt;pre class=&quot;codeblock&quot;&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; c = np.linspace(-3.0, 3.0, 7)&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; c&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;array([-3., -2., -1.,  0.,  1.,  2.,  3.])&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; type(c)&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;&amp;lt;type &#39;numpy.ndarray&#39;&amp;gt;&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;Полный формат вызова функции: &lt;span class=&quot;code&quot;&gt;numpy.linspace(start, stop, num = 50, endpoint = True, retstep = False)&lt;/span&gt;,&lt;/p&gt;

&lt;p&gt;где:&lt;/p&gt;

&lt;p&gt;&lt;span class=&quot;code&quot;&gt;start&lt;/span&gt; - обязательный аргумент, первый член последовательности элементов массива;&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;code&quot;&gt;stop&lt;/span&gt; - обязательный аргумент, последний член последовательности элементов массива;&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;code&quot;&gt;num&lt;/span&gt; - опциональный аргумент, количество элементов массива, по умолчанию равен &lt;span class=&quot;code&quot;&gt;50&lt;/span&gt;;&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;code&quot;&gt;endpoint&lt;/span&gt; - опциональный аргумент, логическое значение, по умолчанию &lt;span class=&quot;code&quot;&gt;True&lt;/span&gt;. Если передано &lt;span class=&quot;code&quot;&gt;True&lt;/span&gt;, &lt;span class=&quot;code&quot;&gt;stop&lt;/span&gt;, последний элемент массива. Если установлено в &lt;span class=&quot;code&quot;&gt;False&lt;/span&gt;, последовательность элементов формируется от &lt;span class=&quot;code&quot;&gt;start&lt;/span&gt; до &lt;span class=&quot;code&quot;&gt;stop&lt;/span&gt; для &lt;span class=&quot;code&quot;&gt;num + 1&lt;/span&gt; элементов, при этом в возвращаемый массив последний элемент не входит;&lt;/p&gt;

&lt;pre class=&quot;codeblock&quot;&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; d = np.linspace(1.0, 6.0, 5, endpoint = False)&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; d&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;array([ 1.,  2.,  3.,  4.,  5.])&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;&lt;span class=&quot;code&quot;&gt;retstep&lt;/span&gt; - опциональный аргумент, логическое значение, по умолчанию &lt;span class=&quot;code&quot;&gt;False&lt;/span&gt;. Если передано &lt;span class=&quot;code&quot;&gt;True&lt;/span&gt;, функция возвращает кортеж из двух членов, первый - массив, последовательность элементов, второй - число, приращение между элементами последовательности.&lt;/p&gt;

&lt;pre class=&quot;codeblock&quot;&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; f = np.linspace(.5, -.5, 5, retstep = True)&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; f&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;(array([ 0.5 ,  0.25,  0.  , -0.25, -0.5 ]), -0.25)&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;Массив может быть создан &lt;b&gt;с помощью функций &lt;span class=&quot;code&quot;&gt;numpy.zeros()&lt;/span&gt;, &lt;span class=&quot;code&quot;&gt;numpy.ones()&lt;/span&gt;, &lt;span class=&quot;code&quot;&gt;numpy.empty()&lt;/span&gt;.&lt;/b&gt;&lt;/p&gt;

&lt;p&gt;Функции принимают один обязательный аргумент - кортеж, размерность массива и возвращают массив затребованной структуры содержащий: нули (функция &lt;span class=&quot;code&quot;&gt;numpy.zeros()&lt;/span&gt;), единицы &lt;span class=&quot;code&quot;&gt;numpy.ones()&lt;/span&gt;, произвольный мусор (неинициализированный массив, функция  &lt;span class=&quot;code&quot;&gt;numpy.empty()&lt;/span&gt;):

&lt;pre class=&quot;codeblock&quot;&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; z = np.zeros((3,3))&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; z&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;array([[ 0.,  0.,  0.],
       [ 0.,  0.,  0.],
       [ 0.,  0.,  0.]])&lt;/span&gt;

&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; o = np.ones((3, 3))&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; o&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;array([[ 1.,  1.,  1.],
       [ 1.,  1.,  1.],
       [ 1.,  1.,  1.]])&lt;/span&gt;

&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; e = np.empty((3,3))&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; e&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;array([[  8.32475314e-306,   8.32468797e-306,   8.32462278e-306],
       [  8.32455759e-306,   8.32449240e-306,   5.99491582e+197],
       [  5.30481132e+180,   5.51965256e-311,   0.00000000e+000]])&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;Полный формат вызова функций:&lt;/p&gt;

&lt;p&gt;&lt;span class=&quot;code&quot;&gt;numpy.zeros(shape, dtype = float, order = &#39;C&#39;)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;code&quot;&gt;numpy.ones(shape, dtype = float, order = &#39;C&#39;)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;code&quot;&gt;numpy.empty(shape, dtype = float, order = &#39;C&#39;)&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;где:&lt;/p&gt;

&lt;p&gt;&lt;span class=&quot;code&quot;&gt;shape&lt;/span&gt; - обязательный аргумент, кортеж, требуемая размерность массива;&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;code&quot;&gt;dtype&lt;/span&gt; - опциональный аргумент, тип элементов массива, по умолчанию &lt;span class=&quot;code&quot;&gt;float&lt;/span&gt;;&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;code&quot;&gt;order&lt;/span&gt; - опциональный аргумент, строка, способ представления данных массива в памяти, два возможных значения &lt;span class=&quot;code&quot;&gt;&#39;C&#39;&lt;/span&gt; и &lt;span class=&quot;code&quot;&gt;&#39;F&#39;&lt;/span&gt;, пока я не сталкивался с необходимостью изменять умолчальное значение.&lt;/p&gt;

&lt;p&gt;Ну и последний из рассматриваемых способов &lt;b&gt; с помощью функций &lt;span class=&quot;code&quot;&gt;numpy.zeros_like()&lt;/span&gt;, &lt;span class=&quot;code&quot;&gt;numpy.ones_like()&lt;/span&gt;, &lt;span class=&quot;code&quot;&gt;numpy.empty_like()&lt;/span&gt;&lt;/b&gt;.&lt;/p&gt;

&lt;p&gt;Обязательный аргумент, принимаемый функциями - массив, функции возвращают массив такой же структуры, содержащий, соответственно, нули, единицы и то, что оказалось в памяти на момент создания массива.&lt;/p&gt;

&lt;pre class=&quot;codeblock&quot;&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; d&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;array([ 1.,  2.,  3.,  4.,  5.])&lt;/span&gt;

&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; dz = np.zeros_like(d)&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; dz&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;array([ 0.,  0.,  0.,  0.,  0.])&lt;/span&gt;

&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; do = np.ones_like(d)&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; do&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;array([ 1.,  1.,  1.,  1.,  1.])&lt;/span&gt;

&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; de = np.empty_like(d)&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; de&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;array([  2.24122267e+201,   6.32526950e-317,   0.00000000e+000,
         2.24686637e+201,   6.34874355e-321])&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;Полный формат вызова функций:&lt;/p&gt;

&lt;p&gt;&lt;span class=&quot;code&quot;&gt;numpy.zeros_like(a)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;code&quot;&gt;numpy.ones_like(a)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;code&quot;&gt;numpy.empty_like(a)&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;где:&lt;/p&gt;

&lt;p&gt;&lt;span class=&quot;code&quot;&gt;a&lt;/span&gt; - обязательный аргумент, массив, структуру которого необходимо повторить;&lt;/p&gt;

&lt;h3&gt;О массивах чуть подробней&lt;/h3&gt;

&lt;p&gt;Как я уже говорил массив это упорядоченная &quot;многомерная таблица&quot; содержащая элементы одного типа, доступ к которым осуществляется по индексу. Индекс - кортеж целых чисел, однозначно определяющий положение элемента в массиве.&lt;/p&gt;

&lt;p&gt;Многомерную таблицу можно представить как некое расширение обычной, &quot;двумерной&quot; таблицы, включающей кроме строк и столбцов еще произвольное число &quot;измерений&quot;, вместе образующих некую многомерную решетку. В документации &lt;strong&gt;NumPy&lt;/strong&gt; такие измерения именуют &lt;b&gt;&lt;i&gt;осями&lt;/i&gt;&lt;/b&gt; (&lt;b&gt;&lt;i&gt;axis&lt;/i&gt;&lt;/b&gt;), а число осей у конкретного массива &lt;b&gt;&lt;i&gt;рангом&lt;/i&gt;&lt;/b&gt; (&lt;b&gt;&lt;i&gt;rank&lt;/i&gt;&lt;/b&gt;) массива (при этом термин ранг применяется и в контексте матриц, что, разумеется, не одно и тоже). Для еще большей путаницы вместо числа осей или ранга используют термин &lt;b&gt;&lt;i&gt;размерность&lt;/i&gt;&lt;/b&gt; (&lt;b&gt;&lt;i&gt;dimension&lt;/i&gt;&lt;/b&gt;). В разделе документации официального сайта проекта есть &lt;a href=&quot;http://www.scipy.org/Numpy_Glossary&quot;&gt;Numpy Glossary&lt;/a&gt;, там для слова axis приводиться одно значение, для слова rank два, а для слова dimension - три. На текущем уровне просветления моё воображение позволяет представить массив с размерностью не большей четырех, а в практической деятельности, я не сталкивался с массивами имеющими более трех осей :) Так вектор это одномерный массив, матрица, растровый черно-белый рисунок, таблица Excel двумерный, цветной растровый рисунок трехмерный.&lt;/p&gt;

&lt;p&gt;Каждый объект класса &lt;span class=&quot;code&quot;&gt;numpy.ndarray&lt;/span&gt; имеет атрибут &lt;span class=&quot;code&quot;&gt;ndarray.ndim&lt;/span&gt; - число осей, ранг, размерность массива. По определению ранга массива значение &lt;span class=&quot;code&quot;&gt;ndarray.ndim&lt;/span&gt; должно быть равно числу элементов в кортеже &lt;span class=&quot;code&quot;&gt;ndarray.shape&lt;/span&gt;.&lt;/p&gt;

&lt;p&gt;Общее число элементов массива можно узнать, обратившись к атрибуту &lt;span class=&quot;code&quot;&gt;ndarray.size&lt;/span&gt;.&lt;/p&gt;

&lt;pre class=&quot;codeblock&quot;&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; import numpy as np&lt;/span&gt;

&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; vector = np.array([1, 3, 5, 7, 9])&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; print vector.ndim&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;1&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; print vector.shape&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;(5,)&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; vector.size&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;5&lt;/span&gt;

&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; bwimage = np.array([ [255, 247, 236, 12, 149], [123, 34, 147, 45, 102], [34, 69, 108, 81, 94] ])&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; print bwimage.ndim&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;2&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; print bwimage.shape&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;(3, 5)&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; bwimage.size&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;15&lt;/span&gt;

&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; rgbimage = np.array([ [ [234, 126, 34, 45, 18], [123, 123, 49, 34, 56], [255, 233, 233, 233, 233] ],&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;...&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; [ [12, 12, 12, 12, 12], [14, 15, 16, 17, 17], [13, 12, 14, 12, 12] ],&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;...&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; [ [67, 56, 56, 57, 56], [56, 57, 56, 57, 58], [59, 58, 58, 59, 57] ] ])&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; print rgbimage.ndim&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;3&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; print rgbimage.shape&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;(3, 3, 5)&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; rgbimage.size&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;45&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;В принципе с размерностями и рангами можно особо не заморачиваться, рассматривая многомерные массивы как вложенные (массивы, содержащие другие массивы) при этом следует не забывать, что длинна всех массивов находящихся на одном уровне вложения (на одной оси) обязана быть одинаковой.&lt;/p&gt;

&lt;pre class=&quot;codeblock&quot;&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; good = np.array([ [1, 2, 3], [4, 5, 6], [7, 8, 9] ])&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; wrong = np.array([ [1, 2, 3], [4, 5, 6], [7, 8] ])&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;Traceback (most recent call last):
  File &quot;&amp;lt;stdin&amp;gt;&quot;, line 1, in &amp;lt;module&amp;gt;
ValueError: setting an array element with a sequence.&lt;/span&gt;
&lt;/pre&gt;

&lt;h3&gt;Операции над массивами&lt;/h3&gt;

&lt;p&gt;Все вышесказанное было бы абсолютно бесполезной белибердой, если бы над массивами (над данными содержащимися в массивах) невозможно было б производить каких либо содержательных действий. Разумеется это не так. Цель создания пакета &lt;strong&gt;NumPy&lt;/strong&gt; - предоставить пользователю Python инструменты для &quot;быстрой&quot; работы с большими наборами данных.&lt;/p&gt;

&lt;p&gt;Объекты класса &lt;span class=&quot;code&quot;&gt;numpy.ndarray&lt;/span&gt; можно использовать как операнды в выражениях, при этом все операции с массивами будут выполняться &lt;b&gt;&lt;i&gt;поэлементно&lt;/i&gt;&lt;/b&gt;, то есть итогом операции будет новый массив, содержащий результаты применения операции к каждому элементу исходного массива:&lt;/p&gt;

&lt;pre class=&quot;codeblock&quot;&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; import numpy as np&lt;/span&gt;

&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; a = np.arange(6)&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; print a&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;[0 1 2 3 4 5]&lt;/span&gt;

&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; print a + 1&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;[1 2 3 4 5 6]&lt;/span&gt;

&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; print a * 3&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;[ 0  3  6  9 12 15]&lt;/span&gt;

&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; print a ** 3&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;[  0   1   8  27  64 125]&lt;/span&gt;

&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; print a &lt; 3&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;[ True  True  True False False False]&lt;/span&gt;

&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; a += 2&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; print a&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;[2 3 4 5 6 7]&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;В пакете &lt;strong&gt;NumPy&lt;/strong&gt; определены основные математические функции, так же позволяющие проводить поэлементные вычисления:&lt;/p&gt;

&lt;pre class=&quot;codeblock&quot;&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; t = np.linspace(0.0, 2 * np.pi, 4)&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; print t&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;[ 0.          2.0943951   4.1887902   6.28318531]&lt;/span&gt;

&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; print np.cos(t)&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;[ 1.  -0.5 -0.5  1. ]&lt;/span&gt;

&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; print np.sin(t)&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;[  0.00000000e+00   8.66025404e-01  -8.66025404e-01  -2.44929360e-16]&lt;/span&gt;

&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; print np.tan(t)&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;[  0.00000000e+00  -1.73205081e+00   1.73205081e+00  -2.44929360e-16]&lt;/span&gt;

&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; s = np.linspace(2.0, 6.0, 5)&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; print s&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;[ 2.  3.  4.  5.  6.]&lt;/span&gt;

&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; s = np.exp(s)&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; print s&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;[   7.3890561    20.08553692   54.59815003  148.4131591   403.42879349]&lt;/span&gt;

&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; s = np.log(s)&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; print s&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;[ 2.  3.  4.  5.  6.]&lt;/span&gt;

&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; print np.sqrt(s ** 2)&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;[ 2.  3.  4.  5.  6.]&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;Привожу список самых полезных (на мой взгляд) математических функций пакета &lt;strong&gt;NumPy&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;Во всех определениях ниже &lt;span class=&quot;code&quot;&gt;a&lt;/span&gt; массив или скаляр.&lt;/p&gt;

&lt;p&gt;&lt;span class=&quot;code&quot;&gt;numpy.abs(a)&lt;/span&gt; - абсолютное значение &lt;span class=&quot;code&quot;&gt;a&lt;/span&gt;;&lt;/p&gt;

&lt;p&gt;&lt;span class=&quot;code&quot;&gt;numpy.around(a, decimals = 0, out = None)&lt;/span&gt; - округляет &lt;span class=&quot;code&quot;&gt;a&lt;/span&gt; до заданного количества десятичных разрядов, по умолчанию до целого. Придерживается следующего правила округления. Если значение &lt;span class=&quot;code&quot;&gt;a&lt;/span&gt; находиться точно по середине между двумя целыми, округление производиться до ближайшего &lt;b&gt;четного&lt;/b&gt; целого. Так если &lt;span class=&quot;code&quot;&gt;a&lt;/span&gt; равно &lt;span class=&quot;code&quot;&gt;1.5&lt;/span&gt; или &lt;span class=&quot;code&quot;&gt;2.5&lt;/span&gt; будет возвращено &lt;span class=&quot;code&quot;&gt;2&lt;/span&gt;, если &lt;span class=&quot;code&quot;&gt;a&lt;/span&gt; равно &lt;span class=&quot;code&quot;&gt;-0.5&lt;/span&gt; или &lt;span class=&quot;code&quot;&gt;0.5&lt;/span&gt; будет возвращено &lt;span class=&quot;code&quot;&gt;0.0&lt;/span&gt;. Аргумент &lt;span class=&quot;code&quot;&gt;decimals&lt;/span&gt; - целое, десятичный разряд после запятой, до которого производиться округление, если &lt;span class=&quot;code&quot;&gt;decimals&lt;/span&gt; отрицательное, разряд отсчитывается влево от запятой.&lt;/p&gt;

&lt;pre class=&quot;codeblock&quot;&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; print np.around(np.array([0.5, 1.8, 2.5, 3.5]))&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;[ 0.  2.  2.  4.]&lt;/span&gt;

&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; print np.around(np.array([1, 5, 15, 45]), decimals = 1)&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;[ 1  5 15 45]&lt;/span&gt;

&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; print np.around(np.array([1, 5, 15, 45]), decimals = -1)&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;[ 0  0 20 40]&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;Аргумент &lt;span class=&quot;code&quot;&gt;out&lt;/span&gt; - массив, в который будет передан результат, структура массива &lt;span class=&quot;code&quot;&gt;out&lt;/span&gt;, должна совпадать со структурой возвращаемого массива. Если &lt;span class=&quot;code&quot;&gt;None&lt;/span&gt; (по умолчанию) будет создан новый массив.&lt;/p&gt;

&lt;p&gt;&lt;span class=&quot;code&quot;&gt;numpy.fix(a, out = None)&lt;/span&gt; - отбрасывает дробную часть &lt;span class=&quot;code&quot;&gt;a&lt;/span&gt;;&lt;/p&gt;

&lt;p&gt;&lt;span class=&quot;code&quot;&gt;numpy.ceil(a, out = None)&lt;/span&gt; - округляет &lt;span class=&quot;code&quot;&gt;a&lt;/span&gt; до меньшего из целых больших или равных &lt;span class=&quot;code&quot;&gt;a&lt;/span&gt;;&lt;/p&gt;

&lt;pre class=&quot;codeblock&quot;&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt;  print np.ceil(np.array([-2.7, -1.2, -0.5, 1.8, 2.4, 3.6]))&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;[-2. -1. -0.  2.  3.  4.]&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;&lt;span class=&quot;code&quot;&gt;numpy.floor(a, out = None)&lt;/span&gt; - округляет &lt;span class=&quot;code&quot;&gt;a&lt;/span&gt; до большего из целых меньших или равных &lt;span class=&quot;code&quot;&gt;a&lt;/span&gt;;&lt;/p&gt;

&lt;pre class=&quot;codeblock&quot;&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; print np.floor(np.array([-2.7, -1.2, -0.5, 1.8, 2.4, 3.6]))&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;[-3. -2. -1.  1.  2.  3.]&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;&lt;span class=&quot;code&quot;&gt;numpy.sign(a)&lt;/span&gt; - возвращает &lt;span class=&quot;code&quot;&gt;-1&lt;/span&gt; если &lt;span class=&quot;code&quot;&gt;a &amp;lt; 0&lt;/span&gt;, &lt;span class=&quot;code&quot;&gt;0&lt;/span&gt; если &lt;span class=&quot;code&quot;&gt;a == 0&lt;/span&gt;, &lt;span class=&quot;code&quot;&gt;1&lt;/span&gt; если &lt;span class=&quot;code&quot;&gt;a &amp;gt; 0;&lt;/span&gt;

&lt;p&gt;&lt;span class=&quot;code&quot;&gt;numpy.degrees(a)&lt;/span&gt; - конвертирует &lt;span class=&quot;code&quot;&gt;a&lt;/span&gt; из радиан в градусы;&lt;/p&gt;

&lt;p&gt;&lt;span class=&quot;code&quot;&gt;numpy.radians(a)&lt;/span&gt; - конвертирует &lt;span class=&quot;code&quot;&gt;a&lt;/span&gt; из градусов в радианы;&lt;/p&gt;

&lt;p&gt;&lt;span class=&quot;code&quot;&gt;numpy.cos(a)&lt;/span&gt;, &lt;span class=&quot;code&quot;&gt;numpy.sin(a)&lt;/span&gt;, &lt;span class=&quot;code&quot;&gt;numpy.tan(a)&lt;/span&gt; - возвращает косинус, синус, тангенс &lt;span class=&quot;code&quot;&gt;a&lt;/span&gt;. &lt;span class=&quot;code&quot;&gt;a&lt;/span&gt; в радианах;&lt;/p&gt;

&lt;p&gt;&lt;span class=&quot;code&quot;&gt;numpy.cosh(a)&lt;/span&gt;, &lt;span class=&quot;code&quot;&gt;numpy.sinh(a)&lt;/span&gt;, &lt;span class=&quot;code&quot;&gt;numpy.tanh(a)&lt;/span&gt; - возвращает гиперболические косинус, синус, тангенс &lt;span class=&quot;code&quot;&gt;a&lt;/span&gt;. &lt;span class=&quot;code&quot;&gt;a&lt;/span&gt; в радианах;&lt;/p&gt;

&lt;p&gt;&lt;span class=&quot;code&quot;&gt;numpy.arccos(a)&lt;/span&gt;, &lt;span class=&quot;code&quot;&gt;numpy.arcsin(a)&lt;/span&gt;, &lt;span class=&quot;code&quot;&gt;numpy.arctan(a)&lt;/span&gt; - возвращает арккосинус, арксинус, арктангенс &lt;span class=&quot;code&quot;&gt;a&lt;/span&gt; в радианах. Для арккосинуса в диапазоне &lt;span class=&quot;code&quot;&gt;[0, nump.pi]&lt;/span&gt;, для арксинуса &lt;span class=&quot;code&quot;&gt;[-numpy.pi/2, numpy.pi/2]&lt;/span&gt;, для арктангенса &lt;span class=&quot;code&quot;&gt;[-numpy.pi/2, numpy.pi/2]&lt;/span&gt;;&lt;/p&gt;

&lt;p&gt;&lt;span class=&quot;code&quot;&gt;numpy.arccosh(a)&lt;/span&gt;, &lt;span class=&quot;code&quot;&gt;numpy.arcsinh(a)&lt;/span&gt;, &lt;span class=&quot;code&quot;&gt;numpy.arctanh(a)&lt;/span&gt; - возвращает гиперболические косинус, синус, тангенс &lt;span class=&quot;code&quot;&gt;a&lt;/span&gt;. &lt;span class=&quot;code&quot;&gt;a&lt;/span&gt; в радианах;&lt;/p&gt;

&lt;p&gt;&lt;span class=&quot;code&quot;&gt;numpy.exp(a)&lt;/span&gt; - возвращает основание натурального логарифма (число &lt;span class=&quot;code&quot;&gt;e&lt;/span&gt;) в степени &lt;span class=&quot;code&quot;&gt;a&lt;/span&gt;;&lt;/p&gt;

&lt;p&gt;&lt;span class=&quot;code&quot;&gt;numpy.log(a)&lt;/span&gt;, &lt;span class=&quot;code&quot;&gt;numpy.log10(a)&lt;/span&gt;, &lt;span class=&quot;code&quot;&gt;numpy.log2(a)&lt;/span&gt; - возвращает натуральный логарифм &lt;span class=&quot;code&quot;&gt;a&lt;/span&gt;, логарифм &lt;span class=&quot;code&quot;&gt;a&lt;/span&gt; по основанию &lt;span class=&quot;code&quot;&gt;10&lt;/span&gt;, логарифм &lt;span class=&quot;code&quot;&gt;a&lt;/span&gt; по основанию &lt;span class=&quot;code&quot;&gt;2&lt;/span&gt;;&lt;/p&gt;

&lt;p&gt;&lt;span class=&quot;code&quot;&gt;numpy.log1p(a)&lt;/span&gt; - возвращает натуральный логарифм &lt;span class=&quot;code&quot;&gt;a + 1&lt;/span&gt;;&lt;/p&gt;

&lt;p&gt;&lt;span class=&quot;code&quot;&gt;numpy.sqrt(a)&lt;/span&gt; - возвращает положительный квадратный корень &lt;span class=&quot;code&quot;&gt;a&lt;/span&gt;;&lt;/p&gt;

&lt;p&gt;&lt;span class=&quot;code&quot;&gt;numpy.square(a)&lt;/span&gt; - возвращает квадрат &lt;span class=&quot;code&quot;&gt;a&lt;/span&gt;.&lt;/p&gt;

&lt;p&gt;В выражения можно включать несколько массивов. В случае если атрибуты &lt;span class=&quot;code&quot;&gt;ndarray.shape&lt;/span&gt; этих массивов совпадают, результат очевиден - действия над массивами будут производиться поэлементно:&lt;/p&gt;

&lt;pre class=&quot;codeblock&quot;&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; a1 = np.array([ [1.0, 2.0], [3.0, 4.0] ])&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; a2 = np.array([ [5.0, 6.0], [7.0, 8.0] ])&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; a3 = np.array([ [9.0, 10.0], [11.0, 12.0] ])&lt;/span&gt;

&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; print a1 + a2 + a3&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;[[ 15.  18.]
 [ 21.  24.]]&lt;/span&gt;

&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; print a1 * a2&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;[[  5.  12.]
 [ 21.  32.]]&lt;/span&gt;

&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; print a3 / a1&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;[[ 9.          5.        ]
 [ 3.66666667  3.        ]]&lt;/span&gt;

&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; print (a3 - a1) * a2&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;[[ 40.  48.]
 [ 56.  64.]]&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;Если атрибуты &lt;span class=&quot;code&quot;&gt;ndarray.shape&lt;/span&gt; не совпадают - действия над массивами производятся в соответствии с концепцией транслирования (&lt;b&gt;&lt;i&gt;broadcasting&lt;/i&gt;&lt;/b&gt;).&lt;/p&gt; 

&lt;p&gt;Операция транслирования - расширение одного или обоих массивов операндов до массивов с равной размерностью.&lt;/p&gt;

&lt;p&gt;Для начала несколько примеров:&lt;/p&gt;

&lt;pre class=&quot;codeblock&quot;&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; a2 = np.array([1, 2])&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; print a2&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;[1 2]&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; print a2.shape&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;(2,)&lt;/span&gt;

&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; a22 = np.array([ [1, 2], [3, 4] ])&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; print a22&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;[[1 2]
 [3 4]]&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; print a22.shape&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;(2, 2)&lt;/span&gt;

&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; a32 = np.array([ [1, 2], [3, 4], [5, 6] ])&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; print a32&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;[[1 2]
 [3 4]
 [5 6]]&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; print a32.shape&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;(3, 2)&lt;/span&gt;

&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; a222 = np.array([ [ [1, 2], [3, 4] ], [ [5, 6], [7, 8] ] ])&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; print a222&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;[[[1 2]
  [3 4]]

 [[5 6]
  [7 8]]]&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; print a222.shape&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;(2, 2, 2)&lt;/span&gt;

&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; print a22 + a2&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;[[2 4]
 [4 6]]&lt;/span&gt;
 
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; print a32 + a2&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;[[2 4]
 [4 6]
 [6 8]]&lt;/span&gt;

&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; print a222 + a2&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;[[[ 2  4]
  [ 4  6]]

 [[ 6  8]
  [ 8 10]]]&lt;/span&gt;

&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; print a32 + a22&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;Traceback (most recent call last):
  File &quot;&amp;lt;stdin&amp;gt;&quot;, line 1, in &amp;lt;module&amp;gt;
ValueError: shape mismatch: objects cannot be broadcast to a single shape&lt;/span&gt;

&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; print a222 + a22&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;[[[ 2  4]
  [ 6  8]]

 [[ 6  8]
  [10 12]]]&lt;/span&gt;

&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; print a222 + a32&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;Traceback (most recent call last):
  File &quot;&amp;lt;stdin&amp;gt;&quot;, line 1, in &amp;lt;module&amp;gt;
ValueError: shape mismatch: objects cannot be broadcast to a single shape&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;И так &lt;b&gt;правило&lt;/b&gt;. Если длины осей массивов, начиная с замыкающей, попарно равны или в каждой из сравниваемых пар длин хотя бы одна равна единице, то к таким массивам может быть применена операция транслирования. Вот. Длина замыкающей оси - длина массива вложенного наиболее глубоко.&lt;/p&gt;

&lt;pre class=&quot;codeblock&quot;&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; a = np.ones((7, 3, 4, 9, 8))&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; b = np.ones((4, 9, 8))&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; c = np.ones((4, 3, 8))&lt;/span&gt;

&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; print (a + b).shape&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;(7, 3, 4, 9, 8)&lt;/span&gt;

&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; print (a + c).shape&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;Traceback (most recent call last):
  File &quot;&amp;lt;stdin&amp;gt;&quot;, line 1, in &amp;lt;module&amp;gt;
ValueError: shape mismatch: objects cannot be broadcast to a single shape&lt;/span&gt;

&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; d = np.ones((9, 7, 1, 6, 1))&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; e = np.ones((7, 2, 1, 4))&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; print (d + e).shape&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;(9, 7, 2, 6, 4)&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;В случае если в массивах присутствуют оси единичной длины, расширяться могут оба массива.&lt;/p&gt;

&lt;pre class=&quot;codeblock&quot;&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; f = np.array([1, 2])&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; print f&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;[1 2]&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; print f.shape&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;(2,)&lt;/span&gt;

&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; g = np.array([ [3], [4], [5] ])&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; print g&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;[[3]
 [4]
 [5]]&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; print g.shape&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;(3, 1)&lt;/span&gt;

&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; h = f + g&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; print h&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;[[4 5]
 [5 6]
 [6 7]]&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; print h.shape&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;(3, 2)&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;Трансляция массивов происходит и при вызове некоторых функций.&lt;/p&gt;

&lt;p&gt;Например, функция &lt;span class=&quot;code&quot;&gt;numpy.power(a1, a2)&lt;/span&gt;, где &lt;span class=&quot;code&quot;&gt;a1&lt;/span&gt;, &lt;span class=&quot;code&quot;&gt;a2&lt;/span&gt; массив или скаляр, возвращает &lt;span class=&quot;code&quot;&gt;a1&lt;/span&gt; в степени &lt;span class=&quot;code&quot;&gt;a2&lt;/span&gt;:&lt;/p&gt;

&lt;pre class=&quot;codeblock&quot;&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; print np.power(np.array([-2.0, -1.0, 0.0, 2.0, 3.0, 4.0]), 4)&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;[  16.    1.    0.   16.   81.  256.]&lt;/span&gt;

&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; print np.power(np.array([-2.0, -1.0, 0.0, 2.0, 3.0, 4.0]), -4)&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;[ 0.0625      1.                 Inf  0.0625      0.01234568  0.00390625]&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;в случае если у переданных массивов не совпадает структура, проводит трансляцию.&lt;/p&gt;

&lt;pre class=&quot;codeblock&quot;&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; print np.power(np.array([3, 7]), np.array([ [1], [2], [3] ]))&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;[[  3   7]
 [  9  49]
 [ 27 343]]&lt;/span&gt;
&lt;/pre&gt;

&lt;h3&gt;Некоторые полезные функции&lt;/h3&gt;

&lt;p&gt;Здесь я приведу еще один набор полезных функций.&lt;/p&gt;

&lt;p&gt;&lt;span class=&quot;code&quot;&gt;numpy.min(a, axis = None, out = None)&lt;/span&gt;,&lt;/p&gt;

&lt;p&gt;&lt;span class=&quot;code&quot;&gt;numpy.max(a, axis = None, out = None)&lt;/span&gt; -&lt;/p&gt;

&lt;p&gt;возвращает минимальное, максимальное значение элементов массива соответственно:&lt;/p&gt;

&lt;pre class=&quot;codeblock&quot;&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; import numpy as np&lt;/span&gt;

&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; print np.min(np.array([ [1.0, -0.5, 3.0], [4.0, 3.0, -0.5] ]))&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;-0.5&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;&lt;span class=&quot;code&quot;&gt;axis&lt;/span&gt; - опциональный аргумент, индекс оси (измерения) массива по которому проводится поиск минимального, максимального значения. Под индексом оси понимается индекс в кортеже &lt;span class=&quot;code&quot;&gt;ndarray.shape&lt;/span&gt;.&lt;/p&gt;

&lt;pre class=&quot;codeblock&quot;&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; a = np.array([ [ [1.0, 2.0, 3.0], [4.0, 5.0, 6.0] ], [ [7.0, 8.0, 9.0], [11, 12, 13] ] ])&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; print a&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;[[[  1.   2.   3.]
  [  4.   5.   6.]]

 [[  7.   8.   9.]
  [ 11.  12.  13.]]]&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; print a.shape&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;(2, 2, 3)&lt;/span&gt;

&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; print np.min(a, axis = 0)&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;[[ 1.  2.  3.]
 [ 4.  5.  6.]]&lt;/span&gt;

&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; print np.min(a, axis = 1)&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;[[ 1.  2.  3.]
 [ 7.  8.  9.]]&lt;/span&gt;

&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; print np.min(a, axis = 2)&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;[[  1.   4.]
 [  7.  11.]]&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;&lt;span class=&quot;code&quot;&gt;out&lt;/span&gt; - опциональный аргумент, массив, в который будет помещен результат. Структура массива &lt;span class=&quot;code&quot;&gt;out&lt;/span&gt; должна соответствовать структуре массива результата. Если &lt;span class=&quot;code&quot;&gt;out = None&lt;/span&gt; (по умолчанию) будет создан новый массив.&lt;/p&gt;

&lt;p&gt;&lt;span class=&quot;code&quot;&gt;numpy.argmin(a, axis = None)&lt;/span&gt;,&lt;/p&gt;

&lt;p&gt;&lt;span class=&quot;code&quot;&gt;numpy.argmax(a, axis = None)&lt;/span&gt; -&lt;/p&gt;

&lt;p&gt;возвращает индекс минимального, максимального значения элементов массива соответственно:&lt;/p&gt;

&lt;pre class=&quot;codeblock&quot;&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; print np.argmin(np.array([ [1.0, -0.5, 3.0], [4.0, 3.0, -0.5] ]))&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;1&lt;/span&gt;

&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; print np.argmin(a, axis = 0)&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;[[0 0 0]
 [0 0 0]]&lt;/span&gt;

&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; print np.argmin(a, axis = 1)&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;[[0 0 0]
 [0 0 0]]&lt;/span&gt;

&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; print np.argmin(a, axis = 2)&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;[[0 0]
 [0 0]]&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;&lt;span class=&quot;code&quot;&gt;numpy.sum(a, axis = None, dtype = None, out = None)&lt;/span&gt;,&lt;/p&gt;

&lt;p&gt;&lt;span class=&quot;code&quot;&gt;numpy.prod(a, axis = None, dtype = None, out = None)&lt;/span&gt; -&lt;/p&gt;

&lt;p&gt;возвращает сумму, произведение элементов массива соответственно:&lt;/p&gt;

&lt;pre class=&quot;codeblock&quot;&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; print np.sum(np.array([ [1.0, -0.5, 3.0], [4.0, 3.0, -0.5] ]))&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;10.0&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; print np.sum(a, axis = 0)&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;[[  8.  10.  12.]
 [ 15.  17.  19.]]&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; print np.sum(a, axis = 1)&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;[[  5.   7.   9.]
 [ 18.  20.  22.]]&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;code&quot;&gt; print np.sum(a, axis = 2)&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;[[  6.  15.]
 [ 24.  36.]]&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;Ну вот пожалуй на сегодня и все. Разговор о пакете &lt;b&gt;NumPy&lt;/b&gt; продолжим в следующий раз.&lt;/p&gt;

&lt;/span&gt;</description><link>http://pyviy.blogspot.com/2009/09/numpy.html</link><author>noreply@blogger.com (Вий)</author><thr:total>761</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-920988537392180762.post-2491041959244124047</guid><pubDate>Tue, 01 Sep 2009 13:32:00 +0000</pubDate><atom:updated>2009-09-04T20:31:36.516+06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Firefox</category><category domain="http://www.blogger.com/atom/ns#">Google</category><title>Дополнение Firefox gTranslate. Мгновенный доступ к сервису Переводчик Google</title><description>&lt;img style=&quot;float : left;&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBIuXWeTBAfjUcJ8nCj2wSLHw-v0JpeV_yqAQ3giyzwyPV5Mk_0NBayTaSG572ejF3pC0JQVaYMXeDg_BULS_pBiZ7l8aWo5vuBL6av58ZLM7Xw7etvVWBMOASp5G6qgYa3FTCxau2oY8/&quot; alt=&quot;Иконка дополнения Firefox gTranslate&quot;/&gt;

&lt;p style=&quot;text-indent : 0px;&quot;&gt;Среди многочисленных сервисов Google скромно существует &lt;a href=&quot;http://translate.google.com/&quot;&gt;&lt;b&gt;Google Переводчик&lt;/b&gt;&lt;/a&gt; - попытка всемогущего поисковика создать свою собственную систему автоматического перевода. Насколько удачная? Настолько, насколько были удачны все подобные попытки предпринятые до Google.&lt;/p&gt;

&lt;p&gt;Сервис полностью бесплатен. Поддерживает все, более менее значимые, мировые языки.&lt;/p&gt;

&lt;p&gt;А &lt;a href=&quot;https://addons.mozilla.org/ru/firefox/addon/918&quot;&gt;&lt;b&gt;дополнение Firefox gTranslate&lt;/b&gt;&lt;/a&gt; предназначено для &lt;b&gt;максимального упрощения доступа&lt;/b&gt; к указанному сервису.&lt;/p&gt;

&lt;span class=&quot;fullpost&quot;&gt;
 
&lt;p&gt;Установив дополнение, пользователь Firefox может выделить фрагмент текста, кликнуть правой кнопкой мыши на выделении, в контекстном меню браузера перейти на новый пункт &lt;span class=&quot;item&quot;&gt;Translate&lt;/span&gt;, и подождав несколько секунд (в зависимости от скорости соединения), там же в меню увидеть предлагаемый толмачом Google вариант перевода.&lt;/p&gt;

&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSeDQE6UK9-q26Z10DuUq06x3ufTdGetgULnUTWGSJjWMoUGRqn2RJ4kRS9yfVhVPRnbshypxqc00aWC-8t2HEYd95fqxEYxEVrPwF3dPbOhTvApNvkrFRH7LnBIvsVvynHtdQTHFemgc/&quot;&gt;
&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgSeDQE6UK9-q26Z10DuUq06x3ufTdGetgULnUTWGSJjWMoUGRqn2RJ4kRS9yfVhVPRnbshypxqc00aWC-8t2HEYd95fqxEYxEVrPwF3dPbOhTvApNvkrFRH7LnBIvsVvynHtdQTHFemgc/s288/gtranslate_01.png&quot; alt=&quot;Дополнение Firefox gTranslate. Пример перевода&quot; border=&quot;0&quot;/&gt;
&lt;/a&gt;

&lt;p&gt;Если был выделен большой фрагмент текста и перевод полностью не помещается в пункте меню, для просмотра перевода необходимо активировать этот пункт. По клику откроется новая вкладка со страницей переводчика Google содержащая полный вариант перевода.&lt;/p&gt;

&lt;p&gt;Настроек дополнение минимум, но они несколько путанные.&lt;/p&gt;

&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi6JvDoSzeOte_88rizW3xzxtSk-GtjtkyEt_sj0DW9AcD8vNxt4tZ7Rb7re_dmF0XuUbKd5ZjuyyoKN8LKbq3HA4eoryM8EExXauJMbwwC9uUnu4YgO6MTyRJB4dfGKrDPnTY6pY9szXk/&quot; alt=&quot;Дополнение Firefox gTranslate. Окно настроек&quot;/&gt;

&lt;p&gt;Чекбокс &lt;span class=&quot;item&quot;&gt;Page language&lt;/span&gt; включает алгоритм автоматического распознавания языка страницы.&lt;/p&gt;

&lt;p&gt;Чекбокс &lt;span class=&quot;item&quot;&gt;Browser default language&lt;/span&gt; включает механизм определения языка перевода по локализации браузера.&lt;/p&gt;

&lt;p&gt;То есть, казалось бы, если включить оба чекбокса дополнение само определит с какого на какой язык необходимо осуществлять перевод.&lt;/p&gt;

&lt;p&gt;Зачем тогда нужен самый верхний выпадающий список в окне настроек (в котором так же присутствует пункт &lt;span class=&quot;item&quot;&gt;Detect language&lt;/span&gt; и повторяющий его пункт в контекстном меню?&lt;/p&gt;

&lt;p&gt;На сколько я понял автора дополнения, он реализовал два механизма распознавания переводимого языка. Один включается установкой чекбокса, другой выбором пункта списка/меню. Причем сам автор отдает предпочтение второму.&lt;/p&gt;

&lt;p&gt;В общем я выключил оба чекбокса, выбрав из списков пункты &lt;span class=&quot;item&quot;&gt;Detect language&lt;/span&gt; и &lt;span class=&quot;item&quot;&gt;Russian&lt;/span&gt;.&lt;/p&gt;

&lt;p&gt;Возможность выбора языка исходного текста и языка перевода присутствует и в контекстном меню.&lt;p&gt;

&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgsMRLYc_tJdOVOG-xIilrMquIUiOXshyphenhyphenBGo9DR3E2Btbyunhyphenhyphen6X7faTHtD5twLy-l0zkRaCh-d5lL_hjB_EvKicX3w7Po_i8lfX4RuYylcRvk_uI-10YQqh05tBMloBtS-5zM-LLYSKvk/&quot;&gt;
&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgsMRLYc_tJdOVOG-xIilrMquIUiOXshyphenhyphenBGo9DR3E2Btbyunhyphenhyphen6X7faTHtD5twLy-l0zkRaCh-d5lL_hjB_EvKicX3w7Po_i8lfX4RuYylcRvk_uI-10YQqh05tBMloBtS-5zM-LLYSKvk/s288/gtranslate_03.png&quot; alt=&quot;Дополнение Firefox gTranslate. Выбор языка перевода&quot; border=&quot;0&quot;/&gt;
&lt;/a&gt;

&lt;p&gt;Можно задать автоматическое распознавание языка источника (пункт меню &lt;span class=&quot;item&quot;&gt;Detect language&lt;/span&gt;), можно назначить исходный язык принудительно, ну и указать соответствующий ему язык перевода.&lt;/p&gt;

&lt;p&gt;Вот еще несколько примеров перевода :)&lt;/p&gt;

&lt;p&gt;Арабский&lt;/p&gt;

&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiPkM1ly5rg_k8IWdxlDv8cPnqesKurFSYD-Q_Nyxp6IoR2x3BgBXhBWBamVqanRqJl6GwkgOgwcWkDAPCd-mxZt9UGF-82wIVzYbwTubmeXcjYOQLvt_Q0hZdBiBzX_ayj0AW3_9iBCtA/&quot;&gt;
&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiPkM1ly5rg_k8IWdxlDv8cPnqesKurFSYD-Q_Nyxp6IoR2x3BgBXhBWBamVqanRqJl6GwkgOgwcWkDAPCd-mxZt9UGF-82wIVzYbwTubmeXcjYOQLvt_Q0hZdBiBzX_ayj0AW3_9iBCtA/s288/gtranslate_04.png&quot; alt=&quot;Дополнение Firefox gTranslate. Пример перевода. Арабский&quot; border=&quot;0&quot;/&gt;
&lt;/a&gt;

&lt;p&gt;Китайский&lt;/p&gt;

&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2Sd2atbkQam9WbBlWmAbS-sSXFC851UAQRjPMr0LyOcL5HMEF1MNqsarb8Lnt9hnb3vHAwmFxIbLbGWBhRsCeLjZKglpTpCccE-BVgoJMh-efLhho3ohhbZWllaZZc62u8-p5gRYHT3I/&quot;&gt;
&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2Sd2atbkQam9WbBlWmAbS-sSXFC851UAQRjPMr0LyOcL5HMEF1MNqsarb8Lnt9hnb3vHAwmFxIbLbGWBhRsCeLjZKglpTpCccE-BVgoJMh-efLhho3ohhbZWllaZZc62u8-p5gRYHT3I/s288/gtranslate_05.png&quot; alt=&quot;Дополнение Firefox gTranslate. Пример перевода. Китайский&quot; border=&quot;0&quot;/&gt;
&lt;/a&gt;

&lt;p&gt;Хинди&lt;/p&gt;

&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnevriNAyuCFYkuvfi6wNjQ_rv3hcAZwKu8rYlMZLyxGGkV1mckr2LsBB2Wd1rfYR6YUypG5uk3KZWNHyj-vC9DtelCYCq3G7GtUwq__JG2FmIaHPPV5u9dokBzFP0pJBRpgWQHv_XtEg/&quot;&gt;
&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgnevriNAyuCFYkuvfi6wNjQ_rv3hcAZwKu8rYlMZLyxGGkV1mckr2LsBB2Wd1rfYR6YUypG5uk3KZWNHyj-vC9DtelCYCq3G7GtUwq__JG2FmIaHPPV5u9dokBzFP0pJBRpgWQHv_XtEg/s288/gtranslate_06.png&quot; alt=&quot;Дополнение Firefox gTranslate. Пример перевода. Хинди&quot; border=&quot;0&quot;/&gt;
&lt;/a&gt;

&lt;p&gt;Я использую дополнение gTranslate (и сервис Переводчик Google соответственно) не как собственно переводчик (усилия по пониманию результатов автоматического перевода сопоставимы с непосредственным чтением английского текста), а как бесплатный словарь с относительно удобным интерфейсом.&lt;/p&gt;

&lt;/span&gt;</description><link>http://pyviy.blogspot.com/2009/09/firefox-gtranslate-google.html</link><author>noreply@blogger.com (Вий)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiBIuXWeTBAfjUcJ8nCj2wSLHw-v0JpeV_yqAQ3giyzwyPV5Mk_0NBayTaSG572ejF3pC0JQVaYMXeDg_BULS_pBiZ7l8aWo5vuBL6av58ZLM7Xw7etvVWBMOASp5G6qgYa3FTCxau2oY8/s72-c" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-920988537392180762.post-5650858527687227115</guid><pubDate>Mon, 24 Aug 2009 12:03:00 +0000</pubDate><atom:updated>2009-09-04T20:16:15.133+06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">Firefox</category><title>Дополнение Firefox Lazarus. Восстановление данных веб-форм</title><description>&lt;p&gt;Бывает весьма грустно и досадно, когда, текст, набранный в веб форме любимого форума, блога или какого-нибудь социального сервиса (типа одноклассников) безвозвратно исчезает в результате ошибки на стороне сервере (характерно для выше помянутых одноклассников), дисконнекта (если вовремя не заметишь и нажмешь на кнопку &quot;отправить&quot;) или сбоя питания (владельцы UPS могут по этому поводу не переживать). Сильное раздражение можно испытать и при попытке зарегистрироваться на некоторых популярных ресурсах - неофиту предлагается заполнить длинную форму, начиная с предполагаемого логина и пароля и заканчивая указанием в обязательных полях пола, возраста, даты рождения, часового пояса, города обитания и прочих личных предпочтений. После угадывания четырех цифр в тесте на дальтонизм происходит отправка данных заполненной формы. И вот как раз тут выясняется, что пользователь с указанным логином уже существует, причем сообщение об этом появляется на новой странице, замещающей страницу с формой. При возврате на страницу регистрации последняя так же перегружается, теряя при этом содержимое всех полей.&lt;/p&gt;

&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgek43kyfwA4-p4ShoLW3hLtXj2rMJ5p_swLuaIOzB3w65meVaXNnYvckGk0hjs3IMjUgTZS3QeTLX9K6WD-l6NoyhiUTbtiEYC1MMttjRt9CuznzNjVZQb901rqBtT9bTHjN-Zx5hAaK4/&quot; alt=&quot;Иконка дополнения Firefox Lazarus&quot; style=&quot;float : left;&quot;/&gt;

&lt;p style=&quot;text-indent : 0px;&quot;&gt;Пользователи Firefox легко могут избежать описанных недоразумений установив &lt;b&gt;дополнение Lazarus&lt;/b&gt;. Это дополнение позволяет, в случае необходимости, &lt;b&gt;восстановить данные  веб форм&lt;/b&gt; одним не сильным кликом мышки.&lt;/p&gt;

&lt;span class=&quot;fullpost&quot;&gt;

&lt;p&gt;Скачать последнюю версию Lazarus можно с официального репозитория дополнений &lt;a href=&quot;https://addons.mozilla.org/ru/firefox/addon/6984&quot;&gt;addons.mozilla.org&lt;/a&gt;, домашняя страница дополнения &lt;a href=&quot;http://lazarus.interclue.com/&quot;&gt;lazarus.interclue.com&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;После установки Lazarus будет автоматически сохраняет все данные вводимые пользователем в веб формы. При этом поддерживаются как &quot;обычные&quot; html формы, так и (частично) формы WYSIWYG редакторов, формы AJAXified, текстовые поля Richtext. Ввод в приложения Java и Flash дополнение перехватывать не способно.&lt;/p&gt;

&lt;p&gt;Lazarus хранит собранную информацию в базе данных (на основе SQLite, файл lazarus.sqlite в папке профиля) в зашифрованном виде (авторы дополнения настаивают на более чем достаточной надежности принятого способа шифрования), и каждой форме, с которой сталкивался пользователь (URL страницы содержащей форму), в базе данных соответствует запись, включающая историю пользовательского ввода.&lt;/p&gt;

&lt;p&gt;Как использовать дополнение?&lt;/p&gt;

&lt;p&gt;И так, для того, что бы восстановить потерянные данные веб формы, необходимо повторно открыть страницу с злополучной формой. Кликнут правой кнопкой мыши на поле ввода формы (или на любом участке страницы охваченном тегом &amp;lt;form&amp;gt;), в появившемся меню найти два пункта относящихся к Lazarus - &lt;span class=&quot;item&quot;&gt;Recover Form&lt;/span&gt; и &lt;span class=&quot;item&quot;&gt;Recover Text&lt;/span&gt;.&lt;/p&gt;

&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUCUJIuZBmDj7bozzyJjv0kPrDymqiuIv2vGeB-hkzdmVhsZXXHkior_X5XqDcWvBekaEbhz4EGx32WJIu0HzAlr14LhVXPbupa2lks33MoytiEKpzfqtltNKT2N_dKIMJq3i6xRIaCMc/&quot;&gt;
&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUCUJIuZBmDj7bozzyJjv0kPrDymqiuIv2vGeB-hkzdmVhsZXXHkior_X5XqDcWvBekaEbhz4EGx32WJIu0HzAlr14LhVXPbupa2lks33MoytiEKpzfqtltNKT2N_dKIMJq3i6xRIaCMc/s288/lazarus_01.png&quot; alt=&quot;Пример восстановления данных веб формы посредством дополнения Firefox Lazarus&quot; border=&quot;0&quot;/&gt;
&lt;/a&gt;

&lt;p&gt;Если выбрать любой из этих пунктов, раскроется подменю, состоящее из обрывков первых строк сохраненного в разное время текстового ввода. Необходимо выбрать понравившийся фрагмент и активировать его, в форме будет восстановлен соответствующий ему полный текст.&lt;/p&gt;

&lt;p&gt;Пункт &lt;span class=&quot;item&quot;&gt;Recover Form&lt;/span&gt; задействует механизм реализующий восстановление данных обычных html форм, пункт &lt;span class=&quot;item&quot;&gt;Recover Text&lt;/span&gt; механизм восстановления содержимого форм других поддерживаемых типов.&lt;/p&gt;

&lt;p&gt;Строка примера текста может заканчиваться символами &lt;span class=&quot;item&quot;&gt;(A)&lt;/span&gt; или &lt;span class=&quot;item&quot;&gt;(S)&lt;/span&gt;. В первом случае ввод был сохранен в базу данных Lazarus по ходу набора текста, во втором случае после того как пользователь инициировал отправку содержимого формы на сервер.&lt;/p&gt;

&lt;p&gt;Утерянное содержимое можно восстановить и не открывая страницу с формой. После установки Lazarus в строке состояния браузера появляется иконка с крестом. По клику на иконке всплывет меню в котором присутствует пункт &lt;span class=&quot;item&quot;&gt;Search Lazarus...&lt;/span&gt;&lt;/p&gt;

&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEheuB2eSChTCZyXLFJfPqLRBVpuBABw19L-LHIRzPa09zdqu_TD-SQGuPqIV5PrgZ2lNHDL9Gx9rd5OO9zPwFpwmBQ6bgAvHhZi56HZfyvsTiezuwz00-HfBDvnL5lpFOdSz3ugBiR3hgs/&quot; alt=&quot;Меню дополнения Firefox Lazarus&quot;/&gt;

&lt;p&gt;Lazarus предоставляет пользователю возможность проводить поиск по своей базе данных.&lt;/p&gt;

&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjicXHmg8XVWJWQZYFIUpwipn_Dh9qiopr2ufknsfyhyLyLPNRl4QuhRFoPkodcYWYH0_IFLv78k-V3iAdo0q1ZqRPz-GJZLXR8BCgSVMehJKozIeh1NaoEdBlfZvUphU9JPlj6IumYA4Q/&quot;&gt;
&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjicXHmg8XVWJWQZYFIUpwipn_Dh9qiopr2ufknsfyhyLyLPNRl4QuhRFoPkodcYWYH0_IFLv78k-V3iAdo0q1ZqRPz-GJZLXR8BCgSVMehJKozIeh1NaoEdBlfZvUphU9JPlj6IumYA4Q/s288/lazarus_03.png&quot; alt=&quot;Окно поиска дополнения Firefox Lazarus&quot; border=&quot;0&quot;/&gt;
&lt;/a&gt;

&lt;p&gt;База поискового индекса Lazarus зашифрована, в следствие чего адекватные результаты поиска будут получены только при подстановке в поле поиска целых слов и фраз.&lt;/p&gt;

&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh6loS2kk3VRMUgTws2q8Hsx7QKN0sgEjp80Z4JoLPSkEdlQgH7kBj-wP2dEe7FZFQOekgxv8rmtUhoB23xSe0qkQx2hq7Yv1MoWg_meSaTPc0Uiv-tgyjrmY-sXYFQ3ETdpZECBZzIelg/&quot;&gt;
&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh6loS2kk3VRMUgTws2q8Hsx7QKN0sgEjp80Z4JoLPSkEdlQgH7kBj-wP2dEe7FZFQOekgxv8rmtUhoB23xSe0qkQx2hq7Yv1MoWg_meSaTPc0Uiv-tgyjrmY-sXYFQ3ETdpZECBZzIelg/s288/lazarus_04.png&quot; alt=&quot;Поиск по базе данных Lazarus возможен только по целым словам и фразам&quot; border=&quot;0&quot;/&gt;
&lt;/a&gt;

&lt;p&gt;Выбрав из результатов поиска самую приглянувшиюся запись, можно просмотреть весь сохраненный текст, кликнув на кнопку в поле &lt;span class=&quot;item&quot;&gt;Recover&lt;/span&gt;&lt;/p&gt;

&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh67pZiJHkzjz-Khn6AVSAfotR-Gfkhvq1k5vW_shy8aa0SgoxY8liaEhkQ9F9TAZ-24tgRJ7dLUJgqQHD6Xjvo3LrFAxE91RfitnZg5W6NbPZXw5d-anw-tDqlio0rY34YJyDu-xMXDO0/&quot;&gt;
&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh67pZiJHkzjz-Khn6AVSAfotR-Gfkhvq1k5vW_shy8aa0SgoxY8liaEhkQ9F9TAZ-24tgRJ7dLUJgqQHD6Xjvo3LrFAxE91RfitnZg5W6NbPZXw5d-anw-tDqlio0rY34YJyDu-xMXDO0/s288/lazarus_05.png&quot; alt=&quot;Окно просмотра сохраненного текста базы данных дополнения Firefox Lazarus&quot; border=&quot;0&quot;/&gt;
&lt;/a&gt;

&lt;p&gt;Забавно, если ввод в форму содержал теги html, окно просмотра будет содержать две вкладки - исходный код и его вид в браузере.&lt;/p&gt;

&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2l4TKQHSiAssYKZQxGm3dxLdI7qw3TIkh7OActdM_zAuSYjwBsiTWJI6f4KDJyjDh7d05n7WIIiLda8HM7B7Es-bked19Oh2tmEkCz3tFZPYW7MgcsEeZ8XSEqRvEXHIUmCpsLxiePpI/&quot;&gt;
&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi2l4TKQHSiAssYKZQxGm3dxLdI7qw3TIkh7OActdM_zAuSYjwBsiTWJI6f4KDJyjDh7d05n7WIIiLda8HM7B7Es-bked19Oh2tmEkCz3tFZPYW7MgcsEeZ8XSEqRvEXHIUmCpsLxiePpI/s288/lazarus_06.png&quot; alt=&quot;Окно просмотра сохраненного текста базы данных дополнения Firefox Lazarus&quot; border=&quot;0&quot;/&gt;
&lt;/a&gt;

&lt;p&gt;Ну а если кликнуть по ссылке на страницу с формой (поле &lt;span class=&quot;item&quot;&gt;Url&lt;/span&gt;)будет открыта эта страница, а сохраненный ввод помещен в форму.&lt;/p&gt;

&lt;p&gt;Ввод можно удалить из базы, для чего предусмотрены соответствующие чекбоксы и кнопка &lt;span class=&quot;item&quot;&gt;Delete Selected&lt;/span&gt;.&lt;/p&gt;

&lt;p&gt;Не много о настройках.&lt;/p&gt;

&lt;p&gt;Окно настроек дополнения разбито на три вкладки: &lt;span class=&quot;item&quot;&gt;General&lt;/span&gt;, &lt;span class=&quot;item&quot;&gt;Security&lt;/span&gt; и &lt;span class=&quot;item&quot;&gt;Database&lt;/span&gt;.&lt;/p&gt;

&lt;p&gt;Вкладка &lt;span class=&quot;item&quot;&gt;General&lt;/span&gt;.&lt;/p&gt;

&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxIy4duzRic4bx1Z0AXpSfl9QQoSKXHzyuN5wY4ctImK_eqBboncBeTrhylH1ANn5XpHyYYlAtsTAY7OIsVn_GR6_XjcmLkXDHm77r7dxiOgrK7Wob0mRXplUT2I85QV_sv8m4RvPw_gk/&quot;&gt;
&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhxIy4duzRic4bx1Z0AXpSfl9QQoSKXHzyuN5wY4ctImK_eqBboncBeTrhylH1ANn5XpHyYYlAtsTAY7OIsVn_GR6_XjcmLkXDHm77r7dxiOgrK7Wob0mRXplUT2I85QV_sv8m4RvPw_gk/s288/lazarus_07.png&quot; alt=&quot;Окно настроек дополнения Firefox Lazarus. Вкладка General&quot; border=&quot;0&quot;/&gt;
&lt;/a&gt;

&lt;p&gt;Радиочекбоксы &lt;span class=&quot;item&quot;&gt;Show text in menu&lt;/span&gt;, &lt;span class=&quot;item&quot;&gt;Show saved time in menu&lt;/span&gt; - выбор, что показывать в меню Lazarus, начальный фрагмент текста или время сохранения.&lt;/p&gt;

&lt;p&gt;Чекбокс &lt;span class=&quot;item&quot;&gt;Show icon in context menu&lt;/span&gt; - смысл прост, показывать/не показывать иконку Lazarus в контекстном меню.&lt;/p&gt;

&lt;p&gt;Чекбокс &lt;span class=&quot;item&quot;&gt;Show icon in status bar&lt;/span&gt; - аналогичен предыдущему, показывать/не показывать иконку Lazarus в строке состояния.&lt;/p&gt;

&lt;p&gt;Чекбокс &lt;span class=&quot;item&quot;&gt;Show Restore Notification&lt;/span&gt; - если он включен то после восстановления формы, ранее содержавшей обширный ввод, пользователь увидит вот такое сообщение с просьбой пожертвовать небольшие деньги на нужды развития проекта .&lt;/p&gt;

&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiHDR7sQ-k2HaaRbyJc9fe-_ApFbIifUoI7BwF9xOtlHelPpDggdYTHUehtKfZiuh0oJA8Ji-twGMdgmSjLk5Xv2qd7vUQAHegIQRdgchNajSx1tsNST1qGK8mxnLbNHFYrvjTE5mEIK4g/&quot;&gt;
&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiHDR7sQ-k2HaaRbyJc9fe-_ApFbIifUoI7BwF9xOtlHelPpDggdYTHUehtKfZiuh0oJA8Ji-twGMdgmSjLk5Xv2qd7vUQAHegIQRdgchNajSx1tsNST1qGK8mxnLbNHFYrvjTE5mEIK4g/s400/lazarus_08.png&quot; alt=&quot;Пример сообщения дополнения Firefox Lazarus с просьбой пожертвовать деньги на развитие проекта&quot; border=&quot;0&quot;/&gt;
&lt;/a&gt;

&lt;p&gt;Вкладка &lt;span class=&quot;item&quot;&gt;Security&lt;/span&gt;.&lt;/p&gt;

&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgcTzuKMqLz8LUkSyNhFvNY0x35WceeL12faRP0jHjQ9VaUajxxndfRm-XUUpcVe2GzQswLdbF7NJh4coy1hrqPKLDhwNTFIdSXpQOQwjgjq1HV3foDLb8LA5rV2uRokF8ZqOhYDw4AMlE/&quot;&gt;
&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgcTzuKMqLz8LUkSyNhFvNY0x35WceeL12faRP0jHjQ9VaUajxxndfRm-XUUpcVe2GzQswLdbF7NJh4coy1hrqPKLDhwNTFIdSXpQOQwjgjq1HV3foDLb8LA5rV2uRokF8ZqOhYDw4AMlE/s288/lazarus_09.png&quot; alt=&quot;Окно настроек дополнения Firefox Lazarus. Вкладка Security&quot; border=&quot;0&quot;/&gt;
&lt;/a&gt;

&lt;p&gt;Чекбокс &lt;span class=&quot;item&quot;&gt;Save passwords&lt;/span&gt; - если включить, Lazarus будет сохранять содержимое форм ввода паролей. Авторы дополнения рекомендуют этого не делать!&lt;/p&gt;

&lt;p&gt;Чекбокс &lt;span class=&quot;item&quot;&gt;Remove saved forms after&lt;/span&gt; - установить время по прошествии которого сохраненный ввод будет автоматически удален из базы данных.&lt;/p&gt;

&lt;p&gt;Чекбокс &lt;span class=&quot;item&quot;&gt;Require a password to restore forms&lt;/span&gt; - если установить, будет запрошен пароль, который, в дальнейшем, потребуется вводить при попытке восстановить содержимое любой формы.&lt;/p&gt;

&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjh77IzWH4hy9nFmDfoGT-0UanC6wwAElcUsvyiPPpozgd_uG_ISI7NKewAeIyLJjAEi35osIC-pd6r669mzj6v7xvrge55IXc7_h00W8ShtdyMJLHq8S03CnfS1ZjW0Nsl1pKrGTXjF5o/&quot;&gt;
&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjh77IzWH4hy9nFmDfoGT-0UanC6wwAElcUsvyiPPpozgd_uG_ISI7NKewAeIyLJjAEi35osIC-pd6r669mzj6v7xvrge55IXc7_h00W8ShtdyMJLHq8S03CnfS1ZjW0Nsl1pKrGTXjF5o/s288/lazarus_10.png&quot; alt=&quot;Окно ввода пароля расширения Firefox Lazarus&quot; border=&quot;0&quot;/&gt;
&lt;/a&gt;

&lt;p&gt;&lt;/p&gt;

&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgoD03Vf7YnHuV6hgkYe7mnfzi6fb3MpsCrAg1ZFPOV3etj1PL_73xp6xednzMTeFMg3j-a3D08ZHFz1kUYa_DM5CRW1RjpYjtMvMQzFdetkqifZVRJXEWfJgDJXYq905VlmjRgb935h6Y/&quot; alt=&quot;Меню дополнения Firefox Lazarus при включенном пароле на восстановление содержимого форм&quot;/&gt;

&lt;p&gt;Чекбокс &lt;span class=&quot;item&quot;&gt;Disable Search Indexing&lt;/span&gt; - во включенном состоянии запрещает ведение поискового индекса. Авторы расширения заявляют, если злопыхатель получит доступ к папке профиля ни чего не подозревающего человека, то, используя зашифрованный файл поискового индекса и пользуясь каким то, не совсем мне понятным, хакерским методом атаки с помощью словаря, сможет восстановить отдельные слова ранее введенные пользователем в форму. Вот так. Пишите со всяким грамматическими ошибками и тогда ни какие словари хакерам не помогут.&lt;/p&gt;

&lt;p&gt;Чекбокс &lt;span class=&quot;item&quot;&gt;Enable Lazarus in Private Browsing Mode&lt;/span&gt; - разрешить Lazarus в режиме приватного просмотра. Авторы дополнения, в случае активации этого чекбокса, советуют не забыть установить пароль на восстановление содержимого форм.&lt;/p&gt;

&lt;p&gt;Вкладка &lt;span class=&quot;item&quot;&gt;Database&lt;/span&gt;.&lt;/p&gt;

&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjI8zl1KTcAiZIWSxcDQUufLnB-d2dReyS8US1HFzJ69663MZyZf9kuKWI73WemHC7O5IntvBF53Tz6Dd-l_Tli1VQvIQ1S5111r1WChmY_YTjqcAS0C4LmjLbt7afi1mHdGh6YW6CVgI0/&quot;&gt;
&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjI8zl1KTcAiZIWSxcDQUufLnB-d2dReyS8US1HFzJ69663MZyZf9kuKWI73WemHC7O5IntvBF53Tz6Dd-l_Tli1VQvIQ1S5111r1WChmY_YTjqcAS0C4LmjLbt7afi1mHdGh6YW6CVgI0/s288/lazarus_12.png&quot; alt=&quot;Окно настроек дополнения Firefox Lazarus. Вкладка Database&quot; border=&quot;0&quot;/&gt;
&lt;/a&gt;

&lt;p&gt;Кнопка &lt;span class=&quot;item&quot;&gt;Search Lazarus&lt;/span&gt; - если нажать появится уже знакомое окно поиска по базе данных Lazaru.&lt;/p&gt;

&lt;p&gt;Кнопка &lt;span class=&quot;item&quot;&gt;Remove all saved forms&lt;/span&gt; - удалить все сохраненные формы и их содержимое.&lt;/p&gt;

&lt;p&gt;Кнопка &lt;span class=&quot;item&quot;&gt;Delete The Database&lt;/span&gt; - удалить файл базы данных, браузер при этом перезагрузится.&lt;/p&gt;

&lt;p&gt;Ну вот собственно и все.&lt;/p&gt;

&lt;p&gt;P.S.&lt;/p&gt;

&lt;p&gt;Название дополнения Lazarus - это имя библейского персонажа &lt;a href=&quot;http://ru.wikipedia.org/wiki/%D0%9B%D0%B0%D0%B7%D0%B0%D1%80%D1%8C_%D0%B8%D0%B7_%D0%92%D0%B8%D1%84%D0%B0%D0%BD%D0%B8%D0%B8&quot;&gt;Лазаря&lt;/a&gt;, простого парня воскрешонного Исусом Христом, а иконка дополнения это &lt;a href=&quot;http://ru.wikipedia.org/wiki/%D0%90%D0%BD%D1%85&quot;&gt;Анх (Анкх)&lt;/a&gt; - египетский крест, в частности символизирующий бессмертие, предстоящую вечную жизнь.&lt;/p&gt;

&lt;/span&gt;</description><link>http://pyviy.blogspot.com/2009/08/firefox-lazarus.html</link><author>noreply@blogger.com (Вий)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgek43kyfwA4-p4ShoLW3hLtXj2rMJ5p_swLuaIOzB3w65meVaXNnYvckGk0hjs3IMjUgTZS3QeTLX9K6WD-l6NoyhiUTbtiEYC1MMttjRt9CuznzNjVZQb901rqBtT9bTHjN-Zx5hAaK4/s72-c" height="72" width="72"/><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-920988537392180762.post-4943902442532131948</guid><pubDate>Fri, 21 Aug 2009 08:53:00 +0000</pubDate><atom:updated>2009-09-30T17:54:54.330+06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">matplotlib</category><category domain="http://www.blogger.com/atom/ns#">Python</category><title>Пакет matplotlib. График с дополнительной осью ординат</title><description>&lt;p&gt;Часто для различных научно-технических надобностей требуется график с двумя осями ординат (осями Y) и одной общей осью абсцисс (осью X). Вот python скрипт, который строит такой график.&lt;/p&gt;

&lt;span class=&quot;fullpost&quot;&gt;

&lt;pre class=&quot;codeblock&quot;&gt;
&lt;font color=&quot;#804040&quot;&gt;&amp;nbsp;1 &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;# -*- coding: UTF-8 -*-&lt;/font&gt;
&lt;font color=&quot;#804040&quot;&gt;&amp;nbsp;2 &lt;/font&gt;
&lt;font color=&quot;#804040&quot;&gt;&amp;nbsp;3 &lt;/font&gt;&lt;font color=&quot;#a020f0&quot;&gt;import&lt;/font&gt;&amp;nbsp;matplotlib &lt;font color=&quot;#a020f0&quot;&gt;as&lt;/font&gt;&amp;nbsp;mpl
&lt;font color=&quot;#804040&quot;&gt;&amp;nbsp;4 &lt;/font&gt;&lt;font color=&quot;#a020f0&quot;&gt;import&lt;/font&gt;&amp;nbsp;matplotlib.pyplot &lt;font color=&quot;#a020f0&quot;&gt;as&lt;/font&gt;&amp;nbsp;plt
&lt;font color=&quot;#804040&quot;&gt;&amp;nbsp;5 &lt;/font&gt;
&lt;font color=&quot;#804040&quot;&gt;&amp;nbsp;6 &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;# Значения по оси X (Большая часть данных опущена)&lt;/font&gt;
&lt;font color=&quot;#804040&quot;&gt;&amp;nbsp;7 &lt;/font&gt;
&lt;font color=&quot;#804040&quot;&gt;&amp;nbsp;8 &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;# Время, ч&lt;/font&gt;
&lt;font color=&quot;#804040&quot;&gt;&amp;nbsp;9 &lt;/font&gt;
&lt;font color=&quot;#804040&quot;&gt;10 &lt;/font&gt;X = [0.00, 0.08, 0.17, ... 3.42, 3.50]
&lt;font color=&quot;#804040&quot;&gt;11 &lt;/font&gt;
&lt;font color=&quot;#804040&quot;&gt;12 &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;# Значения по осям Y (Большая часть данных опущена)&lt;/font&gt;
&lt;font color=&quot;#804040&quot;&gt;13 &lt;/font&gt;
&lt;font color=&quot;#804040&quot;&gt;14 &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;# Степнь разложения&lt;/font&gt;
&lt;font color=&quot;#804040&quot;&gt;15 &lt;/font&gt;
&lt;font color=&quot;#804040&quot;&gt;16 &lt;/font&gt;Y_01 = [0.0000, 0.0000, 0.0000, ... 0.8180, 0.8482]
&lt;font color=&quot;#804040&quot;&gt;17 &lt;/font&gt;
&lt;font color=&quot;#804040&quot;&gt;18 &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;# Температура, oC&lt;/font&gt;
&lt;font color=&quot;#804040&quot;&gt;19 &lt;/font&gt;
&lt;font color=&quot;#804040&quot;&gt;20 &lt;/font&gt;Y_02 = [ 21, 30, 70, ... 721, 724 ]
&lt;font color=&quot;#804040&quot;&gt;21 &lt;/font&gt;
&lt;font color=&quot;#804040&quot;&gt;22 &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;# Задем размеры изображения диаграммы&lt;/font&gt;
&lt;font color=&quot;#804040&quot;&gt;23 &lt;/font&gt;
&lt;font color=&quot;#804040&quot;&gt;24 &lt;/font&gt;mpl.rcParams[&#39;&lt;font color=&quot;#ff00ff&quot;&gt;figure.figsize&lt;/font&gt;&#39;] = (8.0, 6.0)
&lt;font color=&quot;#804040&quot;&gt;25 &lt;/font&gt;
&lt;font color=&quot;#804040&quot;&gt;26 &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;# Строим диаграмму&lt;/font&gt;
&lt;font color=&quot;#804040&quot;&gt;27 &lt;/font&gt;
&lt;font color=&quot;#804040&quot;&gt;28 &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;# Получаем ссылку на объект типа matplotlib.axes.AxesSubplot, текущую диаграмму &lt;/font&gt;
&lt;font color=&quot;#804040&quot;&gt;29 &lt;/font&gt;
&lt;font color=&quot;#804040&quot;&gt;30 &lt;/font&gt;ax_01 = plt.axes()
&lt;font color=&quot;#804040&quot;&gt;31 &lt;/font&gt;
&lt;font color=&quot;#804040&quot;&gt;32 &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;# Задаем исходные данные для первой линии диаграммы (линии степени разложения), внешний вид линии и маркера.&lt;/font&gt;
&lt;font color=&quot;#804040&quot;&gt;33 &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;# Функция plot() возвращает ссылку на объект класса matplotlib.lines.Line2D&lt;/font&gt;
&lt;font color=&quot;#804040&quot;&gt;34 &lt;/font&gt;
&lt;font color=&quot;#804040&quot;&gt;35 &lt;/font&gt;line_01, = ax_01.plot(X, Y_01, &#39;&lt;font color=&quot;#ff00ff&quot;&gt;bh:&lt;/font&gt;&#39;)
&lt;font color=&quot;#804040&quot;&gt;36 &lt;/font&gt;
&lt;font color=&quot;#804040&quot;&gt;37 &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;# Задаем интервалы значений по осям X и основной оси Y&lt;/font&gt;
&lt;font color=&quot;#804040&quot;&gt;38 &lt;/font&gt;
&lt;font color=&quot;#804040&quot;&gt;39 &lt;/font&gt;ax_01.axis([-0.04, 3.6, -0.01, 0.90])
&lt;font color=&quot;#804040&quot;&gt;40 &lt;/font&gt;
&lt;font color=&quot;#804040&quot;&gt;41 &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;# Включаем сетку по оси X и основной оси Y. Задаем цвет сетки&lt;/font&gt;
&lt;font color=&quot;#804040&quot;&gt;42 &lt;/font&gt;
&lt;font color=&quot;#804040&quot;&gt;43 &lt;/font&gt;ax_01.grid(color = &#39;&lt;font color=&quot;#ff00ff&quot;&gt;b&lt;/font&gt;&#39;)
&lt;font color=&quot;#804040&quot;&gt;44 &lt;/font&gt;
&lt;font color=&quot;#804040&quot;&gt;45 &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;# Задаем подписи к осям X и основной оси Y&lt;/font&gt;
&lt;font color=&quot;#804040&quot;&gt;46 &lt;/font&gt;
&lt;font color=&quot;#804040&quot;&gt;47 &lt;/font&gt;ax_01.set_xlabel(u&#39;&lt;font color=&quot;#ff00ff&quot;&gt;Время, ч&lt;/font&gt;&#39;)
&lt;font color=&quot;#804040&quot;&gt;48 &lt;/font&gt;ax_01.set_ylabel(u&#39;&lt;font color=&quot;#ff00ff&quot;&gt;Степень разложения&lt;/font&gt;&#39;)
&lt;font color=&quot;#804040&quot;&gt;49 &lt;/font&gt;
&lt;font color=&quot;#804040&quot;&gt;50 &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;# Задаем заголовок диаграммы&lt;/font&gt;
&lt;font color=&quot;#804040&quot;&gt;51 &lt;/font&gt;
&lt;font color=&quot;#804040&quot;&gt;52 &lt;/font&gt;ax_01.set_title(u&#39;&lt;font color=&quot;#ff00ff&quot;&gt;Термограмма разложения оксалата кальция&lt;/font&gt;&#39;)
&lt;font color=&quot;#804040&quot;&gt;53 &lt;/font&gt;
&lt;font color=&quot;#804040&quot;&gt;54 &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;# Включаем дополнительную ось Y&lt;/font&gt;
&lt;font color=&quot;#804040&quot;&gt;55 &lt;/font&gt;
&lt;font color=&quot;#804040&quot;&gt;56 &lt;/font&gt;ax_02 = ax_01.twinx()
&lt;font color=&quot;#804040&quot;&gt;57 &lt;/font&gt;
&lt;font color=&quot;#804040&quot;&gt;58 &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;# Задаем исходные данные для второй линии диаграммы (линии степени разложения), внешний вид линии и маркера.&lt;/font&gt;
&lt;font color=&quot;#804040&quot;&gt;59 &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;# Функция plot() возвращает ссылку на объект класса matplotlib.lines.Line2D&lt;/font&gt;
&lt;font color=&quot;#804040&quot;&gt;60 &lt;/font&gt;
&lt;font color=&quot;#804040&quot;&gt;61 &lt;/font&gt;line_02 = ax_02.plot(X, Y_02, &#39;&lt;font color=&quot;#ff00ff&quot;&gt;ro:&lt;/font&gt;&#39;)
&lt;font color=&quot;#804040&quot;&gt;62 &lt;/font&gt;
&lt;font color=&quot;#804040&quot;&gt;63 &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;# Задаем интервалы значений по осям X и дополнительной оси Y&lt;/font&gt;
&lt;font color=&quot;#804040&quot;&gt;64 &lt;/font&gt;
&lt;font color=&quot;#804040&quot;&gt;65 &lt;/font&gt;ax_02.axis([-0.04, 3.6, 0.0, 800.0])
&lt;font color=&quot;#804040&quot;&gt;66 &lt;/font&gt;
&lt;font color=&quot;#804040&quot;&gt;67 &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;# Задаем подпись к дополнительной оси Y&lt;/font&gt;
&lt;font color=&quot;#804040&quot;&gt;68 &lt;/font&gt;
&lt;font color=&quot;#804040&quot;&gt;69 &lt;/font&gt;ax_02.set_ylabel(u&#39;&lt;font color=&quot;#ff00ff&quot;&gt;Температура, &lt;/font&gt;&lt;font color=&quot;#6a5acd&quot;&gt;\u00b0&lt;/font&gt;&lt;font color=&quot;#ff00ff&quot;&gt;C&lt;/font&gt;&#39;)
&lt;font color=&quot;#804040&quot;&gt;70 &lt;/font&gt;
&lt;font color=&quot;#804040&quot;&gt;71 &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;# Включаем сетку по дополнительной оси Y. Задаем цвет сетки&lt;/font&gt;
&lt;font color=&quot;#804040&quot;&gt;72 &lt;/font&gt;
&lt;font color=&quot;#804040&quot;&gt;73 &lt;/font&gt;ax_02.grid(color = &#39;&lt;font color=&quot;#ff00ff&quot;&gt;r&lt;/font&gt;&#39;)
&lt;font color=&quot;#804040&quot;&gt;74 &lt;/font&gt;
&lt;font color=&quot;#804040&quot;&gt;75 &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;# Задаем исходные данные для легенды и место ее размещение&lt;/font&gt;
&lt;font color=&quot;#804040&quot;&gt;76 &lt;/font&gt;
&lt;font color=&quot;#804040&quot;&gt;77 &lt;/font&gt;ax_02.legend((line_01, line_02), (u&#39;&lt;font color=&quot;#ff00ff&quot;&gt;Степень разложения&lt;/font&gt;&#39;, u&#39;&lt;font color=&quot;#ff00ff&quot;&gt;Температура&lt;/font&gt;&#39;), loc = &#39;&lt;font color=&quot;#ff00ff&quot;&gt;best&lt;/font&gt;&#39;)
&lt;font color=&quot;#804040&quot;&gt;78 &lt;/font&gt;
&lt;font color=&quot;#804040&quot;&gt;79 &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;# Сохраняем построенную диаграмму в файл&lt;/font&gt;
&lt;font color=&quot;#804040&quot;&gt;80 &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;# Задаем имя файла и его тип&lt;/font&gt;
&lt;font color=&quot;#804040&quot;&gt;81 &lt;/font&gt;
&lt;font color=&quot;#804040&quot;&gt;82 &lt;/font&gt;plt.savefig(&#39;&lt;font color=&quot;#ff00ff&quot;&gt;termo.png&lt;/font&gt;&#39;, format = &#39;&lt;font color=&quot;#ff00ff&quot;&gt;png&lt;/font&gt;&#39;)
&lt;/pre&gt;

&lt;p&gt;В результате выполнения скрипта, в файле termo.png будет сохранено такое изображение:&lt;/p&gt;

&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCfKng7moqOMQKtsusP4yTvO7S1zBNzyz55PH-MXAbYFLFig-7z7a4Ri2rtjYjOwsEoKjU_M9NIFjb0khgj0a1j8U0qN3wGQne8yICBWPR2eNkAI6ALsI4LSTNdanHuNVxHGWqKJVxqWk/&quot;&gt;
&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCfKng7moqOMQKtsusP4yTvO7S1zBNzyz55PH-MXAbYFLFig-7z7a4Ri2rtjYjOwsEoKjU_M9NIFjb0khgj0a1j8U0qN3wGQne8yICBWPR2eNkAI6ALsI4LSTNdanHuNVxHGWqKJVxqWk/s400/termo.png&quot; alt=&quot;Matplotlib. Пример графика с двумя осями ординат&quot; border=&quot;0&quot;/&gt;
&lt;/a&gt;

&lt;p&gt;Пояснения к скрипту.&lt;/p&gt;

&lt;p&gt;В начале небольшое отступление. Matplotlib при работе со своими графическими объектами придерживается следующей идеологии: существуют текущая фигура (в документации &lt;span class=&quot;code&quot;&gt;figure&lt;/span&gt;) и текущая гм... диаграмма (в документации &lt;span class=&quot;code&quot;&gt;axes&lt;/span&gt;). Фигура это некое полотно на котором происходит построение чего либо. Диаграмма это объект принадлежащий фигуре (одной фигуре может принадлежать несколько диаграмм), к которому собственно и применяются команды pyplot. Диаграммы могут быть различных типов (в нашем случае прямоугольная 2D - обычный график). Тип диаграммы задается командой её построения (в нашем случае &lt;span class=&quot;code&quot;&gt;plot()&lt;/span&gt;) и определяет назначение диаграммы, внешний вид, свойства и возможные действия с ней.&lt;/p&gt;

&lt;p&gt;В выражении &lt;span class=&quot;code&quot;&gt;ax_01 = plt.axes()&lt;/span&gt; мы получаем ссылку на объект типа &lt;span class=&quot;code&quot;&gt;matplotlib.axes.AxesSubplot&lt;/span&gt; - текущую диаграмму. Далее, при построении графика, мы пользуемся методами этого объекта, действие которых в целом аналогично действию рассмотренным в предыдущих &lt;a href=&quot;http://pyviy.blogspot.com/2009/08/matplotlib.html&quot;&gt;постах&lt;/a&gt; функций модуля pyplot.&lt;/p&gt;

&lt;p&gt;После построения первой линии диаграммы (зависимости степени разложения от времени) создаем новый объект класса &lt;span class=&quot;code&quot;&gt;matplotlib.axes.Axes&lt;/span&gt; и получаем ссылку на него: &lt;span class=&quot;code&quot;&gt;ax_02 = ax_01.twinx()&lt;/span&gt;. В результате на диаграмму &lt;span class=&quot;code&quot;&gt;ax_01&lt;/span&gt; будет &quot;наложена&quot; вторая диаграмма &lt;span class=&quot;code&quot;&gt;ax_02&lt;/span&gt;, при этом, ось X будет общей для обеих диаграмм. Далее с помощью тех же методов, только уже принадлежащими объекту &lt;span class=&quot;code&quot;&gt;ax_02&lt;/span&gt; строим и оформляем вторую линию (зависимость температуры от времени).&lt;/p&gt;

&lt;p&gt;Вот и все, сохраняем получившееся творение.&lt;/p&gt;

&lt;p&gt;Подробнее о фигурах и диаграммах поговорим позже.&lt;/p&gt;

&lt;p&gt;Предыдущий пост по теме: &lt;a href=&quot;http://pyviy.blogspot.com/2009/08/matplotlib.html&quot;&gt;Пакет matplotlib. Строим банальный график&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Следующий пост по теме: &lt;a href=&quot;http://pyviy.blogspot.com/2009/09/matplotlib.html&quot;&gt;Пакет matplotlib. Наводим красивости&lt;/a&gt;.&lt;/p&gt;

&lt;/span&gt;</description><link>http://pyviy.blogspot.com/2009/08/matplotlib_21.html</link><author>noreply@blogger.com (Вий)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgCfKng7moqOMQKtsusP4yTvO7S1zBNzyz55PH-MXAbYFLFig-7z7a4Ri2rtjYjOwsEoKjU_M9NIFjb0khgj0a1j8U0qN3wGQne8yICBWPR2eNkAI6ALsI4LSTNdanHuNVxHGWqKJVxqWk/s72-c/termo.png" height="72" width="72"/><thr:total>1</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-920988537392180762.post-6493163878275213794</guid><pubDate>Tue, 18 Aug 2009 10:26:00 +0000</pubDate><atom:updated>2009-09-04T19:16:55.314+06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">blogger</category><category domain="http://www.blogger.com/atom/ns#">vim</category><title>Как вставить в блог фрагмент кода с подсветкой синтаксиса</title><description>&lt;p&gt;Часто в блоге (на сайте) необходимо разместить фрагмент кода на том или ином языке программирования. Такой фрагмент будет выглядеть гораздо красивей и понятнее если сделать подсветку синтаксиса как в продвинутых текстовых редакторах. Но редактировать вручную каждую строчку кода, раскрашивая элементы каждый в свой цвет, совсем не хочется. Конечно можно воспользоваться каким-нибудь бесплатным скриптом разукрашивающим код автоматически. Но скрипт надо ещё где-то разместить, а подключать и настраивать его все равно придется правя html код сообщения (страницы).&lt;/p&gt;

&lt;p&gt;К счастью можно обойтись без всяких дополнительных скриптов и не очень то напрягаться при этом. Для этого достаточно воспользоваться редактором &lt;a href=&quot;http://www.vim.org/index.php&quot;&gt;Vim&lt;/a&gt;. В командной строке Vim вводим:&lt;/p&gt;

&lt;span class=&quot;fullpost&quot;&gt;

&lt;pre class=&quot;codeblock&quot;&gt;
&lt;span class=&quot;console&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;code&quot;&gt;help convert-to-html&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;и узнаем, что в редакторе имеется скрипт &lt;span class=&quot;item&quot;&gt;2html&lt;/span&gt;, который преобразует отображение активного окна в html файл. Запустить скрипт можно обычным образом:&lt;/p&gt;

&lt;pre class=&quot;codeblock&quot;&gt;
&lt;span class=&quot;console&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;code&quot;&gt;runtime! syntax/2html.vim&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;или воспользоваться командой:&lt;/p&gt;

&lt;pre class=&quot;codeblock&quot;&gt;
&lt;span class=&quot;console&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;code&quot;&gt;TOhtml&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;Готовый html файл откроется в отдельном окне редактора. Окно редактор после выполнения команды будет выглядеть вот так:&lt;/p&gt;

&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhK5jbuyRGyLjIeFtk2llK1PhtDW2UNXSPe60unYQ8lP8Txncrk06Px3UmI8EQxblr6BViySwu3w-bViRqPlVMD4EK1wrKWFnQtYr6u3FOKTD6C4Ux-iD5Y2Kadf4mhr-rp8zrUSO2hEmY/&quot;&gt;
&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhK5jbuyRGyLjIeFtk2llK1PhtDW2UNXSPe60unYQ8lP8Txncrk06Px3UmI8EQxblr6BViySwu3w-bViRqPlVMD4EK1wrKWFnQtYr6u3FOKTD6C4Ux-iD5Y2Kadf4mhr-rp8zrUSO2hEmY/s400/tohtml.png&quot; border=&quot;0&quot;/&gt;
&lt;/a&gt;

&lt;p&gt;Из полученного html файла необходимо удалить всё непосредственно не касающееся кода (несколько строк в начале и конце файла). Если при размещении кода в блоге используется тег &lt;span class=&quot;code&quot;&gt;&amp;lt;pre&amp;gt;&lt;/span&gt; командой редактора:&lt;/p&gt;

&lt;pre class=&quot;codeblock&quot;&gt;
&lt;span class=&quot;console&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;code&quot;&gt;%s/&amp;lt;br&amp;gt;//g&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;можно удалить все теги &lt;span class=&quot;code&quot;&gt;&amp;lt;br&amp;gt;&lt;/span&gt;.&lt;/p&gt;

&lt;p&gt;В blogger&#39;е раскрашенный таким образом код будет выглядеть вот так:&lt;/p&gt;

&lt;pre class=&quot;codeblock&quot;&gt;
&lt;font color=&quot;#804040&quot;&gt;&amp;nbsp;1 &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;# -*- coding: UTF-8 -*-&lt;/font&gt;
&lt;font color=&quot;#804040&quot;&gt;&amp;nbsp;2 &lt;/font&gt;
&lt;font color=&quot;#804040&quot;&gt;&amp;nbsp;3 &lt;/font&gt;&lt;font color=&quot;#a020f0&quot;&gt;import&lt;/font&gt;&amp;nbsp;matplotlib.pyplot &lt;font color=&quot;#a020f0&quot;&gt;as&lt;/font&gt;&amp;nbsp;plt
&lt;font color=&quot;#804040&quot;&gt;&amp;nbsp;4 &lt;/font&gt;
&lt;font color=&quot;#804040&quot;&gt;&amp;nbsp;5 &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;# Значения по оси X&lt;/font&gt;
&lt;font color=&quot;#804040&quot;&gt;&amp;nbsp;6 &lt;/font&gt;
&lt;font color=&quot;#804040&quot;&gt;&amp;nbsp;7 &lt;/font&gt;X = [20.0, 40.0, 60.0, 80.0, 100.0]
&lt;font color=&quot;#804040&quot;&gt;&amp;nbsp;8 &lt;/font&gt;
&lt;font color=&quot;#804040&quot;&gt;&amp;nbsp;9 &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;# Набор значений по оси Y&lt;/font&gt;
&lt;font color=&quot;#804040&quot;&gt;10 &lt;/font&gt;
&lt;font color=&quot;#804040&quot;&gt;11 &lt;/font&gt;Y_10 = [0.97252, 0.94238, 0.89927, 0.85197, 0.79784]
&lt;font color=&quot;#804040&quot;&gt;12 &lt;/font&gt;Y_20 = [0.96864, 0.93518, 0.89113, 0.84344, 0.78934]
&lt;font color=&quot;#804040&quot;&gt;13 &lt;/font&gt;Y_30 = [0.96395, 0.92770, 0.88278, 0.83473, 0.78075]
&lt;font color=&quot;#804040&quot;&gt;14 &lt;/font&gt;
&lt;font color=&quot;#804040&quot;&gt;15 &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;# Строим диаграмму&lt;/font&gt;
&lt;font color=&quot;#804040&quot;&gt;16 &lt;/font&gt;
&lt;font color=&quot;#804040&quot;&gt;17 &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;# Задаем исходные данные для каждой линии диаграммы, внешний вид линий и маркеров.&lt;/font&gt;
&lt;font color=&quot;#804040&quot;&gt;18 &lt;/font&gt;
&lt;font color=&quot;#804040&quot;&gt;19 &lt;/font&gt;plt.plot(X, Y_10, &#39;&lt;font color=&quot;#ff00ff&quot;&gt;bD:&lt;/font&gt;&#39;,&amp;nbsp;&amp;nbsp;label = u&#39;&lt;font color=&quot;#ff00ff&quot;&gt;Температура 10 &lt;/font&gt;&lt;font color=&quot;#6a5acd&quot;&gt;\u00b0&lt;/font&gt;&lt;font color=&quot;#ff00ff&quot;&gt;C&lt;/font&gt;&#39;)
&lt;font color=&quot;#804040&quot;&gt;20 &lt;/font&gt;plt.plot(X, Y_20, &#39;&lt;font color=&quot;#ff00ff&quot;&gt;r^:&lt;/font&gt;&#39;,&amp;nbsp;&amp;nbsp;label = u&#39;&lt;font color=&quot;#ff00ff&quot;&gt;Температура 20 &lt;/font&gt;&lt;font color=&quot;#6a5acd&quot;&gt;\u00b0&lt;/font&gt;&lt;font color=&quot;#ff00ff&quot;&gt;C&lt;/font&gt;&#39;)
&lt;font color=&quot;#804040&quot;&gt;21 &lt;/font&gt;plt.plot(X, Y_30, &#39;&lt;font color=&quot;#ff00ff&quot;&gt;go:&lt;/font&gt;&#39;,&amp;nbsp;&amp;nbsp;label = u&#39;&lt;font color=&quot;#ff00ff&quot;&gt;Температура 30 &lt;/font&gt;&lt;font color=&quot;#6a5acd&quot;&gt;\u00b0&lt;/font&gt;&lt;font color=&quot;#ff00ff&quot;&gt;C&lt;/font&gt;&#39;)
&lt;font color=&quot;#804040&quot;&gt;22 &lt;/font&gt;
&lt;font color=&quot;#804040&quot;&gt;23 &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;# Задем интервалы значений по осям X и Y&lt;/font&gt;
&lt;font color=&quot;#804040&quot;&gt;24 &lt;/font&gt;
&lt;font color=&quot;#804040&quot;&gt;25 &lt;/font&gt;plt.axis([15.0, 105.0, 0.75, 1.0])
&lt;font color=&quot;#804040&quot;&gt;26 &lt;/font&gt;
&lt;font color=&quot;#804040&quot;&gt;27 &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;# Задаем заголовок диаграммы&lt;/font&gt;
&lt;font color=&quot;#804040&quot;&gt;28 &lt;/font&gt;
&lt;font color=&quot;#804040&quot;&gt;29 &lt;/font&gt;plt.title(u&#39;&lt;font color=&quot;#ff00ff&quot;&gt;Зависимость плотности водных растворов этилового спирта от температуры&lt;/font&gt;&#39;)
&lt;font color=&quot;#804040&quot;&gt;30 &lt;/font&gt;
&lt;font color=&quot;#804040&quot;&gt;31 &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;# Задаем подписи к осям X и Y&lt;/font&gt;
&lt;font color=&quot;#804040&quot;&gt;32 &lt;/font&gt;
&lt;font color=&quot;#804040&quot;&gt;33 &lt;/font&gt;plt.xlabel(u&#39;&lt;font color=&quot;#ff00ff&quot;&gt;Массовая доля этилового спирта, %&lt;/font&gt;&#39;)
&lt;font color=&quot;#804040&quot;&gt;34 &lt;/font&gt;plt.ylabel(u&#39;&lt;font color=&quot;#ff00ff&quot;&gt;Плотность, г/мл&lt;/font&gt;&#39;)
&lt;font color=&quot;#804040&quot;&gt;35 &lt;/font&gt;
&lt;font color=&quot;#804040&quot;&gt;36 &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;# Задаем исходные данные для легенды и ее размещение&lt;/font&gt;
&lt;font color=&quot;#804040&quot;&gt;37 &lt;/font&gt;
&lt;font color=&quot;#804040&quot;&gt;38 &lt;/font&gt;plt.legend(loc = &#39;&lt;font color=&quot;#ff00ff&quot;&gt;best&lt;/font&gt;&#39;)
&lt;font color=&quot;#804040&quot;&gt;39 &lt;/font&gt;
&lt;font color=&quot;#804040&quot;&gt;40 &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;# Включаем сетку&lt;/font&gt;
&lt;font color=&quot;#804040&quot;&gt;41 &lt;/font&gt;
&lt;font color=&quot;#804040&quot;&gt;42 &lt;/font&gt;plt.grid()
&lt;font color=&quot;#804040&quot;&gt;43 &lt;/font&gt;
&lt;font color=&quot;#804040&quot;&gt;44 &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;# Сохраняем построенную диаграмму в файл&lt;/font&gt;
&lt;font color=&quot;#804040&quot;&gt;45 &lt;/font&gt;&lt;font color=&quot;#0000ff&quot;&gt;# Задаем имя файла и его тип&lt;/font&gt;
&lt;font color=&quot;#804040&quot;&gt;46 &lt;/font&gt;
&lt;font color=&quot;#804040&quot;&gt;47 &lt;/font&gt;plt.savefig(&#39;&lt;font color=&quot;#ff00ff&quot;&gt;spirit_02.png&lt;/font&gt;&#39;, format = &#39;&lt;font color=&quot;#ff00ff&quot;&gt;png&lt;/font&gt;&#39;)
&lt;font color=&quot;#804040&quot;&gt;48 &lt;/font&gt;
&lt;font color=&quot;#804040&quot;&gt;49 &lt;/font&gt;plt.show()
&lt;/pre&gt;

&lt;p&gt;Код на языку Python позаимствован из прошлого &lt;a href=&quot;http://pyviy.blogspot.com/2009/08/matplotlib.html&quot;&gt;поста&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Под конец замечу, что Vim умеет подсвечивать синтаксис всех мыслимых языков программирования и описанным способом разукрасить и вставить в блог можно код чего угодно.&lt;/p&gt;

&lt;p&gt;Предыдущий пост по теме: &lt;a href=&quot;http://pyviy.blogspot.com/2009/08/blog-post_14.html&quot;&gt;Как вставить картинку в блог&lt;/a&gt;.&lt;/p&gt;

&lt;/span&gt;</description><link>http://pyviy.blogspot.com/2009/08/blog-post_18.html</link><author>noreply@blogger.com (Вий)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhK5jbuyRGyLjIeFtk2llK1PhtDW2UNXSPe60unYQ8lP8Txncrk06Px3UmI8EQxblr6BViySwu3w-bViRqPlVMD4EK1wrKWFnQtYr6u3FOKTD6C4Ux-iD5Y2Kadf4mhr-rp8zrUSO2hEmY/s72-c/tohtml.png" height="72" width="72"/><thr:total>0</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-920988537392180762.post-8598415214092044963</guid><pubDate>Fri, 14 Aug 2009 11:16:00 +0000</pubDate><atom:updated>2009-09-04T19:04:32.920+06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">blogger</category><title>Как вставить картинку в блог</title><description>&lt;p&gt;Такой вопрос рано или поздно задет себе любой блогер.&lt;/p&gt;

&lt;p&gt;Вот, на мой взгляд, самый простой способ.&lt;/p&gt;

&lt;span class=&quot;fullpost&quot;&gt;

&lt;p&gt;Для того чтобы вставить изображение в сообщение блога, как и в любую другую html страницу, необходимо воспользоваться тегом &lt;span class=&quot;code&quot;&gt;&amp;lt;img&amp;gt;&lt;/span&gt;, в атрибуте &lt;span class=&quot;code&quot;&gt;src&lt;/span&gt; которого указать ссылку на это изображение. Для этого, прежде всего, необходимо разместить файл с изображением где-то в Интернет, так, чтобы любой пользователь мог получить к нему доступ. Здесь лучше всего (на мой взгляд) воспользоваться сервисом Google &lt;a href=&quot;http://picasaweb.google.com/&quot;&gt;Picasa&lt;/a&gt;. Заводим (если еще нет) аккаунт Google, заходим на сайт сервиса. Жмем на кнопку &lt;span class=&quot;item&quot;&gt;&quot;загрузить&quot;&lt;/span&gt; сверху в середине страницы.&lt;/p&gt;

&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTqvPXC-rHe4HYDzbnLQFOp94MScJbu952VuVdM99z9U3PKB7FdrZNCIlc5HGiwHBctNw7nVE3Cy6qrD0v-r5DAPHPeB3Vf9_FU1w-tRq9wusZrmSLCSfkTpUXiJMH5nQo7hKD04HFV0s/&quot;&gt;&lt;/img&gt;

&lt;p&gt;Появится окно с предложением создать или выбрать альбом&lt;/p&gt;

&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmOzTKeoFV7ePm_1T-swWhm7z24I5kNqEWXnGnKMteyYfu0vZliFyOECro5_TGF3Cbvc4yhPW8qJvm3BpPijKK8CTRAJ_KwJkSN_WFf4Pun6oE0Cj5uY6p7f8bMaKrc4odcWfyg78e_cU/&quot;&gt;
&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhmOzTKeoFV7ePm_1T-swWhm7z24I5kNqEWXnGnKMteyYfu0vZliFyOECro5_TGF3Cbvc4yhPW8qJvm3BpPijKK8CTRAJ_KwJkSN_WFf4Pun6oE0Cj5uY6p7f8bMaKrc4odcWfyg78e_cU/s400/select.png&quot; border=&quot;0&quot;/&gt;
&lt;/a&gt;

&lt;p&gt;Для картинок размещаемых в блоге лучше всего создать отдельный частный альбом (например с именем блога или по тематике размещаемых картинок), что бы в дальнейшем, когда изображений станет много, этим хозяйством было проще управлять. Переходим по ссылке &lt;span class=&quot;item&quot;&gt;&quot;создайте новый альбом&quot;&lt;/span&gt; и создаем альбом.&lt;/p&gt;

&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhM8Rkz4qflsTyQ9TGD3JpAjMXPW5ycdwZPiTcooRbz-C7aRHsjr_YVneTDYpV7-bda8nKrYXCWqoNEgE4E4pP5AhPgDMpbaywJ3w-xG3VOnORb4zw3MDWE-4hpU_3_HyBUWSXioAZHce4/&quot;&gt;
&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhM8Rkz4qflsTyQ9TGD3JpAjMXPW5ycdwZPiTcooRbz-C7aRHsjr_YVneTDYpV7-bda8nKrYXCWqoNEgE4E4pP5AhPgDMpbaywJ3w-xG3VOnORb4zw3MDWE-4hpU_3_HyBUWSXioAZHce4/s400/album.png&quot; border=&quot;0&quot;/&gt;
&lt;/a&gt;

&lt;p&gt;Кстати, если блог размещен на &lt;a href=&quot;http://www.blogger.com/&quot;&gt;Blogger&#39;е&lt;/a&gt; то при первой попытке вставит картинку с помощью кнопки &lt;span class=&quot;item&quot;&gt;&quot;добавить изображения&quot;&lt;/span&gt; редактора сообщений, на сервисе Picasa автоматически будет создан частный альбом с именем блога и файлы картинок будут загружаться в этот альбом.&lt;/p&gt;

&lt;p&gt;После выбора альбома, сервис Picasa покажет форму для загрузки изображений. Пользователь за раз может загрузить пять файлов.&lt;/p&gt;

&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNXcgVSz1Vizbu4GHorISr27HuoLIpr9IKnUj97QylQgmHUJYYkAqDfPS88bzMjKf6m5cpSTrtoanjCXSosVTvmyInOG-jv37QO2vxy1lFRjownFGqSVKzZfjHdEelYlvG7W_SBTzPVgU/&quot;&gt;
&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjNXcgVSz1Vizbu4GHorISr27HuoLIpr9IKnUj97QylQgmHUJYYkAqDfPS88bzMjKf6m5cpSTrtoanjCXSosVTvmyInOG-jv37QO2vxy1lFRjownFGqSVKzZfjHdEelYlvG7W_SBTzPVgU/s400/photo_save.png&quot; border=&quot;0&quot;/&gt;
&lt;/a&gt;

&lt;p&gt;После того как файл изображение будет загружен, сервис выведет страницу просмотра содержания альбома. Кликаем на загруженном изображении, откроется страница просмотра изображения. Picasa, если изображение загруженное пользователем полностью не помещается на странице просмотра, автоматически создает миниатюру, которую и отображает на странице. Что бы для крупных изображений получить ссылку именно на исходное изображение необходимо один или несколько раз нажать на кнопку изменения масштаба справа от изображения.&lt;/p&gt;

&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiVcQaTN1mbKjA5NnZVmm4doizc23EgGoE3Lo8nOsTSEdN8SHrUm5rMXVSUYDrgmCtWFAxepO4kaVt7LX0j_WasrcGFouwzm8TsMsIF6eYDj2tOalfJSe0Liqzwj9Gt_U27X15WGJe1ORw/&quot;&gt;&lt;/img&gt;

&lt;p&gt;После того как кнопка изменения масштаба станет неактивной, кликаем правой кнопкой мыши на изображении. В всплывающем меню выбираем &lt;span class=&quot;item&quot;&gt;&quot;Copy Image Location&quot;&lt;/span&gt; (если у Вас браузер Firefox).&lt;/p&gt;

&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhKG7ApGZzLT_ERuv8mTgJLHVBAtVonuAPN7L4UFk0_Emid4vIVt24AsujkgAJHRcQYZ1e192H8HPdiDgSYKq-1T7l3NT0aTCJt9FpqbIsCmiQowwB0tMCIu4cPYtexmFOlH7JOfOFLEc4/&quot;&gt;
&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhKG7ApGZzLT_ERuv8mTgJLHVBAtVonuAPN7L4UFk0_Emid4vIVt24AsujkgAJHRcQYZ1e192H8HPdiDgSYKq-1T7l3NT0aTCJt9FpqbIsCmiQowwB0tMCIu4cPYtexmFOlH7JOfOFLEc4/s144/copy_image_location.png&quot; border=&quot;0&quot;/&gt;
&lt;/a&gt;

&lt;p&gt;Далее в html редакторе блога в нужном месте Вашего сообщения размещаем тег &lt;span class=&quot;code&quot;&gt;&amp;lt;img src=&quot;&quot;/&amp;gt;&lt;/span&gt;, устанавливаем курсор между двумя знаками кавычек и вставляем из буфера обмена ссылку на изображение.&lt;/p&gt;

&lt;pre class=&quot;codeblock&quot;&gt;
&lt;font color=&quot;#008080&quot;&gt;&amp;lt;&lt;/font&gt;&lt;font color=&quot;#804040&quot;&gt;&lt;b&gt;img&lt;/b&gt;&lt;/font&gt;&lt;font color=&quot;#008080&quot;&gt;&amp;nbsp;&lt;/font&gt;&lt;font color=&quot;#2e8b57&quot;&gt;&lt;b&gt;src&lt;/b&gt;&lt;/font&gt;&lt;font color=&quot;#008080&quot;&gt;=&lt;/font&gt;&lt;font color=&quot;#ff00ff&quot;&gt;&amp;quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhKG7ApGZzLT_ERuv8mTgJLHVBAtVonuAPN7L4UFk0_Emid4vIVt24AsujkgAJHRcQYZ1e192H8HPdiDgSYKq-1T7l3NT0aTCJt9FpqbIsCmiQowwB0tMCIu4cPYtexmFOlH7JOfOFLEc4/&amp;quot;&lt;/font&gt;&lt;font color=&quot;#008080&quot;&gt;/&amp;gt;&lt;/font&gt;
&lt;/pre&gt;

&lt;p&gt;Сохраняем сообщение. Вот собственно и все.&lt;/p&gt;

&lt;p&gt;Ну можно еще добавить, что в контекстном меню браузера Internet Explorer нет пункта &lt;span class=&quot;item&quot;&gt;&quot;Copy Image Location&quot;&lt;/span&gt;, но там есть пункт &lt;span class=&quot;item&quot;&gt;&quot;Property/Свойства&quot;&lt;/span&gt;. Кликаем правой кнопкой на картинке, выбираем пункт &lt;span class=&quot;item&quot;&gt;&quot;Property&quot;&lt;/span&gt;.&lt;/p&gt;

&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsDXDafblofBTLa4LR7gm0o5Sdm6koiFy_B9sYYTjs3tVanKfEpcH-TXhNSJLqBIG-cev5pLFE5FBRHh-Scxv6NXuT5DSeIlWsAS53Kv2PpCXCmDy6rAhAgEfbUcpKou1e1EMgY2btuas/&quot;&gt;
&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsDXDafblofBTLa4LR7gm0o5Sdm6koiFy_B9sYYTjs3tVanKfEpcH-TXhNSJLqBIG-cev5pLFE5FBRHh-Scxv6NXuT5DSeIlWsAS53Kv2PpCXCmDy6rAhAgEfbUcpKou1e1EMgY2btuas/s288/property.png&quot; border=&quot;0&quot;/&gt;
&lt;/a&gt;

&lt;p&gt;В появившемся окне копируем ссылку на изображение.&lt;/p&gt;

&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPvXou8fDlGHn1un23VOj9GKwFhEeDZEWaer7iAoeQJTPmyQ6NGKUm7hwfnz4Z6DfHq5ReJDrXmT_nEZ00o4bV69wwzBW1SR7k87-7CD36mjlSobm6gW0e48T5cwmPX313FV9RGA-2paE/&quot;&gt;
&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjPvXou8fDlGHn1un23VOj9GKwFhEeDZEWaer7iAoeQJTPmyQ6NGKUm7hwfnz4Z6DfHq5ReJDrXmT_nEZ00o4bV69wwzBW1SR7k87-7CD36mjlSobm6gW0e48T5cwmPX313FV9RGA-2paE/s288/copy_property.png&quot; border=&quot;0&quot;/&gt;
&lt;/a&gt;

&lt;p&gt;Далее поступаем как описано выше.&lt;/p&gt;

&lt;p&gt;Следующий пост по теме: &lt;a href=&quot;http://pyviy.blogspot.com/2009/08/blog-post_18.html&quot;&gt;Как вставить в блог фрагмент кода с подсветкой синтаксиса&lt;/a&gt;.&lt;/p&gt;

&lt;/span&gt;</description><link>http://pyviy.blogspot.com/2009/08/blog-post_14.html</link><author>noreply@blogger.com (Вий)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiTqvPXC-rHe4HYDzbnLQFOp94MScJbu952VuVdM99z9U3PKB7FdrZNCIlc5HGiwHBctNw7nVE3Cy6qrD0v-r5DAPHPeB3Vf9_FU1w-tRq9wusZrmSLCSfkTpUXiJMH5nQo7hKD04HFV0s/s72-c" height="72" width="72"/><thr:total>7</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-920988537392180762.post-5498919621304639045</guid><pubDate>Mon, 10 Aug 2009 13:45:00 +0000</pubDate><atom:updated>2009-09-04T17:55:25.686+06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">matplotlib</category><category domain="http://www.blogger.com/atom/ns#">Python</category><title>Пакет matplotlib. Строим банальный график</title><description>&lt;p&gt;Те кому хотя бы раз в жизни приходилось обучаться в техническом ВУЗ&#39;е строили такие графики штук по 5-10 в день. Банальный график это две пересекающиеся под прямым углом линии (координатные оси) на которые нанесены масштабные деления с числами. Линии снабжены подписями - что собственно эти числа обозначают. В плоскости образованной линиями, тем или иным способом (с помощью точек, кружков, треугольничков, крестиков и т.д.) помечаются некоторые значения. График снабжается легендой, чтобы можно было узнать чем кружки отличаются от крестиков и подписью, чтобы можно было узнать что и зачем построено. Вот именно такой график рисует нижеприведенный скрипт.&lt;/p&gt;

&lt;span class=&quot;fullpost&quot;&gt;

&lt;pre class=&quot;codeblock&quot;&gt;
&lt;font color=&quot;#0000ff&quot;&gt;# -*- coding: UTF-8 -*-&lt;/font&gt;

&lt;font color=&quot;#a020f0&quot;&gt;import&lt;/font&gt;&amp;nbsp;matplotlib.pyplot &lt;font color=&quot;#a020f0&quot;&gt;as&lt;/font&gt;&amp;nbsp;plt

&lt;font color=&quot;#0000ff&quot;&gt;# Значения по оси X&lt;/font&gt;

X = [20.0, 40.0, 60.0, 80.0, 100.0]

&lt;font color=&quot;#0000ff&quot;&gt;# Набор значений по оси Y&lt;/font&gt;

Y_10 = [0.97252, 0.94238, 0.89927, 0.85197, 0.79784]
Y_20 = [0.96864, 0.93518, 0.89113, 0.84344, 0.78934]
Y_30 = [0.96395, 0.92770, 0.88278, 0.83473, 0.78075]

&lt;font color=&quot;#0000ff&quot;&gt;# Строим диаграмму&lt;/font&gt;

&lt;font color=&quot;#0000ff&quot;&gt;# Задаем исходные данные для каждой линии диаграммы, внешний вид линий и маркеров.&lt;/font&gt;
&lt;font color=&quot;#0000ff&quot;&gt;# Функция plot() возвращает кортеж ссылок на объекты класса matplotlib.lines.Line2D&lt;/font&gt;

line_10, line_20, line_30 = plt.plot(X, Y_10, &#39;&lt;font color=&quot;#ff00ff&quot;&gt;bD:&lt;/font&gt;&#39;, X, Y_20, &#39;&lt;font color=&quot;#ff00ff&quot;&gt;r^:&lt;/font&gt;&#39;, X, Y_30, &#39;&lt;font color=&quot;#ff00ff&quot;&gt;go:&lt;/font&gt;&#39;)

&lt;font color=&quot;#0000ff&quot;&gt;# Задаем интервалы значений по осям X и Y&lt;/font&gt;

plt.axis([15.0, 105.0, 0.75, 1.0])

&lt;font color=&quot;#0000ff&quot;&gt;# Задаем заголовок диаграммы&lt;/font&gt;

plt.title(u&#39;&lt;font color=&quot;#ff00ff&quot;&gt;Зависимость плотности водных растворов этилового спирта от температуры&lt;/font&gt;&#39;)

&lt;font color=&quot;#0000ff&quot;&gt;# Задаем подписи к осям X и Y&lt;/font&gt;

plt.xlabel(u&#39;&lt;font color=&quot;#ff00ff&quot;&gt;Массовая доля этилового спирта, %&lt;/font&gt;&#39;)
plt.ylabel(u&#39;&lt;font color=&quot;#ff00ff&quot;&gt;Плотность, г/мл&lt;/font&gt;&#39;)

&lt;font color=&quot;#0000ff&quot;&gt;# Задаем исходные данные для легенды и ее размещение&lt;/font&gt;

plt.legend( (line_10, line_20, line_30), (u&#39;&lt;font color=&quot;#ff00ff&quot;&gt;Температура 10 &lt;/font&gt;&lt;font color=&quot;#6a5acd&quot;&gt;\u00b0&lt;/font&gt;&lt;font color=&quot;#ff00ff&quot;&gt;C&lt;/font&gt;&#39;, u&#39;&lt;font color=&quot;#ff00ff&quot;&gt;Температура 20 &lt;/font&gt;&lt;font color=&quot;#6a5acd&quot;&gt;\u00b0&lt;/font&gt;&lt;font color=&quot;#ff00ff&quot;&gt;C&lt;/font&gt;&#39;, u&#39;&lt;font color=&quot;#ff00ff&quot;&gt;Температура 30 &lt;/font&gt;&lt;font color=&quot;#6a5acd&quot;&gt;\u00b0&lt;/font&gt;&lt;font color=&quot;#ff00ff&quot;&gt;C&lt;/font&gt;&#39;), loc = &#39;&lt;font color=&quot;#ff00ff&quot;&gt;best&lt;/font&gt;&#39;)

&lt;font color=&quot;#0000ff&quot;&gt;# Включаем сетку&lt;/font&gt;

plt.grid()

&lt;font color=&quot;#0000ff&quot;&gt;# Сохраняем построенную диаграмму в файл&lt;/font&gt;

&lt;font color=&quot;#0000ff&quot;&gt;# Задаем имя файла и его тип&lt;/font&gt;

plt.savefig(&#39;&lt;font color=&quot;#ff00ff&quot;&gt;spirit.png&lt;/font&gt;&#39;, format = &#39;&lt;font color=&quot;#ff00ff&quot;&gt;png&lt;/font&gt;&#39;)
&lt;/pre&gt;

&lt;p&gt;В результате выполнения скрипта файл &lt;span class=&quot;code&quot;&gt;spirit.png&lt;/span&gt; должен содержать такое изображение.&lt;/p&gt;

&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQ5fCLg0NO7BDq9C8Js46KPfmradiBTYAJrmasa01X7-5998iyFX1WVnBKK2MU7z-35iGjGYwAjYW5fjyNObvzAGoZj9C1ud688gwnO7Jv0gDNeY8qjmH2-zZaXIZ6unQJSKaMyUGIocA/&quot;&gt;
&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQ5fCLg0NO7BDq9C8Js46KPfmradiBTYAJrmasa01X7-5998iyFX1WVnBKK2MU7z-35iGjGYwAjYW5fjyNObvzAGoZj9C1ud688gwnO7Jv0gDNeY8qjmH2-zZaXIZ6unQJSKaMyUGIocA/s400/spirit.png&quot; alt=&quot;Matplotlib. Незамысловатый график&quot; border=&quot;0&quot;/&gt;
&lt;/a&gt;

&lt;p&gt;Комментарии к коду.&lt;/p&gt;

&lt;p&gt;Функция &lt;span class=&quot;code&quot;&gt;plot()&lt;/span&gt; строит 2D диаграмму - задает исходные данные и внешний вид линии (линий) диаграммы. Функция принимает произвольное число наборов аргументов вида &lt;span class=&quot;code&quot;&gt;X_set&lt;/span&gt;, &lt;span class=&quot;code&quot;&gt;Y_set&lt;/span&gt;, &lt;span class=&quot;code&quot;&gt;format_string&lt;/span&gt;. Где &lt;span class=&quot;code&quot;&gt;X_set&lt;/span&gt; и &lt;span class=&quot;code&quot;&gt;Y_set&lt;/span&gt; типа &lt;span class=&quot;code&quot;&gt;list&lt;/span&gt; или &lt;span class=&quot;code&quot;&gt;numpy.array&lt;/span&gt; - значения откладываемые по осям X и Y соответственно, &lt;span class=&quot;code&quot;&gt;format_string&lt;/span&gt; - строка форматирования (не обязательный аргумент набора), определяет стиль и цвет линии. Строка форматирования (позаимствована из системы Matlab) включает (в произвольном порядке) три подстроки определяющих стиль линии, стиль маркера, цвет. Например &lt;span class=&quot;code&quot;&gt;&#39;g^:&#39; = &#39;g&#39; + &#39;^&#39; + &#39;:&#39;&lt;/span&gt; - цвет зеленый, маркер треугольник вершиной вверх, линия состоит из точек.&lt;/p&gt;

&lt;p&gt;Ниже в таблицах приведены возможные значения для каждой из подстрок строки форматирования, а на рисунках представлены результаты их применения.&lt;/p&gt;

&lt;h3&gt;Стили линий&lt;/h3&gt;

&lt;br/&gt;

&lt;table class=&quot;my&quot;&gt;

&lt;tbody&gt;

&lt;tr&gt;
&lt;th class=&quot;my&quot;&gt;Символ&lt;/th&gt;
&lt;th class=&quot;my&quot; colspan=&quot;2&quot;&gt;Описание&lt;/th&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class=&quot;my&quot;&gt;&#39;-&#39;&lt;/td&gt;
&lt;td class=&quot;my&quot; width=&quot;35%&quot;&gt;solid line style&lt;/td&gt;
&lt;td class=&quot;my&quot; width=&quot;35%&quot;&gt;непрерывная линия&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class=&quot;my&quot;&gt;&#39;--&#39;&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;dashed line style&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;линия из штрихов&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class=&quot;my&quot;&gt;&#39;-.&#39;&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;dash-dot line style&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;чередование штрихов и точек&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class=&quot;my&quot;&gt;&#39;:&#39;&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;dotted line style&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;линия из точек&lt;/td&gt;
&lt;/tr&gt;

&lt;/tbody&gt;

&lt;/table&gt;

&lt;br/&gt;

&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJW5l-t3VqwAjHUebOcXmgxQxr9bYf1v9oMTeKZPYBniiZBBmLp3pDK3aaeVtCsLny7i4ugzBlaahBB4QKjbbtW5G0kbHgIBvEvFDNGeiVI5F2MkKr8UPx8MPcWRTgVeHVQIX5FbAMwvw/&quot;&gt;
&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjJW5l-t3VqwAjHUebOcXmgxQxr9bYf1v9oMTeKZPYBniiZBBmLp3pDK3aaeVtCsLny7i4ugzBlaahBB4QKjbbtW5G0kbHgIBvEvFDNGeiVI5F2MkKr8UPx8MPcWRTgVeHVQIX5FbAMwvw/s400/line_style.png&quot; alt=&quot;Matplotlib. Стили линий&quot; border=&quot;0&quot;/&gt;
&lt;/a&gt;

&lt;br/&gt;

&lt;h3&gt;Стили маркеров&lt;/h3&gt;

&lt;br/&gt;

&lt;p&gt;Я умышленно не стал переводить названия маркеров из документации, дабы не придумывать как по русски выразить различия между &lt;span class=&quot;code&quot;&gt;point marker&lt;/span&gt; и &lt;span class=&quot;code&quot;&gt;pixel marker&lt;/span&gt; или как обозвать &lt;span class=&quot;code&quot;&gt;tri_right marker&lt;/span&gt; с &lt;span class=&quot;code&quot;&gt;thin_diamond marker&lt;/span&gt;.&lt;/p&gt;

&lt;table class=&quot;my&quot;&gt;

&lt;tbody&gt;

&lt;tr&gt;
&lt;th class=&quot;my&quot; width=&quot;30%&quot;&gt;Символ&lt;/th&gt;
&lt;th class=&quot;my&quot;&gt;Описание&lt;/th&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class=&quot;my&quot;&gt;&#39;.&#39;&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;point marker&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class=&quot;my&quot;&gt;&#39;,&#39;&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;pixel marker&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class=&quot;my&quot;&gt;&#39;o&#39;&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;circle marker&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class=&quot;my&quot;&gt;&#39;v&#39;&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;triangle_down marker&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class=&quot;my&quot;&gt;&#39;^&#39;&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;triangle_up marker&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class=&quot;my&quot;&gt;&#39;&amp;lt;&#39;&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;triangle_left marker&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class=&quot;my&quot;&gt;&#39;&amp;gt;&#39;&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;triangle_right marker&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class=&quot;my&quot;&gt;&#39;1&#39;&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;tri_down marker&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class=&quot;my&quot;&gt;&#39;2&#39;&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;tri_up marker&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class=&quot;my&quot;&gt;&#39;3&#39;&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;tri_left marker&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class=&quot;my&quot;&gt;&#39;4&#39;&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;tri_right marker&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class=&quot;my&quot;&gt;&#39;s&#39;&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;square marker&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class=&quot;my&quot;&gt;&#39;p&#39;&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;pentagon marker&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class=&quot;my&quot;&gt;&#39;*&#39;&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;star marker&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class=&quot;my&quot;&gt;&#39;h&#39;&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;hexagon1 marker&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class=&quot;my&quot;&gt;&#39;H&#39;&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;hexagon2 marker&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class=&quot;my&quot;&gt;&#39;+&#39;&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;plus marker&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class=&quot;my&quot;&gt;&#39;x&#39;&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;x marker&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class=&quot;my&quot;&gt;&#39;D&#39;&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;diamond marker&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class=&quot;my&quot;&gt;&#39;d&#39;&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;thin_diamond marker&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class=&quot;my&quot;&gt;&#39;|&#39;&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;vline marker&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class=&quot;my&quot;&gt;&#39;_&#39;&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;hline marker&lt;/td&gt;
&lt;/tr&gt;

&lt;/tbody&gt;

&lt;/table&gt;

&lt;br/&gt;

&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNrbzteswY18z6LI87ZCxNAfzyNEmc4rtgt5N3xOQR7KqNUsRKIEhkCdoeBlw9WmDxPUQq_8PUHBFlUviIX60L5Daqfa_2jKhZZO88bEu3WLeFWcU12A7wCE4TVBz03jlGrQjMaZtR2C8/&quot;&gt;
&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgNrbzteswY18z6LI87ZCxNAfzyNEmc4rtgt5N3xOQR7KqNUsRKIEhkCdoeBlw9WmDxPUQq_8PUHBFlUviIX60L5Daqfa_2jKhZZO88bEu3WLeFWcU12A7wCE4TVBz03jlGrQjMaZtR2C8/s400/marker_style.png&quot; alt=&quot;Matplotlib. Стили маркеров&quot; border=&quot;0&quot;/&gt;
&lt;/a&gt;

&lt;br/&gt;

&lt;h3&gt;Цвета&lt;/h3&gt;

&lt;br/&gt;

&lt;table class=&quot;my&quot;&gt;

&lt;tbody&gt;

&lt;tr&gt;
&lt;th class=&quot;my&quot; width=&quot;30%&quot;&gt;Символ&lt;/th&gt;
&lt;th class=&quot;my&quot; colspan=&quot;2&quot;&gt;Цвет&lt;/th&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class=&quot;my&quot;&gt;&#39;b&#39;&lt;/td&gt;
&lt;td class=&quot;my&quot; width=&quot;35%&quot;&gt;blue&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;синий&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class=&quot;my&quot;&gt;&#39;g&#39;&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;green&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;зеленый&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class=&quot;my&quot;&gt;&#39;r&#39;&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;red&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;красный&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class=&quot;my&quot;&gt;&#39;c&#39;&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;cyan&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;бирюзовый&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class=&quot;my&quot;&gt;&#39;m&#39;&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;magenta&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;пурпурный&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class=&quot;my&quot;&gt;&#39;y&#39;&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;yellow&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;желтый&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class=&quot;my&quot;&gt;&#39;k&#39;&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;black&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;черный&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class=&quot;my&quot;&gt;&#39;w&#39;&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;white&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;белый&lt;/td&gt;
&lt;/tr&gt;

&lt;/tbody&gt;

&lt;/table&gt;

&lt;br/&gt;

&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYEv-t-Txb6qzqOEr_08hQNBpCsQjZ5EVX-tdSVnq2ThREsFfFm4VIOcwWIh_fhJDUEOA8cfV3dy_U38ggoOvlTXyebhodKaESyI0cLEDXX3-Cc6RsruX9v8H5CcMO8QQsU7-7xNOlMPQ/&quot;&gt;
&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYEv-t-Txb6qzqOEr_08hQNBpCsQjZ5EVX-tdSVnq2ThREsFfFm4VIOcwWIh_fhJDUEOA8cfV3dy_U38ggoOvlTXyebhodKaESyI0cLEDXX3-Cc6RsruX9v8H5CcMO8QQsU7-7xNOlMPQ/s400/line_color.png&quot; alt=&quot;Matplotlib. Цвета&quot; border=&quot;0&quot;/&gt;
&lt;/a&gt;

&lt;p&gt;Функция &lt;span class=&quot;code&quot;&gt;plot()&lt;/span&gt; возвращает кортеж ссылок на объекты класса &lt;span class=&quot;code&quot;&gt;matplotlib.lines.Line2D&lt;/span&gt;. Каждый из объектов кортежа представляет линию на диаграмме. Посредством методов объектов можно менять свойства (внешний вид) любой из линий. В нашем случае кортеж ссылок в дальнейшем передается функции &lt;span class=&quot;code&quot;&gt;legend()&lt;/span&gt;.&lt;/p&gt;

&lt;p&gt;Функция &lt;span class=&quot;code&quot;&gt;axis()&lt;/span&gt; задает свойства осей диаграммы. В частности с её помощью можно установит масштаб осей. Для этого функции необходимо передать одни аргумент - список из четырех значений. Функция рассматривает такой список как &lt;span class=&quot;code&quot;&gt;[x_min, x_max, y_min, y_max]&lt;/span&gt;, где &lt;span class=&quot;code&quot;&gt;x_min&lt;/span&gt;, &lt;span class=&quot;code&quot;&gt;y_min&lt;/span&gt; минимальные, &lt;span class=&quot;code&quot;&gt;x_max&lt;/span&gt;, &lt;span class=&quot;code&quot;&gt;y_max&lt;/span&gt; максимальные значения откладываемые по осям X и Y соответственно.&lt;/p&gt;

&lt;p&gt;Функция может принимать в качестве одного аргумента и строку. Возможные значения такого аргумента и оказываемые ими действия представлены в таблице.&lt;/p&gt;

&lt;table class=&quot;my&quot;&gt;

&lt;tbody&gt;

&lt;tr&gt;
&lt;th class=&quot;my&quot; width=&quot;30%&quot;&gt;Аргумент&lt;/th&gt;
&lt;th class=&quot;my&quot;&gt;Действие&lt;/th&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class=&quot;my&quot;&gt;&#39;off&#39;&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;Выключает отображение осей (вместе с подписями)&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class=&quot;my&quot;&gt;&#39;equal&#39;&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;Изменяет масштаб по осям так, чтобы равному изменению x или y соответсвовала одинаковая длинна на диаграмме. Как сказано в документации &quot;круг превращается в круг&quot;.&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class=&quot;my&quot;&gt;&#39;scaled&#39;&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;Тот же эффект, что у &#39;equal&#39; достигается изменением соотношения сторон диаграммы.&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class=&quot;my&quot;&gt;&#39;tight&#39;&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;Масштаб по осям изменяется так, что бы отображались все данные. Если все данные уже находятся в поле диаграммы, масштаб изменяется так, чтобы линии располагались в центре диаграммы.&lt;/td&gt;
&lt;/tr&gt;

&lt;/tbody&gt;

&lt;/table&gt;

&lt;p&gt;Функция &lt;span class=&quot;code&quot;&gt;legend()&lt;/span&gt; задает свойства и расположения легенды диаграммы. В примере использован вызов функции принимающий в качестве первых двух аргументов кортежи - первый содержит ссылки на объекты типа Line2D, второй соответствующие им подписи. Именованный аргумент &lt;span class=&quot;code&quot;&gt;loc&lt;/span&gt; задает расположение легенды, может быть или строкой или числом. Возможные варианты значений аргумента &lt;span class=&quot;code&quot;&gt;loc&lt;/span&gt; представлены в таблице.&lt;/p&gt;

&lt;table class=&quot;my&quot;&gt;

&lt;tbody&gt;

&lt;tr&gt;
&lt;th class=&quot;my&quot; colspan=&quot;2&quot;&gt;Значения аргумента loc&lt;/th&gt;
&lt;th class=&quot;my&quot; rowspan=&quot;2&quot;&gt;Расположение легенды&lt;/th&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;th class=&quot;my&quot; width=&quot;15%&quot;&gt;Строка&lt;/th&gt;
&lt;th class=&quot;my&quot; width=&quot;15%&quot;&gt;Число&lt;/th&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class=&quot;my&quot;&gt;&#39;best&#39;&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;0&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;Оптимальное расположение легенды определяется автоматически. Значение по умолчанию.&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class=&quot;my&quot;&gt;&#39;upper right&#39;&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;1&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;сверху справа&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class=&quot;my&quot;&gt;&#39;upper left&#39;&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;2&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;сверху слева&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class=&quot;my&quot;&gt;&#39;lower left&#39;&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;3&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;снизу слева&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class=&quot;my&quot;&gt;&#39;lower right&#39;&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;4&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;снизу справа&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class=&quot;my&quot;&gt;&#39;right&#39;&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;5&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;справа&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class=&quot;my&quot;&gt;&#39;center left&#39;&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;6&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;в центре слева&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class=&quot;my&quot;&gt;&#39;center right&#39;&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;7&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;в центре справа, не отличается от &#39;right&#39;&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class=&quot;my&quot;&gt;&#39;lower center&#39;&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;8&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;в сентер снизу&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class=&quot;my&quot;&gt;&#39;upper center&#39;&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;9&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;в центре сверху&lt;/td&gt;
&lt;/tr&gt;

&lt;tr&gt;
&lt;td class=&quot;my&quot;&gt;&#39;center&#39;&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;10&lt;/td&gt;
&lt;td class=&quot;my&quot;&gt;в центре диаграммы&lt;/td&gt;
&lt;/tr&gt;

&lt;/tbody&gt;

&lt;/table&gt;

&lt;p&gt;Сформировать легенду можно и другим (на мой взгляд менее громоздким) способом. Функция &lt;span class=&quot;code&quot;&gt;plot()&lt;/span&gt; (если задано построение только одной линии) принимает именованный аргумент &lt;span class=&quot;code&quot;&gt;label&lt;/span&gt;. Это строка, подпись к линии, на основании которой вызов функции &lt;span class=&quot;code&quot;&gt;legend()&lt;/span&gt; без аргументов добавляет к диаграмме легенду. Вышеприведенный скрипт мог быть написан и так:&lt;/p&gt;

&lt;pre class=&quot;codeblock&quot;&gt;
&lt;font color=&quot;#0000ff&quot;&gt;# Строим диаграмму&lt;/font&gt;

&lt;font color=&quot;#0000ff&quot;&gt;# Задаем исходные данные для каждой линии диаграммы, внешний вид линий и маркеров, подписи.&lt;/font&gt;

plt.plot(X, Y_10, &#39;&lt;font color=&quot;#ff00ff&quot;&gt;bD:&lt;/font&gt;&#39;,&amp;nbsp;&amp;nbsp;label = u&#39;&lt;font color=&quot;#ff00ff&quot;&gt;Температура 10 &lt;/font&gt;&lt;font color=&quot;#6a5acd&quot;&gt;\u00b0&lt;/font&gt;&lt;font color=&quot;#ff00ff&quot;&gt;C&lt;/font&gt;&#39;)
plt.plot(X, Y_20, &#39;&lt;font color=&quot;#ff00ff&quot;&gt;r^:&lt;/font&gt;&#39;,&amp;nbsp;&amp;nbsp;label = u&#39;&lt;font color=&quot;#ff00ff&quot;&gt;Температура 20 &lt;/font&gt;&lt;font color=&quot;#6a5acd&quot;&gt;\u00b0&lt;/font&gt;&lt;font color=&quot;#ff00ff&quot;&gt;C&lt;/font&gt;&#39;)
plt.plot(X, Y_30, &#39;&lt;font color=&quot;#ff00ff&quot;&gt;go:&lt;/font&gt;&#39;,&amp;nbsp;&amp;nbsp;label = u&#39;&lt;font color=&quot;#ff00ff&quot;&gt;Температура 30 &lt;/font&gt;&lt;font color=&quot;#6a5acd&quot;&gt;\u00b0&lt;/font&gt;&lt;font color=&quot;#ff00ff&quot;&gt;C&lt;/font&gt;&#39;)

&lt;font color=&quot;#0000ff&quot;&gt;# Добавляем к диаграмме легенду&lt;/font&gt;

plt.legend(loc = &#39;&lt;font color=&quot;#ff00ff&quot;&gt;best&lt;/font&gt;&#39;)
&lt;/pre&gt;

&lt;p&gt;Функция &lt;span class=&quot;code&quot;&gt;grid()&lt;/span&gt; строит сетку координатных осей.&lt;p&gt;

&lt;p&gt;Функция &lt;span class=&quot;code&quot;&gt;savefig()&lt;/span&gt; сохраняет диаграмму в файл. Первый аргумент - строка, путь к файлу. Именованный аргумент &lt;span class=&quot;code&quot;&gt;format&lt;/span&gt; - строка, задает формат файла, может принимать значения &lt;span class=&quot;code&quot;&gt;&#39;png&#39;&lt;/span&gt;, &lt;span class=&quot;code&quot;&gt;&#39;pdf&#39;&lt;/span&gt;, &lt;span class=&quot;code&quot;&gt;&#39;ps&#39;&lt;/span&gt;, &lt;span class=&quot;code&quot;&gt;&#39;eps&#39;&lt;/span&gt;, &lt;span class=&quot;code&quot;&gt;&#39;svg&#39;&lt;/span&gt;.&lt;/p&gt;

&lt;p&gt;Здесь необходимо сказать пару слов о размерах и разрешении получающихся изображений диаграмм. В файле matplotlibrc можно задать два свойства &lt;span class=&quot;code&quot;&gt;figure.figsize&lt;/span&gt; и &lt;span class=&quot;code&quot;&gt;figure.dpi&lt;/span&gt; (свойства можно задать, разумеется и через структуру &lt;span class=&quot;code&quot;&gt;rcParams&lt;/span&gt;, смотри &lt;a href=&quot;http://pyviy.blogspot.com/2009/06/matplotlib.html&quot;&gt;предыдущий пост&lt;/a&gt;).&lt;/p&gt; Первое определяет размер диаграммы в дюймах, второе разрешение в точках на дюйм. Меняя указанные свойства, можно добиться требуемого размера и соотношения сторон диаграммы.&lt;/p&gt;

&lt;p&gt;В заключении отмечу, что здесь описаны далеко не все способы настройки внешнего вида элементов диаграммы. Наведение всяких красивостей тема для отдельного разговора.&lt;/p&gt;

&lt;p&gt;Предыдущий пост по теме: &lt;a href=&quot;http://pyviy.blogspot.com/2009/06/matplotlib.html&quot;&gt;Пакет matplotlib. Установка, проверка, настройка&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Следующий пост по теме: &lt;a href=&quot;http://pyviy.blogspot.com/2009/08/matplotlib_21.html&quot;&gt;Пакет matplotlib. График с дополнительной осью ординат&lt;/a&gt;.&lt;/p&gt;

&lt;/span&gt;</description><link>http://pyviy.blogspot.com/2009/08/matplotlib.html</link><author>noreply@blogger.com (Вий)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgQ5fCLg0NO7BDq9C8Js46KPfmradiBTYAJrmasa01X7-5998iyFX1WVnBKK2MU7z-35iGjGYwAjYW5fjyNObvzAGoZj9C1ud688gwnO7Jv0gDNeY8qjmH2-zZaXIZ6unQJSKaMyUGIocA/s72-c/spirit.png" height="72" width="72"/><thr:total>2</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-920988537392180762.post-4606506731021853594</guid><pubDate>Sun, 09 Aug 2009 09:30:00 +0000</pubDate><atom:updated>2009-09-04T18:26:06.892+06:00</atom:updated><category domain="http://www.blogger.com/atom/ns#">matplotlib</category><category domain="http://www.blogger.com/atom/ns#">Python</category><title>Пакет matplotlib. Установка, проверка, настройка</title><description>&lt;h3&gt;Введение&lt;/h3&gt;

&lt;p&gt;&lt;b&gt;matplotlib&lt;/b&gt; - набор дополнительных модулей (библиотек) языка Python. Предоставляет средства для построения самых разнообразных 2D графиков и диаграмм данных. Достоинства. Отличается простотой использования - для построения весьма мудреных и красочно оформленных диаграмм достаточно нескольких строк кода. При этот качество получаемых изображений более чем достаточно для их публикования. Один из выходных формата файлов - Postscript, что, соответственно, позволяет вставлять изображения в документы TeX. Предоставляет API для встраивания своих графических объектов в приложения пользователя.&lt;/p&gt;

&lt;span class=&quot;fullpost&quot;&gt;

&lt;h3&gt;Установка&lt;/h3&gt;

&lt;p&gt;Официальный сайт проекта &lt;a href=&quot;http://matplotlib.sourceforge.net/&quot;&gt;matplotlib&lt;/a&gt;. Дистрибутив для Windows можно заполучить на &lt;a href=&quot;http://sourceforge.net/project/showfiles.php?group_id=80706&quot;&gt;Sourceforge&lt;/a&gt;. Текущая версия 0.99.0, выпущена 06 августа 2009.&lt;/p&gt;

&lt;p&gt;Для установки необходим, разумеется, сам &lt;a href=&quot;http://www.python.org/&quot;&gt;Python&lt;/a&gt; и модуль &lt;a href=&quot;http://numpy.scipy.org/&quot;&gt;NumPy&lt;/a&gt;. NumPy предоставляет методы для работы с огромными многомерными массивами. Дистрибутив для Windows так же можно взять на &lt;a href=&quot;http://sourceforge.net/project/showfiles.php?group_id=1369&amp;amp;package_id=175103&quot;&gt;Sourceforge&lt;/a&gt;. Текущая версия 1.3.0 от 05 апреля 2009.&lt;/p&gt;

&lt;p&gt;В Windows установка и matplotlib и NumPy не должна вызвать ни каких проблем. Скачиваем и запускаем файл дистрибутива.&lt;/p&gt;

&lt;h3&gt;Проверка&lt;/h3&gt;

&lt;p&gt;После установки проверяем работоспособность. Запускаем консоль Python, вводим:&lt;/p&gt;

&lt;pre class=&quot;codeblock&quot;&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;import matplotlib.pyplot as plt&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;plt.plot([1,2,3])&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;[&amp;lt;matplotlib.lines.Line2D object at 0x0301E810&amp;gt;]&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;plt.title(&#39;Прямая линия&#39;)&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;&amp;lt;matplotlib.text.Text object at 0x03062430&amp;gt;&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;plt.show()&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;В результате должно появиться вот такое окно диаграммы:&lt;/p&gt;

&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJV6iOvjv8BDjUVAF81P0Ze2wGcb4F9jW4EBt4Y6qiaTqAe4ODOiKHAGXKt5Ie6BrE0OFWMlX0qYN2TeVssxvps1TyhP5efV9FJ_urbWxOwy1Dvaq1_uiCZox9KsRuED9QqD_1bfiRdO4/&quot;&gt;
&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJV6iOvjv8BDjUVAF81P0Ze2wGcb4F9jW4EBt4Y6qiaTqAe4ODOiKHAGXKt5Ie6BrE0OFWMlX0qYN2TeVssxvps1TyhP5efV9FJ_urbWxOwy1Dvaq1_uiCZox9KsRuED9QqD_1bfiRdO4/s400/mpl_01.png&quot; alt=&quot;Matplotlib. Пример окна диаграммы&quot; border=&quot;0&quot;/&gt;
&lt;/a&gt;

&lt;p&gt;Что было сделано? Из пакета &lt;span class=&quot;code&quot;&gt;matplotlib&lt;/span&gt; импортирован модуль &lt;span class=&quot;code&quot;&gt;pyplot&lt;/span&gt; под именем &lt;span class=&quot;code&quot;&gt;plt&lt;/span&gt;. Модуль &lt;span class=&quot;code&quot;&gt;pyplot&lt;/span&gt; содержит функции (похожие на команды) создания диаграмм и изменения свойств их элементов. Функция &lt;span class=&quot;code&quot;&gt;plot()&lt;/span&gt; строит прямоугольные двумерные диаграммы (графики) в координатах X - Y. Если функции &lt;span class=&quot;code&quot;&gt;plot&lt;/span&gt; передан один аргумент (в нашем случае - список &lt;span class=&quot;code&quot;&gt;[1,2,3]&lt;/span&gt;), она рассматривает его как совокупность значений откладываемых по оси Y, тогда по оси X ему будет соответствовать  автоматически сгенерированный набор чисел &lt;span class=&quot;code&quot;&gt;0,1,2...N - 1&lt;/span&gt;, где &lt;span class=&quot;code&quot;&gt;N&lt;/span&gt; - число элементов в переданном списке. Функция &lt;span class=&quot;code&quot;&gt;title()&lt;/span&gt; задает заголовок диаграммы, а функция &lt;span class=&quot;code&quot;&gt;show()&lt;/span&gt; выводит интерактивное окно диаграммы. В общем все очень просто. Вот только вместо заголовка диаграммы &lt;span class=&quot;code&quot;&gt;&quot;Прямая линия&quot;&lt;/span&gt; 11 прямоугольников, не настроенный matplotlib не может найти шрифты с кириллическими символами.&lt;/p&gt;

&lt;h3&gt;Настройка&lt;/h3&gt;

&lt;p&gt;Пакет matplotlib можно легко настроить через конфигурационный файл &lt;span class=&quot;console&quot;&gt;matplotlibrc&lt;/span&gt;. Если Python установлен в папку &lt;span class=&quot;console&quot;&gt;C:\Python26\&lt;/span&gt; файл &lt;span class=&quot;console&quot;&gt;matplotlibrc&lt;/span&gt; находится в папке:
&lt;span class=&quot;console&quot;&gt;C:\Python26\Lib\site-packages\matplotlib\mpl-data\&lt;/span&gt;.
Вносить изменения можно прямо здесь, но лучше скопировать файл в папку пользователя:
&lt;span class=&quot;console&quot;&gt;C:\Documents and Settings\UserName\.matplotlib\&lt;/span&gt;,
иначе при переустановке пакета конфигурационный файл будет перезаписан.
Параметры пакета задаются в файле в виде пар &lt;span class=&quot;code&quot;&gt;свойство : значение&lt;/span&gt;, символ &lt;span class=&quot;code&quot;&gt;#&lt;/span&gt; отделяет комментарий. Свойство &lt;span class=&quot;code&quot;&gt;font.family&lt;/span&gt; определяет тип активного шрифта по умолчанию, может принимать пять значений: &lt;span class=&quot;code&quot;&gt;serif&lt;/span&gt;, &lt;span class=&quot;code&quot;&gt;sans-serif&lt;/span&gt;, &lt;span class=&quot;code&quot;&gt;cursive&lt;/span&gt;, &lt;span class=&quot;code&quot;&gt;fantasy&lt;/span&gt;, &lt;span class=&quot;code&quot;&gt;monospace&lt;/span&gt;. В свою очередь свойства &lt;span class=&quot;code&quot;&gt;font.serif&lt;/span&gt;, &lt;span class=&quot;code&quot;&gt;font.sans-serif&lt;/span&gt;, &lt;span class=&quot;code&quot;&gt;font.cursive&lt;/span&gt;, &lt;span class=&quot;code&quot;&gt;font.fantasy&lt;/span&gt;, &lt;span class=&quot;code&quot;&gt;font.monospace&lt;/span&gt; содержат списки имен шрифтов (через запятую, в порядке уменьшения приоритета) соответствующих каждому типу. Для &quot;русификации&quot; matplotlib необходимо изменить имена шрифтов в списке, на  имена доступных в системе шрифтов, содержащих кириллические символы. Например так:&lt;/p&gt;

&lt;pre class=&quot;codeblock&quot;&gt;
font.serif : Verdana, Arial
font.sans-serif : Tahoma, Arial
font.cursive : Courier New, Arial
font.fantasy : Comic Sans MS, Arial
font.monospace : Arial
&lt;/pre&gt;

&lt;p&gt;Для корректного отображения кириллических символов так же необходимо внести небольшие изменения в код программы. Все строки, содержащие символы национальных алфавитов должны быть типа &lt;span class=&quot;code&quot;&gt;unicode&lt;/span&gt;. Тип строкового литерала необходимо указать явно.&lt;/p&gt;

&lt;pre class=&quot;codeblock&quot;&gt;
plt.title(u&#39;&lt;font color=&quot;#ff00ff&quot;&gt;Прямая линия&lt;/font&gt;&#39;)
&lt;/pre&gt;

&lt;p&gt;В случае скрипта исходный файл должен быть в кодировке &lt;span class=&quot;code&quot;&gt;UTF-8&lt;/span&gt;. Кодировку файла так же следует указать явно. Для этого в первых строках программы пишем:&lt;/p&gt;

&lt;pre class=&quot;codeblock&quot;&gt;
&lt;span class=&quot;code&quot;&gt;# -*- coding: UTF-8 -*-&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;Вносим изменения в файл &lt;span class=&quot;console&quot;&gt;matplotlibrc&lt;/span&gt;, повторяем ввод в консоле Python:&lt;/p&gt;

&lt;pre class=&quot;codeblock&quot;&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;import matplotlib.pyplot as plt&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;plt.plot([1,2,3])&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;[&amp;lt;matplotlib.lines.Line2D object at 0x02F118F0&amp;gt;]&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;plt.title(u&#39;Прямая линия&#39;)&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;&amp;lt;matplotlib.text.Text object at 0x02F59510&amp;gt;&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;plt.xlabel(u&#39;Значения по оси X&#39;)&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;&amp;lt;matplotlib.text.Text object at 0x02F1BBF0&amp;gt;&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;plt.ylabel(u&#39;Значения по оси Y&#39;)&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;&amp;lt;matplotlib.text.Text object at 0x02F44D10&amp;gt;&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;plt.show()&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;Ну вот теперь подписи диаграммы отображаются корректно:&lt;/p&gt;


&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbZDQ0AB2-v5SsN-KMbzpOO0GX5FRLg1TwtXMjUaRCm-4Ineqb-0yBL3C0xpKhYkbStgSiyMXg3Quo_8S4KhYm-wnAczSmnbEr1TFlYPPDU0LNel0gXoYOHWb7OXeyZOMFl2BWqCzlZoc/&quot;&gt;
&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgbZDQ0AB2-v5SsN-KMbzpOO0GX5FRLg1TwtXMjUaRCm-4Ineqb-0yBL3C0xpKhYkbStgSiyMXg3Quo_8S4KhYm-wnAczSmnbEr1TFlYPPDU0LNel0gXoYOHWb7OXeyZOMFl2BWqCzlZoc/s400/mpl_02.png&quot; alt=&quot;Matplotlib. Пример окна диаграммы&quot; border=&quot;0&quot;/&gt;
&lt;/a&gt;

&lt;p&gt;Функции &lt;span class=&quot;code&quot;&gt;pyplot.xlabel()&lt;/span&gt;, &lt;span class=&quot;code&quot;&gt;pyplot.ylabel()&lt;/span&gt;, как легко догадаться по названию, устанавливают подписи к осям X и Y соответственно.&lt;/p&gt;

&lt;p&gt;Пакет matplotlib можно настраивать и динамически (во время выполнения программы). В пакете определена структура &lt;span class=&quot;code&quot;&gt;matplotlib.rcParams&lt;/span&gt;, с которой работают как со словарем. Ключевые слова в данном случае - имена свойств файла &lt;span class=&quot;console&quot;&gt;matplotlibrc&lt;/span&gt;.&lt;/p&gt;

&lt;p&gt;Настройки шрифтов через &lt;span class=&quot;code&quot;&gt;matplotlib.rcParams&lt;/span&gt; можно изменить например так:&lt;/p&gt;

&lt;pre class=&quot;codeblock&quot;&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;import matplotlib as mpl&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;import matplotlib.pyplot as plt&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;mpl.rcParams[&#39;font.family&#39;] = &#39;fantasy&#39;&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;mpl.rcParams[&#39;font.fantasy&#39;] = &#39;Comic Sans MS, Arial&#39;&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;plt.plot([1,2,3,4], [1,4,9,16], &#39;ro&#39;)&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;[&amp;lt;matplotlib.lines.Line2D object at 0x02E837B0&amp;gt;]&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;plt.title(u&#39;Парабола&#39;)&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;&amp;lt;matplotlib.text.Text object at 0x02E65530&amp;gt;&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;plt.xlabel(u&#39;Значения x&#39;)&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;&amp;lt;matplotlib.text.Text object at 0x02E2DC70&amp;gt;&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;plt.ylabel(u&#39;Значения x в квадрате&#39;)&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;&amp;lt;matplotlib.text.Text object at 0x02E50D30&amp;gt;&lt;/span&gt;
&lt;span class=&quot;console&quot;&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class=&quot;code&quot;&gt;plt.show()&lt;/span&gt;
&lt;/pre&gt;

&lt;p&gt;В результате должно получиться вот что:&lt;/p&gt;

&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJYmuoiXbwb3T2P998vFwU1STZPEdcdaMGX7neQ8He942piIF3EHdlfrOmdRVjKrOPgZ0C9ziWbyqI8_Yz4vpowjhYL5XyrRU7s6EZciMuHzQ_Ow0JHuEJ8luTEF48Q55ZWkpfFGZeEAw/&quot;&gt;
&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiJYmuoiXbwb3T2P998vFwU1STZPEdcdaMGX7neQ8He942piIF3EHdlfrOmdRVjKrOPgZ0C9ziWbyqI8_Yz4vpowjhYL5XyrRU7s6EZciMuHzQ_Ow0JHuEJ8luTEF48Q55ZWkpfFGZeEAw/s400/mpl_03.png&quot; alt=&quot;Matplotlib. Пример окна диаграммы&quot; border=&quot;0&quot;/&gt;
&lt;/a&gt;

&lt;p&gt;Функции &lt;span class=&quot;code&quot;&gt;pyplot.plot()&lt;/span&gt; можно передать произвольное число пар аргументов типов list или array (тип array определен в модуле numpy). В примере выше передана одна пара: &lt;span class=&quot;code&quot;&gt;[1,2,3,4]&lt;/span&gt;, &lt;span class=&quot;code&quot;&gt;[1,4,9,16]&lt;/span&gt;. Первый элемент каждой пары функция рассматривает как значения откладываемые по оси X, второй элемент как значения по оси Y. Соответственно для каждой пары элементов строиться своя кривая на диаграмме. После каждой пары данных может быть передан дополнительный аргумент типа &lt;span class=&quot;code&quot;&gt;string&lt;/span&gt; - строка форматирования, которая определяет внешний вид кривой. Формат строки позаимствован из системы Matlab. Строка включает три подстроки. Первая подстрока задает цвет графического элемента, вторая стиль маркера, третья стиль линии. В примере &#39;&lt;span class=&quot;code&quot;&gt;ro&#39; = &#39;r&#39; + &#39;o&#39;&lt;/span&gt;, где &lt;span class=&quot;code&quot;&gt;&#39;r&#39;&lt;/span&gt; - красный, &lt;span class=&quot;code&quot;&gt;&#39;o&#39;&lt;/span&gt; - кружок. По умолчанию &lt;span class=&quot;code&quot;&gt;&#39;b-&#39;&lt;/span&gt; - синяя непрерывная линия.&lt;/p&gt;

&lt;p&gt;Немного о назначении кнопок интерактивного окна диаграммы.&lt;/p&gt;

&lt;p&gt;Кнопка&lt;/p&gt;

&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgzOms9ZUowyBAQ3FI1Lc5m9Mou4HpFbCAEu943PerUOBAzoHMp-cB61z8oee_TGmpQN4JogZ52a1EFbDJJjTDOENUEbZGeFhDvjEkAv0ViLrGy0ckNB9RBQZpMeQQIo2HW67AtXh2U88o/&quot; alt=&quot;Matplotlib. Кнопка pan/zoom&quot;/&gt;

&lt;p&gt;(pan/zoom) предназначена для прокрутки/масштабирования диаграммы. Нажимаем на кнопку, указатель мыши приобретает вид перекрещенных стрелок. Если двигать мышь и удерживать левую кнопку - диаграмма будет прокручиваться по направлению движения указателя. Если двигать мышь и удерживать правую кнопку - масштаб диаграммы будет изменяться, при движении вверх/вправо - уменьшаться, вниз/влево - увеличиваться. При нажатых клавишах &quot;&lt;span style=&quot;font-weight: bold;&quot;&gt;x&lt;/span&gt;&quot; и &quot;&lt;span style=&quot;font-weight: bold;&quot;&gt;y&lt;/span&gt;&quot; перемещение/масштабирование диаграммы будет происходить по осям X и Y соответственно, при нажатой клавише &lt;span style=&quot;font-weight: bold;&quot;&gt;Ctrl&lt;/span&gt; диаграмма будет изменяться так, чтобы сохранились её пропорции (aspect ratio).&lt;/p&gt;

&lt;p&gt;Кнопка&lt;/p&gt;

&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg6yUoVA5ePoP1-ze5mQ-R3eDXllswBQXcms1TOPVz27elh8E51d-FmPGG6F0kzx7KIryqNF9Y8KLs29skgmDg2GE4hR_qR_XEN0Gt_EvHMksGQA7-PnTsLXp_FWM9_MdFQIedNlKpQHn8/&quot; alt=&quot;Matplotlib. Кнопка прямоугольного масштабирования&quot;/&gt;

&lt;p&gt;при нажатии включает режим прямоугольного масштабирования. Если нажать на кнопку указатель мыши приобретет вид креста. При нажатой левой кнопки мыши на диаграмме можно выделить прямоугольную область. После освобождения кнопки масштаб диаграммы будет изменен так, чтобы выделенная область заняла как можно большую площадь диаграммы.&lt;/p&gt;

&lt;p&gt;Кнопки&lt;/p&gt;

&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgBX8nCnFe6jj3GKrglPKbHtYiU7P8GSpe6bChOCiFOAXeWMc2feTcvEthB-UGKXtLvor_ePY9ajw96v6NnuYWqLSFwVIYHIeDYPtnR6fqKjEWNS96EI1nt_w_AYqQmyLHzUUrJceAJDZU/&quot; alt=&quot;Matplotlib. Кнопка навигации&quot;/&gt;

&lt;p&gt;позволяют перемещаться по истории изменения диаграммы. Все изменения вносимые в диаграмму пользователем (масштабирование, прокрутка) запоминаются. Кнопки со стрелками позволяют перемещаться вперед/назад по имеющимся вариантам диаграммы. Кнопка с домиком возвращает диаграмму к исходному состоянию.&lt;/p&gt;

&lt;p&gt;Кнопка&lt;/p&gt;

&lt;img src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEijuQdkoBmV7qPcVicium6_G0YQ8HoA4eFUlxNVv2JxB8h-rVMpjONHaHM7eRkNr1T-N51GvVyvemcAx3YVdgEkDRuBijmWgCcJysV8u038TO4cPhPNRn9-malVc2D4E1344QzdOo-6dH0/&quot; alt=&quot;Matplotlib. Кнопка сохранения диаграммы&quot;/&gt;

&lt;p&gt;вызывает стандартный для системы диалог сохранения файла. Позволяет сохранить диаграмму в файл. Можно выбрать следующие форматы файла диаграммы: &lt;span style=&quot;font-weight: bold;&quot;&gt;png&lt;/span&gt;, &lt;span style=&quot;font-weight: bold;&quot;&gt;pdf&lt;/span&gt;, &lt;span style=&quot;font-weight: bold;&quot;&gt;svg&lt;/span&gt;, &lt;span style=&quot;font-weight: bold;&quot;&gt;eps&lt;/span&gt;, &lt;span style=&quot;font-weight: bold;&quot;&gt;ps&lt;/span&gt;. К сожалению не работает сохранение в формате &lt;span style=&quot;font-weight: bold;&quot;&gt;emf&lt;/span&gt; (модуль pyemf разработчиком больше не поддерживается). Через формат emf было очень удобно вставлять диаграммы в документы Word.&lt;/p&gt;

&lt;p&gt;Следующий пост по теме: &lt;a href=&quot;http://pyviy.blogspot.com/2009/08/matplotlib.html&quot;&gt;Пакет matplotlib. Строим банальный график&lt;/a&gt;.&lt;/p&gt;

&lt;/span&gt;</description><link>http://pyviy.blogspot.com/2009/06/matplotlib.html</link><author>noreply@blogger.com (Вий)</author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJV6iOvjv8BDjUVAF81P0Ze2wGcb4F9jW4EBt4Y6qiaTqAe4ODOiKHAGXKt5Ie6BrE0OFWMlX0qYN2TeVssxvps1TyhP5efV9FJ_urbWxOwy1Dvaq1_uiCZox9KsRuED9QqD_1bfiRdO4/s72-c/mpl_01.png" height="72" width="72"/><thr:total>3</thr:total></item><item><guid isPermaLink="false">tag:blogger.com,1999:blog-920988537392180762.post-902681919559134394</guid><pubDate>Sun, 09 Aug 2009 09:00:00 +0000</pubDate><atom:updated>2009-08-12T18:44:27.165+06:00</atom:updated><title>Приветствую Вас на Незамысловатом блоге</title><description>&lt;div style=&quot;text-align: justify;&quot;&gt;

&lt;p&gt;Решил тоже поиграться с блогами - вот моя первая попытка блогописания.&lt;/p&gt;

&lt;p&gt;Какова цель создания этого блога? Ну прежде всего простое любопытство - у всех есть у меня нет, надо попробовать. Во вторых, к настоящему времени у меня скопилось множество отрывочных записей, сделанных мной по самым разным поводам и хаотично рассыпанным по закуткам жесткого диска. Блог это очередная попытка как то организовать все это хозяйство. Может быть что то будет полезным не только для меня...&lt;/p&gt;

&lt;p&gt;Сейчас, по роду своей деятельности, я активно пользуюсь языком программирования Python, ну, соответственно, и мои первые заметки будут посвящены этому языку.&lt;/p&gt;

&lt;/div&gt;</description><link>http://pyviy.blogspot.com/2009/08/blog-post.html</link><author>noreply@blogger.com (Вий)</author><thr:total>1</thr:total></item></channel></rss>