<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Введение в Python 3 - Python 3 | Data Science | Нейронные сети | AI - Искусственный Интеллект</title>
	<atom:link href="https://python.ivan-shamaev.ru/category/introduction-python-3/feed/" rel="self" type="application/rss+xml" />
	<link>https://python.ivan-shamaev.ru/category/introduction-python-3/</link>
	<description>Библиотеки обработки данных. Примеры. Строки, списки, файлы, числа, массивы. Язык программирования Python 3 - скачать</description>
	<lastBuildDate>Fri, 03 Mar 2023 06:03:14 +0000</lastBuildDate>
	<language>ru-RU</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.6.5</generator>

<image>
	<url>https://python.ivan-shamaev.ru/wp-content/uploads/2019/04/cropped-data_science_python3_logo-32x32.png</url>
	<title>Введение в Python 3 - Python 3 | Data Science | Нейронные сети | AI - Искусственный Интеллект</title>
	<link>https://python.ivan-shamaev.ru/category/introduction-python-3/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Что такое __pycache__ в Python? Как запретить создание __pycache__ и .pyc файлов?</title>
		<link>https://python.ivan-shamaev.ru/what-is-__pycache__-in-python-project-and-pyc-files/</link>
					<comments>https://python.ivan-shamaev.ru/what-is-__pycache__-in-python-project-and-pyc-files/#respond</comments>
		
		<dc:creator><![CDATA[Шамаев Иван]]></dc:creator>
		<pubDate>Thu, 08 Sep 2022 22:00:27 +0000</pubDate>
				<category><![CDATA[Введение в Python 3]]></category>
		<category><![CDATA[__pycache__]]></category>
		<category><![CDATA[.pyc файлы]]></category>
		<category><![CDATA[Как запретить __pycache__]]></category>
		<category><![CDATA[что такое __pycache__]]></category>
		<guid isPermaLink="false">https://python.ivan-shamaev.ru/?p=1650</guid>

					<description><![CDATA[<p>В этой статье будет разобрана природа возникновения папки __pycache__, которая создается при запуске кода Python. Введение Наверное, вы заметили, что при выполнении кода Python __pycache__ (иногда) создается каталог с именем, который содержит множество файлов с .pyc расширением. В этой статье мы обсудим назначение этих файлов, которые создаются интерпретатором Python. Мы обсудим, почему эти файлы генерируются, [&#8230;]</p>
<p>Сообщение <a href="https://python.ivan-shamaev.ru/what-is-__pycache__-in-python-project-and-pyc-files/">Что такое __pycache__ в Python? Как запретить создание __pycache__ и .pyc файлов?</a> появились сначала на <a href="https://python.ivan-shamaev.ru">Python 3 | Data Science | Нейронные сети | AI - Искусственный Интеллект</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><a class="a2a_button_telegram" href="https://www.addtoany.com/add_to/telegram?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fwhat-is-__pycache__-in-python-project-and-pyc-files%2F&amp;linkname=%D0%A7%D1%82%D0%BE%20%D1%82%D0%B0%D0%BA%D0%BE%D0%B5%20__pycache__%20%D0%B2%20Python%3F%20%D0%9A%D0%B0%D0%BA%20%D0%B7%D0%B0%D0%BF%D1%80%D0%B5%D1%82%D0%B8%D1%82%D1%8C%20%D1%81%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5%20__pycache__%20%D0%B8%20.pyc%20%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%3F" title="Telegram" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_whatsapp" href="https://www.addtoany.com/add_to/whatsapp?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fwhat-is-__pycache__-in-python-project-and-pyc-files%2F&amp;linkname=%D0%A7%D1%82%D0%BE%20%D1%82%D0%B0%D0%BA%D0%BE%D0%B5%20__pycache__%20%D0%B2%20Python%3F%20%D0%9A%D0%B0%D0%BA%20%D0%B7%D0%B0%D0%BF%D1%80%D0%B5%D1%82%D0%B8%D1%82%D1%8C%20%D1%81%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5%20__pycache__%20%D0%B8%20.pyc%20%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%3F" title="WhatsApp" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fwhat-is-__pycache__-in-python-project-and-pyc-files%2F&amp;linkname=%D0%A7%D1%82%D0%BE%20%D1%82%D0%B0%D0%BA%D0%BE%D0%B5%20__pycache__%20%D0%B2%20Python%3F%20%D0%9A%D0%B0%D0%BA%20%D0%B7%D0%B0%D0%BF%D1%80%D0%B5%D1%82%D0%B8%D1%82%D1%8C%20%D1%81%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5%20__pycache__%20%D0%B8%20.pyc%20%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%3F" title="Facebook" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_linkedin" href="https://www.addtoany.com/add_to/linkedin?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fwhat-is-__pycache__-in-python-project-and-pyc-files%2F&amp;linkname=%D0%A7%D1%82%D0%BE%20%D1%82%D0%B0%D0%BA%D0%BE%D0%B5%20__pycache__%20%D0%B2%20Python%3F%20%D0%9A%D0%B0%D0%BA%20%D0%B7%D0%B0%D0%BF%D1%80%D0%B5%D1%82%D0%B8%D1%82%D1%8C%20%D1%81%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5%20__pycache__%20%D0%B8%20.pyc%20%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%3F" title="LinkedIn" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_vk" href="https://www.addtoany.com/add_to/vk?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fwhat-is-__pycache__-in-python-project-and-pyc-files%2F&amp;linkname=%D0%A7%D1%82%D0%BE%20%D1%82%D0%B0%D0%BA%D0%BE%D0%B5%20__pycache__%20%D0%B2%20Python%3F%20%D0%9A%D0%B0%D0%BA%20%D0%B7%D0%B0%D0%BF%D1%80%D0%B5%D1%82%D0%B8%D1%82%D1%8C%20%D1%81%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5%20__pycache__%20%D0%B8%20.pyc%20%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%3F" title="VK" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_twitter" href="https://www.addtoany.com/add_to/twitter?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fwhat-is-__pycache__-in-python-project-and-pyc-files%2F&amp;linkname=%D0%A7%D1%82%D0%BE%20%D1%82%D0%B0%D0%BA%D0%BE%D0%B5%20__pycache__%20%D0%B2%20Python%3F%20%D0%9A%D0%B0%D0%BA%20%D0%B7%D0%B0%D0%BF%D1%80%D0%B5%D1%82%D0%B8%D1%82%D1%8C%20%D1%81%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5%20__pycache__%20%D0%B8%20.pyc%20%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%3F" title="Twitter" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_email" href="https://www.addtoany.com/add_to/email?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fwhat-is-__pycache__-in-python-project-and-pyc-files%2F&amp;linkname=%D0%A7%D1%82%D0%BE%20%D1%82%D0%B0%D0%BA%D0%BE%D0%B5%20__pycache__%20%D0%B2%20Python%3F%20%D0%9A%D0%B0%D0%BA%20%D0%B7%D0%B0%D0%BF%D1%80%D0%B5%D1%82%D0%B8%D1%82%D1%8C%20%D1%81%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5%20__pycache__%20%D0%B8%20.pyc%20%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%3F" title="Email" rel="nofollow noopener" target="_blank"></a><a class="a2a_dd addtoany_share_save addtoany_share" href="https://www.addtoany.com/share#url=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fwhat-is-__pycache__-in-python-project-and-pyc-files%2F&#038;title=%D0%A7%D1%82%D0%BE%20%D1%82%D0%B0%D0%BA%D0%BE%D0%B5%20__pycache__%20%D0%B2%20Python%3F%20%D0%9A%D0%B0%D0%BA%20%D0%B7%D0%B0%D0%BF%D1%80%D0%B5%D1%82%D0%B8%D1%82%D1%8C%20%D1%81%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5%20__pycache__%20%D0%B8%20.pyc%20%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%3F" data-a2a-url="https://python.ivan-shamaev.ru/what-is-__pycache__-in-python-project-and-pyc-files/" data-a2a-title="Что такое __pycache__ в Python? Как запретить создание __pycache__ и .pyc файлов?"></a></p><p>В этой статье будет разобрана природа возникновения папки __pycache__, которая создается при запуске кода Python.</p>
<h1>Введение</h1>
<p>Наверное, вы заметили, что при выполнении кода Python <code class="EnlighterJSRAW" data-enlighter-language="raw">__pycache__</code> (иногда) создается каталог с именем, который содержит множество файлов с <code class="EnlighterJSRAW" data-enlighter-language="raw">.pyc</code> расширением.</p>
<p>В этой статье мы обсудим назначение этих файлов, которые создаются интерпретатором Python. Мы обсудим, почему эти файлы генерируются, как подавить их создание и как гарантировать, что они не будут переданы в какой-либо удаленный репозиторий.</p>
<h1>Файлы .pyc и папка __pycache__</h1>
<p><strong>Python</strong> является интерпретируемым языком, что означает, что ваш исходный код преобразуется в набор инструкций, понятных ЦП во время выполнения. При запуске вашей программы Python исходный код компилируется в <strong>байт-код</strong>, который является деталью реализации <strong>CPython</strong> (исходной реализации Python). <strong>Байт-код</strong> также кэшируется и сохраняется в <code class="EnlighterJSRAW" data-enlighter-language="raw">.pyc файлах</code>, поэтому при следующем повторном запуске кода выполнение того же файла будет быстрее.</p>
<p>Обратите внимание, что пара концепций, обсуждаемых в этом разделе, касающихся интерпретатора и байт-кода, упрощены и верны лишь частично, но их более чем достаточно, чтобы помочь вам понять <strong>pyc файлы</strong> и <code class="EnlighterJSRAW" data-enlighter-language="raw">__pycache__</code> директории.</p>
<p>Таким образом, после первого выполнения вашего исходного кода будет создана папка <strong>__pycache__</strong>, содержащая несколько .<strong>pyc файлов байт-кода</strong> с теми же именами, что и ваши .py файлы. Как уже упоминалось, они будут использоваться в последующих исполнениях, чтобы ваша программа запускалась немного быстрее.</p>
<p>Каждый раз, когда ваш исходный код модифицируется, он будет перекомпилирован, и новые файлы байт-кода будут создаваться снова. Обратите внимание, что в некоторых случаях это может быть не так, и <strong>Python</strong> выполнит код, используя кэшированные файлы, что вызовет у вас некоторые проблемы. Например, вы, возможно, исправили ошибку, но Python может работать в кешированной версии с ошибками. В этом случае вам, возможно, придется удалить <strong>__pycache__</strong> папку или даже запретить создание этих файлов.</p>
<h1>Подавление/запрет создания __pycache__</h1>
<p>При использовании интерпретатора <strong>CPython</strong> (который в любом случае является исходной реализацией Python) вы можете подавить создание этой папки двумя способами.</p>
<p>Первый вариант — передать <code class="EnlighterJSRAW" data-enlighter-language="raw">-B</code> флаг при запуске файла Python. Когда флаг указан, Python не будет пытаться записывать <code class="EnlighterJSRAW" data-enlighter-language="raw">.pyc файлы</code> при импорте исходных модулей:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">python3 -B my_python_app.py</pre>
<p>В качестве альтернативы вы можете установить переменную среды <strong>PYTHONDONTWRITEBYTECODE</strong> в любую непустую строку. Опять же, это предотвратит попытки Python записывать <code class="EnlighterJSRAW" data-enlighter-language="raw">.pyc</code> файлы.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">export PYTHONDONTWRITEBYTECODE=abc</pre>
<p>Обратите внимание, что оба подхода эквивалентны.</p>
<h2>Добавление __pycache__ в файл .gitignore</h2>
<p>При работе в локальном репозитории Git будет отслеживать каждый файл в репозитории Git. Каждый файл может быть отслежен (т.е. уже подготовлен и зафиксирован), не отслежен (не подготовлен или зафиксирован) или проигнорирован.</p>
<p>В большинстве случаев вам следует игнорировать определенные файлы, такие как файлы с конфиденциальными данными, системные файлы или автоматически сгенерированные файлы, созданные, скажем, в среде IDE или в определенной рабочей области.</p>
<p>Самый элегантный способ сделать это — через .gitignore файл, который находится в верхнем каталоге удаленного репозитория Git, в котором вы можете явно указать файлы или каталоги (также можно применять регулярные выражения), которые Git будет игнорировать и не будет отслеживать дольше.</p>
<p>__pycache__ входит в число каталогов, которые не следует помещать в удаленные репозитории. Поэтому все, что вам нужно сделать, это указать каталог в .gitignore файле.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic"># .gitignore
__pycache__/</pre>
<p><strong>Важное</strong></p>
<blockquote><p>Одно важное предостережение относительно байт-кода заключается в том, что .pyc файлы будут использоваться в тех случаях, когда эквивалентного .py файла больше нет. Например, если вы удалили или переименовали .py файл, но по какой-то причине вы все еще видите, как они выполняются любым возможным способом, то это может быть фактической причиной.</p></blockquote>
<p><a class="a2a_button_telegram" href="https://www.addtoany.com/add_to/telegram?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fwhat-is-__pycache__-in-python-project-and-pyc-files%2F&amp;linkname=%D0%A7%D1%82%D0%BE%20%D1%82%D0%B0%D0%BA%D0%BE%D0%B5%20__pycache__%20%D0%B2%20Python%3F%20%D0%9A%D0%B0%D0%BA%20%D0%B7%D0%B0%D0%BF%D1%80%D0%B5%D1%82%D0%B8%D1%82%D1%8C%20%D1%81%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5%20__pycache__%20%D0%B8%20.pyc%20%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%3F" title="Telegram" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_whatsapp" href="https://www.addtoany.com/add_to/whatsapp?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fwhat-is-__pycache__-in-python-project-and-pyc-files%2F&amp;linkname=%D0%A7%D1%82%D0%BE%20%D1%82%D0%B0%D0%BA%D0%BE%D0%B5%20__pycache__%20%D0%B2%20Python%3F%20%D0%9A%D0%B0%D0%BA%20%D0%B7%D0%B0%D0%BF%D1%80%D0%B5%D1%82%D0%B8%D1%82%D1%8C%20%D1%81%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5%20__pycache__%20%D0%B8%20.pyc%20%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%3F" title="WhatsApp" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fwhat-is-__pycache__-in-python-project-and-pyc-files%2F&amp;linkname=%D0%A7%D1%82%D0%BE%20%D1%82%D0%B0%D0%BA%D0%BE%D0%B5%20__pycache__%20%D0%B2%20Python%3F%20%D0%9A%D0%B0%D0%BA%20%D0%B7%D0%B0%D0%BF%D1%80%D0%B5%D1%82%D0%B8%D1%82%D1%8C%20%D1%81%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5%20__pycache__%20%D0%B8%20.pyc%20%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%3F" title="Facebook" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_linkedin" href="https://www.addtoany.com/add_to/linkedin?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fwhat-is-__pycache__-in-python-project-and-pyc-files%2F&amp;linkname=%D0%A7%D1%82%D0%BE%20%D1%82%D0%B0%D0%BA%D0%BE%D0%B5%20__pycache__%20%D0%B2%20Python%3F%20%D0%9A%D0%B0%D0%BA%20%D0%B7%D0%B0%D0%BF%D1%80%D0%B5%D1%82%D0%B8%D1%82%D1%8C%20%D1%81%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5%20__pycache__%20%D0%B8%20.pyc%20%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%3F" title="LinkedIn" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_vk" href="https://www.addtoany.com/add_to/vk?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fwhat-is-__pycache__-in-python-project-and-pyc-files%2F&amp;linkname=%D0%A7%D1%82%D0%BE%20%D1%82%D0%B0%D0%BA%D0%BE%D0%B5%20__pycache__%20%D0%B2%20Python%3F%20%D0%9A%D0%B0%D0%BA%20%D0%B7%D0%B0%D0%BF%D1%80%D0%B5%D1%82%D0%B8%D1%82%D1%8C%20%D1%81%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5%20__pycache__%20%D0%B8%20.pyc%20%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%3F" title="VK" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_twitter" href="https://www.addtoany.com/add_to/twitter?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fwhat-is-__pycache__-in-python-project-and-pyc-files%2F&amp;linkname=%D0%A7%D1%82%D0%BE%20%D1%82%D0%B0%D0%BA%D0%BE%D0%B5%20__pycache__%20%D0%B2%20Python%3F%20%D0%9A%D0%B0%D0%BA%20%D0%B7%D0%B0%D0%BF%D1%80%D0%B5%D1%82%D0%B8%D1%82%D1%8C%20%D1%81%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5%20__pycache__%20%D0%B8%20.pyc%20%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%3F" title="Twitter" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_email" href="https://www.addtoany.com/add_to/email?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fwhat-is-__pycache__-in-python-project-and-pyc-files%2F&amp;linkname=%D0%A7%D1%82%D0%BE%20%D1%82%D0%B0%D0%BA%D0%BE%D0%B5%20__pycache__%20%D0%B2%20Python%3F%20%D0%9A%D0%B0%D0%BA%20%D0%B7%D0%B0%D0%BF%D1%80%D0%B5%D1%82%D0%B8%D1%82%D1%8C%20%D1%81%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5%20__pycache__%20%D0%B8%20.pyc%20%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%3F" title="Email" rel="nofollow noopener" target="_blank"></a><a class="a2a_dd addtoany_share_save addtoany_share" href="https://www.addtoany.com/share#url=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fwhat-is-__pycache__-in-python-project-and-pyc-files%2F&#038;title=%D0%A7%D1%82%D0%BE%20%D1%82%D0%B0%D0%BA%D0%BE%D0%B5%20__pycache__%20%D0%B2%20Python%3F%20%D0%9A%D0%B0%D0%BA%20%D0%B7%D0%B0%D0%BF%D1%80%D0%B5%D1%82%D0%B8%D1%82%D1%8C%20%D1%81%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5%20__pycache__%20%D0%B8%20.pyc%20%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2%3F" data-a2a-url="https://python.ivan-shamaev.ru/what-is-__pycache__-in-python-project-and-pyc-files/" data-a2a-title="Что такое __pycache__ в Python? Как запретить создание __pycache__ и .pyc файлов?"></a></p><p>Сообщение <a href="https://python.ivan-shamaev.ru/what-is-__pycache__-in-python-project-and-pyc-files/">Что такое __pycache__ в Python? Как запретить создание __pycache__ и .pyc файлов?</a> появились сначала на <a href="https://python.ivan-shamaev.ru">Python 3 | Data Science | Нейронные сети | AI - Искусственный Интеллект</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://python.ivan-shamaev.ru/what-is-__pycache__-in-python-project-and-pyc-files/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Разница между списком и кортежем. Python List vs. Tuple</title>
		<link>https://python.ivan-shamaev.ru/difference-between-list-and-tuple-in-python/</link>
					<comments>https://python.ivan-shamaev.ru/difference-between-list-and-tuple-in-python/#comments</comments>
		
		<dc:creator><![CDATA[Шамаев Иван]]></dc:creator>
		<pubDate>Wed, 31 Aug 2022 20:45:59 +0000</pubDate>
				<category><![CDATA[Введение в Python 3]]></category>
		<category><![CDATA[List vs. Tuple]]></category>
		<category><![CDATA[Python List vs Tuple]]></category>
		<category><![CDATA[Разница между списком и кортежем]]></category>
		<guid isPermaLink="false">https://python.ivan-shamaev.ru/?p=1635</guid>

					<description><![CDATA[<p>Python List vs. Tuple В этой статье будет рассмотрена разница между списком и кортежем (List vs. Tuple). List и Tuple в Python — это классы структур данных Python. Список является динамическим, тогда как кортеж имеет статические характеристики. Это означает, что списки могут быть изменены, тогда как кортежи не могут быть изменены, кортеж быстрее списка из-за [&#8230;]</p>
<p>Сообщение <a href="https://python.ivan-shamaev.ru/difference-between-list-and-tuple-in-python/">Разница между списком и кортежем. Python List vs. Tuple</a> появились сначала на <a href="https://python.ivan-shamaev.ru">Python 3 | Data Science | Нейронные сети | AI - Искусственный Интеллект</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><a class="a2a_button_telegram" href="https://www.addtoany.com/add_to/telegram?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fdifference-between-list-and-tuple-in-python%2F&amp;linkname=%D0%A0%D0%B0%D0%B7%D0%BD%D0%B8%D1%86%D0%B0%20%D0%BC%D0%B5%D0%B6%D0%B4%D1%83%20%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%BE%D0%BC%20%D0%B8%20%D0%BA%D0%BE%D1%80%D1%82%D0%B5%D0%B6%D0%B5%D0%BC.%20Python%20List%20vs.%20Tuple" title="Telegram" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_whatsapp" href="https://www.addtoany.com/add_to/whatsapp?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fdifference-between-list-and-tuple-in-python%2F&amp;linkname=%D0%A0%D0%B0%D0%B7%D0%BD%D0%B8%D1%86%D0%B0%20%D0%BC%D0%B5%D0%B6%D0%B4%D1%83%20%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%BE%D0%BC%20%D0%B8%20%D0%BA%D0%BE%D1%80%D1%82%D0%B5%D0%B6%D0%B5%D0%BC.%20Python%20List%20vs.%20Tuple" title="WhatsApp" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fdifference-between-list-and-tuple-in-python%2F&amp;linkname=%D0%A0%D0%B0%D0%B7%D0%BD%D0%B8%D1%86%D0%B0%20%D0%BC%D0%B5%D0%B6%D0%B4%D1%83%20%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%BE%D0%BC%20%D0%B8%20%D0%BA%D0%BE%D1%80%D1%82%D0%B5%D0%B6%D0%B5%D0%BC.%20Python%20List%20vs.%20Tuple" title="Facebook" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_linkedin" href="https://www.addtoany.com/add_to/linkedin?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fdifference-between-list-and-tuple-in-python%2F&amp;linkname=%D0%A0%D0%B0%D0%B7%D0%BD%D0%B8%D1%86%D0%B0%20%D0%BC%D0%B5%D0%B6%D0%B4%D1%83%20%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%BE%D0%BC%20%D0%B8%20%D0%BA%D0%BE%D1%80%D1%82%D0%B5%D0%B6%D0%B5%D0%BC.%20Python%20List%20vs.%20Tuple" title="LinkedIn" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_vk" href="https://www.addtoany.com/add_to/vk?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fdifference-between-list-and-tuple-in-python%2F&amp;linkname=%D0%A0%D0%B0%D0%B7%D0%BD%D0%B8%D1%86%D0%B0%20%D0%BC%D0%B5%D0%B6%D0%B4%D1%83%20%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%BE%D0%BC%20%D0%B8%20%D0%BA%D0%BE%D1%80%D1%82%D0%B5%D0%B6%D0%B5%D0%BC.%20Python%20List%20vs.%20Tuple" title="VK" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_twitter" href="https://www.addtoany.com/add_to/twitter?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fdifference-between-list-and-tuple-in-python%2F&amp;linkname=%D0%A0%D0%B0%D0%B7%D0%BD%D0%B8%D1%86%D0%B0%20%D0%BC%D0%B5%D0%B6%D0%B4%D1%83%20%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%BE%D0%BC%20%D0%B8%20%D0%BA%D0%BE%D1%80%D1%82%D0%B5%D0%B6%D0%B5%D0%BC.%20Python%20List%20vs.%20Tuple" title="Twitter" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_email" href="https://www.addtoany.com/add_to/email?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fdifference-between-list-and-tuple-in-python%2F&amp;linkname=%D0%A0%D0%B0%D0%B7%D0%BD%D0%B8%D1%86%D0%B0%20%D0%BC%D0%B5%D0%B6%D0%B4%D1%83%20%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%BE%D0%BC%20%D0%B8%20%D0%BA%D0%BE%D1%80%D1%82%D0%B5%D0%B6%D0%B5%D0%BC.%20Python%20List%20vs.%20Tuple" title="Email" rel="nofollow noopener" target="_blank"></a><a class="a2a_dd addtoany_share_save addtoany_share" href="https://www.addtoany.com/share#url=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fdifference-between-list-and-tuple-in-python%2F&#038;title=%D0%A0%D0%B0%D0%B7%D0%BD%D0%B8%D1%86%D0%B0%20%D0%BC%D0%B5%D0%B6%D0%B4%D1%83%20%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%BE%D0%BC%20%D0%B8%20%D0%BA%D0%BE%D1%80%D1%82%D0%B5%D0%B6%D0%B5%D0%BC.%20Python%20List%20vs.%20Tuple" data-a2a-url="https://python.ivan-shamaev.ru/difference-between-list-and-tuple-in-python/" data-a2a-title="Разница между списком и кортежем. Python List vs. Tuple"></a></p><h1>Python List vs. Tuple</h1>
<p>В этой статье будет рассмотрена разница между списком и кортежем (List vs. Tuple).</p>
<p>List и Tuple в Python — это классы структур данных Python. Список является динамическим, тогда как кортеж имеет статические характеристики. Это означает, что списки могут быть изменены, тогда как кортежи не могут быть изменены, кортеж быстрее списка из-за статичности по своей природе. Списки обозначаются квадратными скобками, а кортежи обозначаются скобками.</p>
<h2>Важные различия между List и Tuple в Python</h2>


<figure class="wp-block-table"><table><tbody><tr><td>№</td><td>List (список)</td><td>Tuple (Кортеж)</td></tr><tr><td>1</td><td>Списки изменяемы</td><td>Кортежи неизменны</td></tr><tr><td>2</td><td>Последствия итераций отнимают много времени</td><td>Последствия итераций сравнительно быстрее</td></tr><tr><td>3</td><td>Список лучше подходит для выполнения операций, таких как вставка и удаление.</td><td>Тип данных Tuple подходит для доступа к элементам</td></tr><tr><td>4</td><td>Списки потребляют больше памяти</td><td>Кортеж потребляет меньше памяти по сравнению со списком</td></tr><tr><td>5</td><td>Списки имеют несколько встроенных методов.</td><td>Tuple не имеет большого количества встроенных методов.</td></tr><tr><td>6</td><td>Более вероятны непредвиденные изменения и ошибки</td><td>В кортеже это трудно осуществить.</td></tr></tbody></table></figure>


<h2>Список против кортежа</h2>
<p>Проверим, являются ли кортежи неизменяемыми, а список изменяемым<br>Здесь мы собираемся сравнить тест изменчивости списка и кортежа.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python"># Creating a List with
# the use of Numbers
# code to test that tuples are mutable
List = [1, 2, 4, 4, 3, 3, 3, 6, 5]
print("Original list ", List)
 
List[3] = 77
print("Example to show mutablity ", List)</pre>
<p>Результат выполнения кода:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">Исходный список [1, 2, 4, 4, 3, 3, 3, 6, 5] 
Пример для демонстрации изменчивости [1, 2, 4, 77, 3, 3, 3, 6, 5]</pre>
<p>Пример с кортежем: далее мы увидим, что кортеж не может быть изменен.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">tuple1 = (0, 1, 2, 3)
tuple1[0] = 4
print(tuple1)</pre>
<p>Результат выполнения кода:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">Traceback (most recent call last):
  File "tuple_example.py", line 3, in
    tuple1[0]=4
TypeError: 'tuple' object does not support item assignment</pre>
<h2>Проверка эффективности работы кортежей с памятью</h2>
<p>Поскольку кортежи хранятся в одном блоке памяти, им не требуется дополнительное пространство для новых объектов, в то время как списки размещаются в двух блоках: первый фиксированный со всей информацией об объектах Python, а второй блок переменного размера для данных.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">import sys
a_list = []
a_tuple = ()
a_list = ["Lemons", "And", "Apples"]
a_tuple = ("Lemons", "And", "Apples")
print(sys.getsizeof(a_list))
print(sys.getsizeof(a_tuple))</pre>
<p>Результат выполнения кода:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">120
64</pre>
<h2>Проверка скорости итераций в Tuple по сравнению с List</h2>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">import sys, platform
import time
 
l=list(range(100000001))
t=tuple(range(100000001))
 
start = time.time_ns()
for i in range(len(t)):
    a = t[i]
end = time.time_ns()
print("Total lookup time for Tuple: ", end - start)
 
start = time.time_ns()
for i in range(len(l)):
    a = l[i]
end = time.time_ns()
print("Total lookup time for LIST: ", end - start)</pre>
<p>Результат выполнения кода:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">Общее время поиска для Tuple: 7038208700 
Общее время поиска для LIST: 19646516700</pre>
<p></p><p><a class="a2a_button_telegram" href="https://www.addtoany.com/add_to/telegram?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fdifference-between-list-and-tuple-in-python%2F&amp;linkname=%D0%A0%D0%B0%D0%B7%D0%BD%D0%B8%D1%86%D0%B0%20%D0%BC%D0%B5%D0%B6%D0%B4%D1%83%20%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%BE%D0%BC%20%D0%B8%20%D0%BA%D0%BE%D1%80%D1%82%D0%B5%D0%B6%D0%B5%D0%BC.%20Python%20List%20vs.%20Tuple" title="Telegram" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_whatsapp" href="https://www.addtoany.com/add_to/whatsapp?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fdifference-between-list-and-tuple-in-python%2F&amp;linkname=%D0%A0%D0%B0%D0%B7%D0%BD%D0%B8%D1%86%D0%B0%20%D0%BC%D0%B5%D0%B6%D0%B4%D1%83%20%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%BE%D0%BC%20%D0%B8%20%D0%BA%D0%BE%D1%80%D1%82%D0%B5%D0%B6%D0%B5%D0%BC.%20Python%20List%20vs.%20Tuple" title="WhatsApp" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fdifference-between-list-and-tuple-in-python%2F&amp;linkname=%D0%A0%D0%B0%D0%B7%D0%BD%D0%B8%D1%86%D0%B0%20%D0%BC%D0%B5%D0%B6%D0%B4%D1%83%20%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%BE%D0%BC%20%D0%B8%20%D0%BA%D0%BE%D1%80%D1%82%D0%B5%D0%B6%D0%B5%D0%BC.%20Python%20List%20vs.%20Tuple" title="Facebook" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_linkedin" href="https://www.addtoany.com/add_to/linkedin?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fdifference-between-list-and-tuple-in-python%2F&amp;linkname=%D0%A0%D0%B0%D0%B7%D0%BD%D0%B8%D1%86%D0%B0%20%D0%BC%D0%B5%D0%B6%D0%B4%D1%83%20%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%BE%D0%BC%20%D0%B8%20%D0%BA%D0%BE%D1%80%D1%82%D0%B5%D0%B6%D0%B5%D0%BC.%20Python%20List%20vs.%20Tuple" title="LinkedIn" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_vk" href="https://www.addtoany.com/add_to/vk?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fdifference-between-list-and-tuple-in-python%2F&amp;linkname=%D0%A0%D0%B0%D0%B7%D0%BD%D0%B8%D1%86%D0%B0%20%D0%BC%D0%B5%D0%B6%D0%B4%D1%83%20%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%BE%D0%BC%20%D0%B8%20%D0%BA%D0%BE%D1%80%D1%82%D0%B5%D0%B6%D0%B5%D0%BC.%20Python%20List%20vs.%20Tuple" title="VK" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_twitter" href="https://www.addtoany.com/add_to/twitter?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fdifference-between-list-and-tuple-in-python%2F&amp;linkname=%D0%A0%D0%B0%D0%B7%D0%BD%D0%B8%D1%86%D0%B0%20%D0%BC%D0%B5%D0%B6%D0%B4%D1%83%20%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%BE%D0%BC%20%D0%B8%20%D0%BA%D0%BE%D1%80%D1%82%D0%B5%D0%B6%D0%B5%D0%BC.%20Python%20List%20vs.%20Tuple" title="Twitter" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_email" href="https://www.addtoany.com/add_to/email?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fdifference-between-list-and-tuple-in-python%2F&amp;linkname=%D0%A0%D0%B0%D0%B7%D0%BD%D0%B8%D1%86%D0%B0%20%D0%BC%D0%B5%D0%B6%D0%B4%D1%83%20%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%BE%D0%BC%20%D0%B8%20%D0%BA%D0%BE%D1%80%D1%82%D0%B5%D0%B6%D0%B5%D0%BC.%20Python%20List%20vs.%20Tuple" title="Email" rel="nofollow noopener" target="_blank"></a><a class="a2a_dd addtoany_share_save addtoany_share" href="https://www.addtoany.com/share#url=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fdifference-between-list-and-tuple-in-python%2F&#038;title=%D0%A0%D0%B0%D0%B7%D0%BD%D0%B8%D1%86%D0%B0%20%D0%BC%D0%B5%D0%B6%D0%B4%D1%83%20%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%BE%D0%BC%20%D0%B8%20%D0%BA%D0%BE%D1%80%D1%82%D0%B5%D0%B6%D0%B5%D0%BC.%20Python%20List%20vs.%20Tuple" data-a2a-url="https://python.ivan-shamaev.ru/difference-between-list-and-tuple-in-python/" data-a2a-title="Разница между списком и кортежем. Python List vs. Tuple"></a></p><p>Сообщение <a href="https://python.ivan-shamaev.ru/difference-between-list-and-tuple-in-python/">Разница между списком и кортежем. Python List vs. Tuple</a> появились сначала на <a href="https://python.ivan-shamaev.ru">Python 3 | Data Science | Нейронные сети | AI - Искусственный Интеллект</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://python.ivan-shamaev.ru/difference-between-list-and-tuple-in-python/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title>Возврат нескольких значений в функциях Python</title>
		<link>https://python.ivan-shamaev.ru/how-to-return-multiple-values-in-python/</link>
					<comments>https://python.ivan-shamaev.ru/how-to-return-multiple-values-in-python/#respond</comments>
		
		<dc:creator><![CDATA[Шамаев Иван]]></dc:creator>
		<pubDate>Tue, 30 Aug 2022 04:49:34 +0000</pubDate>
				<category><![CDATA[Введение в Python 3]]></category>
		<category><![CDATA[Примеры скриптов (кода) Python 3]]></category>
		<category><![CDATA[return function python]]></category>
		<category><![CDATA[Возврат нескольких значений в функциях Python]]></category>
		<category><![CDATA[Функции Python 3]]></category>
		<guid isPermaLink="false">https://python.ivan-shamaev.ru/?p=1624</guid>

					<description><![CDATA[<p>В Python мы можем возвращать несколько значений из функции. Ниже приведены различные способы Использование объекта (object) Это похоже на C/C++ и Java, мы можем создать класс (в C, структуру) для хранения нескольких значений и возврата объекта класса. # A Python program to return multiple # values from a method using class class Test: def __init__(self): [&#8230;]</p>
<p>Сообщение <a href="https://python.ivan-shamaev.ru/how-to-return-multiple-values-in-python/">Возврат нескольких значений в функциях Python</a> появились сначала на <a href="https://python.ivan-shamaev.ru">Python 3 | Data Science | Нейронные сети | AI - Искусственный Интеллект</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><a class="a2a_button_telegram" href="https://www.addtoany.com/add_to/telegram?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fhow-to-return-multiple-values-in-python%2F&amp;linkname=%D0%92%D0%BE%D0%B7%D0%B2%D1%80%D0%B0%D1%82%20%D0%BD%D0%B5%D1%81%D0%BA%D0%BE%D0%BB%D1%8C%D0%BA%D0%B8%D1%85%20%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9%20%D0%B2%20%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8F%D1%85%20Python" title="Telegram" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_whatsapp" href="https://www.addtoany.com/add_to/whatsapp?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fhow-to-return-multiple-values-in-python%2F&amp;linkname=%D0%92%D0%BE%D0%B7%D0%B2%D1%80%D0%B0%D1%82%20%D0%BD%D0%B5%D1%81%D0%BA%D0%BE%D0%BB%D1%8C%D0%BA%D0%B8%D1%85%20%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9%20%D0%B2%20%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8F%D1%85%20Python" title="WhatsApp" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fhow-to-return-multiple-values-in-python%2F&amp;linkname=%D0%92%D0%BE%D0%B7%D0%B2%D1%80%D0%B0%D1%82%20%D0%BD%D0%B5%D1%81%D0%BA%D0%BE%D0%BB%D1%8C%D0%BA%D0%B8%D1%85%20%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9%20%D0%B2%20%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8F%D1%85%20Python" title="Facebook" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_linkedin" href="https://www.addtoany.com/add_to/linkedin?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fhow-to-return-multiple-values-in-python%2F&amp;linkname=%D0%92%D0%BE%D0%B7%D0%B2%D1%80%D0%B0%D1%82%20%D0%BD%D0%B5%D1%81%D0%BA%D0%BE%D0%BB%D1%8C%D0%BA%D0%B8%D1%85%20%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9%20%D0%B2%20%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8F%D1%85%20Python" title="LinkedIn" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_vk" href="https://www.addtoany.com/add_to/vk?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fhow-to-return-multiple-values-in-python%2F&amp;linkname=%D0%92%D0%BE%D0%B7%D0%B2%D1%80%D0%B0%D1%82%20%D0%BD%D0%B5%D1%81%D0%BA%D0%BE%D0%BB%D1%8C%D0%BA%D0%B8%D1%85%20%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9%20%D0%B2%20%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8F%D1%85%20Python" title="VK" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_twitter" href="https://www.addtoany.com/add_to/twitter?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fhow-to-return-multiple-values-in-python%2F&amp;linkname=%D0%92%D0%BE%D0%B7%D0%B2%D1%80%D0%B0%D1%82%20%D0%BD%D0%B5%D1%81%D0%BA%D0%BE%D0%BB%D1%8C%D0%BA%D0%B8%D1%85%20%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9%20%D0%B2%20%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8F%D1%85%20Python" title="Twitter" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_email" href="https://www.addtoany.com/add_to/email?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fhow-to-return-multiple-values-in-python%2F&amp;linkname=%D0%92%D0%BE%D0%B7%D0%B2%D1%80%D0%B0%D1%82%20%D0%BD%D0%B5%D1%81%D0%BA%D0%BE%D0%BB%D1%8C%D0%BA%D0%B8%D1%85%20%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9%20%D0%B2%20%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8F%D1%85%20Python" title="Email" rel="nofollow noopener" target="_blank"></a><a class="a2a_dd addtoany_share_save addtoany_share" href="https://www.addtoany.com/share#url=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fhow-to-return-multiple-values-in-python%2F&#038;title=%D0%92%D0%BE%D0%B7%D0%B2%D1%80%D0%B0%D1%82%20%D0%BD%D0%B5%D1%81%D0%BA%D0%BE%D0%BB%D1%8C%D0%BA%D0%B8%D1%85%20%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9%20%D0%B2%20%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8F%D1%85%20Python" data-a2a-url="https://python.ivan-shamaev.ru/how-to-return-multiple-values-in-python/" data-a2a-title="Возврат нескольких значений в функциях Python"></a></p><p>В Python мы можем возвращать несколько значений из функции. Ниже приведены различные способы</p>
<h1>Использование объекта (object)</h1>
<p>Это похоже на C/C++ и Java, мы можем создать класс (в C, структуру) для хранения нескольких значений и возврата объекта класса.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python"># A Python program to return multiple 
# values from a method using class
class Test:
    def __init__(self):
        self.str = "string example"
        self.x = 20   
  
# This function returns an object of Test
def fun():
    return Test()
      
# Driver code to test above method
t = fun() 
print(t.str)
print(t.x)</pre>
<p><strong>Результат работы кода:</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">string example
20</pre>
<h1>Использование кортежа (tuple)</h1>
<p>Кортеж представляет собой последовательность элементов, разделенных запятыми. Он создается с или без (). Кортежи неизменны.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python"># A Python program to return multiple 
# values from a method using tuple
  
# This function returns a tuple
def fun():
    str = "string&nbsp;example"
    x   = 20
    return str, x;  # Return tuple, we could also
                    # write (str, x)
  
# Driver code to test above method
str, x = fun() # Assign returned tuple
print(str)
print(x)</pre>
<p><strong>Результат работы кода:</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">string&nbsp;example
20</pre>
<h1>Использование списка (list)</h1>
<p>Список похож на массив элементов, созданный с помощью квадратных скобок. Они отличаются от массивов тем, что могут содержать элементы разных типов. Списки отличаются от кортежей тем, что они изменяемы.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python"># A Python program to return multiple 
# values from a method using list
  
# This function returns a list
def fun():
    str = "string&nbsp;example"
    x = 20   
    return [str, x];  
  
# Driver code to test above method
list = fun() 
print(list)</pre>
<p><strong>Результат работы кода:</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">['string&nbsp;example', 20]</pre>
<h1>Использование словаря (dictionary)</h1>
<p>Словарь похож на хэш или карту на других языках.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python"># A Python program to return multiple 
# values from a method using dictionary
  
# This function returns a dictionary
def fun():
    d = dict(); 
    d['str'] = "string&nbsp;example"
    d['x']   = 20
    return d
  
# Driver code to test above method
d = fun() 
print(d)</pre>
<p><strong>Результат работы кода:</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">{'x': 20, 'str': 'string&nbsp;example'}</pre>
<h1>Использование класса данных (Data Class)</h1>
<p>В Python 3.7 и более поздних версиях класс данных можно использовать для возврата класса с автоматически добавленными уникальными методами. Модуль класса данных имеет декоратор и функции для автоматического добавления сгенерированных специальных методов, таких как __init__() и __repr__() в пользовательские классы.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">from dataclasses import dataclass
  
@dataclass
class Book_list:
    name: str
    perunit_cost: float
    quantity_available: int = 0
          
    # function to calculate total cost    
    def total_cost(self) -&gt; float:
        return self.perunit_cost * self.quantity_available
      
book = Book_list("Introduction to programming.", 300, 3)
x = book.total_cost()
  
# print the total cost
# of the book
print(x)
  
# print book details
print(book)
  
# 900
Book_list(name='Python programming.',
          perunit_cost=200,
          quantity_available=3)</pre>
<p><strong>Результат работы кода:</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">900
Book_list(name='Introduction to programming.', perunit_cost=300, quantity_available=3)
Book_list(name='Python programming.', perunit_cost=200, quantity_available=3)</pre>
<p><a class="a2a_button_telegram" href="https://www.addtoany.com/add_to/telegram?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fhow-to-return-multiple-values-in-python%2F&amp;linkname=%D0%92%D0%BE%D0%B7%D0%B2%D1%80%D0%B0%D1%82%20%D0%BD%D0%B5%D1%81%D0%BA%D0%BE%D0%BB%D1%8C%D0%BA%D0%B8%D1%85%20%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9%20%D0%B2%20%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8F%D1%85%20Python" title="Telegram" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_whatsapp" href="https://www.addtoany.com/add_to/whatsapp?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fhow-to-return-multiple-values-in-python%2F&amp;linkname=%D0%92%D0%BE%D0%B7%D0%B2%D1%80%D0%B0%D1%82%20%D0%BD%D0%B5%D1%81%D0%BA%D0%BE%D0%BB%D1%8C%D0%BA%D0%B8%D1%85%20%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9%20%D0%B2%20%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8F%D1%85%20Python" title="WhatsApp" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fhow-to-return-multiple-values-in-python%2F&amp;linkname=%D0%92%D0%BE%D0%B7%D0%B2%D1%80%D0%B0%D1%82%20%D0%BD%D0%B5%D1%81%D0%BA%D0%BE%D0%BB%D1%8C%D0%BA%D0%B8%D1%85%20%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9%20%D0%B2%20%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8F%D1%85%20Python" title="Facebook" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_linkedin" href="https://www.addtoany.com/add_to/linkedin?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fhow-to-return-multiple-values-in-python%2F&amp;linkname=%D0%92%D0%BE%D0%B7%D0%B2%D1%80%D0%B0%D1%82%20%D0%BD%D0%B5%D1%81%D0%BA%D0%BE%D0%BB%D1%8C%D0%BA%D0%B8%D1%85%20%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9%20%D0%B2%20%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8F%D1%85%20Python" title="LinkedIn" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_vk" href="https://www.addtoany.com/add_to/vk?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fhow-to-return-multiple-values-in-python%2F&amp;linkname=%D0%92%D0%BE%D0%B7%D0%B2%D1%80%D0%B0%D1%82%20%D0%BD%D0%B5%D1%81%D0%BA%D0%BE%D0%BB%D1%8C%D0%BA%D0%B8%D1%85%20%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9%20%D0%B2%20%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8F%D1%85%20Python" title="VK" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_twitter" href="https://www.addtoany.com/add_to/twitter?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fhow-to-return-multiple-values-in-python%2F&amp;linkname=%D0%92%D0%BE%D0%B7%D0%B2%D1%80%D0%B0%D1%82%20%D0%BD%D0%B5%D1%81%D0%BA%D0%BE%D0%BB%D1%8C%D0%BA%D0%B8%D1%85%20%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9%20%D0%B2%20%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8F%D1%85%20Python" title="Twitter" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_email" href="https://www.addtoany.com/add_to/email?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fhow-to-return-multiple-values-in-python%2F&amp;linkname=%D0%92%D0%BE%D0%B7%D0%B2%D1%80%D0%B0%D1%82%20%D0%BD%D0%B5%D1%81%D0%BA%D0%BE%D0%BB%D1%8C%D0%BA%D0%B8%D1%85%20%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9%20%D0%B2%20%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8F%D1%85%20Python" title="Email" rel="nofollow noopener" target="_blank"></a><a class="a2a_dd addtoany_share_save addtoany_share" href="https://www.addtoany.com/share#url=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fhow-to-return-multiple-values-in-python%2F&#038;title=%D0%92%D0%BE%D0%B7%D0%B2%D1%80%D0%B0%D1%82%20%D0%BD%D0%B5%D1%81%D0%BA%D0%BE%D0%BB%D1%8C%D0%BA%D0%B8%D1%85%20%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B9%20%D0%B2%20%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D1%8F%D1%85%20Python" data-a2a-url="https://python.ivan-shamaev.ru/how-to-return-multiple-values-in-python/" data-a2a-title="Возврат нескольких значений в функциях Python"></a></p><p>Сообщение <a href="https://python.ivan-shamaev.ru/how-to-return-multiple-values-in-python/">Возврат нескольких значений в функциях Python</a> появились сначала на <a href="https://python.ivan-shamaev.ru">Python 3 | Data Science | Нейронные сети | AI - Искусственный Интеллект</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://python.ivan-shamaev.ru/how-to-return-multiple-values-in-python/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Создание Web-приложения Flask и деплой с помощью Docker Compose &#038; Dockerfile</title>
		<link>https://python.ivan-shamaev.ru/run-install-deploy-flask-web-app-docker-dockerfile-compose/</link>
					<comments>https://python.ivan-shamaev.ru/run-install-deploy-flask-web-app-docker-dockerfile-compose/#respond</comments>
		
		<dc:creator><![CDATA[Шамаев Иван]]></dc:creator>
		<pubDate>Sat, 23 Apr 2022 19:50:00 +0000</pubDate>
				<category><![CDATA[Введение в Python 3]]></category>
		<category><![CDATA[flask docker compose]]></category>
		<category><![CDATA[flask sqlalchemy]]></category>
		<category><![CDATA[python flask]]></category>
		<category><![CDATA[python flask app]]></category>
		<category><![CDATA[python flask build image]]></category>
		<category><![CDATA[python flask deploy]]></category>
		<category><![CDATA[python flask docker]]></category>
		<category><![CDATA[python flask dockerfile]]></category>
		<category><![CDATA[python flask web]]></category>
		<category><![CDATA[python flask приложение]]></category>
		<guid isPermaLink="false">https://python.ivan-shamaev.ru/?p=1602</guid>

					<description><![CDATA[<p>Краткое введение в Flask Flask — это удобный для начинающих веб-фреймворк с открытым исходным кодом, построенный на языке программирования Python. Flask подходит, если вы хотите быстро разработать приложение с легкой кодовой базой. Flask разрабатывает Армин Ронахер, возглавляющий международную группу энтузиастов Python под названием Pocco. Flask основан на наборе инструментов Werkzeug WSGI и механизме шаблонов Jinja2. [&#8230;]</p>
<p>Сообщение <a href="https://python.ivan-shamaev.ru/run-install-deploy-flask-web-app-docker-dockerfile-compose/">Создание Web-приложения Flask и деплой с помощью Docker Compose &#038; Dockerfile</a> появились сначала на <a href="https://python.ivan-shamaev.ru">Python 3 | Data Science | Нейронные сети | AI - Искусственный Интеллект</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><a class="a2a_button_telegram" href="https://www.addtoany.com/add_to/telegram?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Frun-install-deploy-flask-web-app-docker-dockerfile-compose%2F&amp;linkname=%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5%20Web-%D0%BF%D1%80%D0%B8%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F%20Flask%20%D0%B8%20%D0%B4%D0%B5%D0%BF%D0%BB%D0%BE%D0%B9%20%D1%81%20%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E%20Docker%20Compose%20%26%20Dockerfile" title="Telegram" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_whatsapp" href="https://www.addtoany.com/add_to/whatsapp?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Frun-install-deploy-flask-web-app-docker-dockerfile-compose%2F&amp;linkname=%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5%20Web-%D0%BF%D1%80%D0%B8%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F%20Flask%20%D0%B8%20%D0%B4%D0%B5%D0%BF%D0%BB%D0%BE%D0%B9%20%D1%81%20%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E%20Docker%20Compose%20%26%20Dockerfile" title="WhatsApp" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Frun-install-deploy-flask-web-app-docker-dockerfile-compose%2F&amp;linkname=%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5%20Web-%D0%BF%D1%80%D0%B8%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F%20Flask%20%D0%B8%20%D0%B4%D0%B5%D0%BF%D0%BB%D0%BE%D0%B9%20%D1%81%20%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E%20Docker%20Compose%20%26%20Dockerfile" title="Facebook" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_linkedin" href="https://www.addtoany.com/add_to/linkedin?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Frun-install-deploy-flask-web-app-docker-dockerfile-compose%2F&amp;linkname=%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5%20Web-%D0%BF%D1%80%D0%B8%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F%20Flask%20%D0%B8%20%D0%B4%D0%B5%D0%BF%D0%BB%D0%BE%D0%B9%20%D1%81%20%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E%20Docker%20Compose%20%26%20Dockerfile" title="LinkedIn" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_vk" href="https://www.addtoany.com/add_to/vk?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Frun-install-deploy-flask-web-app-docker-dockerfile-compose%2F&amp;linkname=%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5%20Web-%D0%BF%D1%80%D0%B8%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F%20Flask%20%D0%B8%20%D0%B4%D0%B5%D0%BF%D0%BB%D0%BE%D0%B9%20%D1%81%20%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E%20Docker%20Compose%20%26%20Dockerfile" title="VK" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_twitter" href="https://www.addtoany.com/add_to/twitter?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Frun-install-deploy-flask-web-app-docker-dockerfile-compose%2F&amp;linkname=%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5%20Web-%D0%BF%D1%80%D0%B8%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F%20Flask%20%D0%B8%20%D0%B4%D0%B5%D0%BF%D0%BB%D0%BE%D0%B9%20%D1%81%20%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E%20Docker%20Compose%20%26%20Dockerfile" title="Twitter" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_email" href="https://www.addtoany.com/add_to/email?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Frun-install-deploy-flask-web-app-docker-dockerfile-compose%2F&amp;linkname=%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5%20Web-%D0%BF%D1%80%D0%B8%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F%20Flask%20%D0%B8%20%D0%B4%D0%B5%D0%BF%D0%BB%D0%BE%D0%B9%20%D1%81%20%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E%20Docker%20Compose%20%26%20Dockerfile" title="Email" rel="nofollow noopener" target="_blank"></a><a class="a2a_dd addtoany_share_save addtoany_share" href="https://www.addtoany.com/share#url=https%3A%2F%2Fpython.ivan-shamaev.ru%2Frun-install-deploy-flask-web-app-docker-dockerfile-compose%2F&#038;title=%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5%20Web-%D0%BF%D1%80%D0%B8%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F%20Flask%20%D0%B8%20%D0%B4%D0%B5%D0%BF%D0%BB%D0%BE%D0%B9%20%D1%81%20%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E%20Docker%20Compose%20%26%20Dockerfile" data-a2a-url="https://python.ivan-shamaev.ru/run-install-deploy-flask-web-app-docker-dockerfile-compose/" data-a2a-title="Создание Web-приложения Flask и деплой с помощью Docker Compose &amp; Dockerfile"></a></p><h1>Краткое введение в Flask</h1>
<p><strong>Flask</strong> — это удобный для начинающих веб-фреймворк с открытым исходным кодом, построенный на языке программирования Python. Flask подходит, если вы хотите быстро разработать приложение с легкой кодовой базой.</p>
<p><strong>Flask</strong> разрабатывает Армин Ронахер, возглавляющий международную группу энтузиастов Python под названием Pocco. Flask основан на наборе инструментов <strong>Werkzeug WSGI</strong> и механизме шаблонов <strong>Jinja2</strong>. Оба являются <strong>проектами Pocco</strong>.</p>
<p>Интерфейс шлюза веб-сервера (WSGI) был принят в качестве стандарта для разработки веб-приложений Python. <strong>WSGI</strong> — это спецификация универсального интерфейса между веб-сервером и веб-приложениями.</p>
<p><strong>Jinja2</strong> — популярный движок шаблонов для Python. Система веб-шаблонов объединяет шаблон с определенным источником данных для отображения динамических веб-страниц.</p>
<h1>Что будет рассмотрено в статье &#171;Python Flask App &#8212; Docker &#8212; Tutorial&#187;</h1>
<p>В этой статье будет рассмотрено создание простого web-приложения Flask, build образа с помощью Dockerfile &amp; Docker, а также развертывание образа в контейнере с помощью Docker-Compose.</p>
<p><strong>Docker</strong> — это инструмент с открытым исходным кодом, который позволяет вам контейнеризовать ваши приложения. Он помогает создавать, тестировать, развертывать и управлять вашими приложениями в изолированной среде. В этой статье будут рассмотрены все шаги, кроме тестирования.</p>
<h1>Создание приложения Flask</h1>
<p>Давайте приступим к созданию простого приложения Flask, которое будет отображать сообщение в браузере.</p>
<p>Создадим папку с именем flask_docker для нашего приложения:</p>
<p><code class="EnlighterJSRAW" data-enlighter-language="generic">mkdir flask_docker</code></p>
<p>Переходим внутрь папки:</p>
<p><code class="EnlighterJSRAW" data-enlighter-language="generic">cd flask_docker</code></p>
<p>Если у Вас не установлена виртуальная среда venv, то необходимо ее исталлировать командой:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">sudo apt install python3.8-venv</pre>
<p>Далее создаем виртуальную среду myenv</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">python3 -m venv myenv</pre>
<p>Должна появиться директория myenv. Запускаем команду активации виртуальной среды:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">source myenv/bin/activate</pre>
<p>Внутри активированной виртуальной среды запускаем установку библиотеки Flask:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">pip install Flask</pre>
<p>После успешной установки Flask следующим шагом будет создание файла Python <strong>app.py</strong>, который будет получать запросы и отправлять ответы для нашего web-приложения. Для этого создадим директорию <strong>webapp</strong>:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">mkdir webapp

cd webapp</pre>
<p>Далее нам нужно в директории <strong>webapp</strong> создать файл файл <strong>app.py</strong> со следущим кодом внутри:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">from flask import Flask

app = Flask(__name__)

@app.route('/')
def home():
    return '&lt;h1&gt;Hello, World!&lt;/h1&gt;'

if __name__ == "__main__":
    app.run(debug=True, host='0.0.0.0', port=5000)</pre>
<p>В приведенном выше фрагменте кода аннотация служит для направления запроса на URL-адрес. В указанном примере URL-адрес представляет собой домашнюю страницу <code class="EnlighterJSRAW" data-enlighter-language="generic">@app.route/</code></p>
<p>Эта аннотация также имеет method параметр, который принимает список методов HTTP, чтобы указать разрешенный метод для заданного URL-адреса. По умолчанию (как показано) это GET метод, он является единственным разрешенным методом HTTP.</p>
<p>Вот пример того, как вы можете указать, что ваш маршрут должен разрешать оба метода GET и POST для запроса HTTP:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">@app.route('/', methods=['POST', 'GET'])</pre>
<p>Функция <code class="EnlighterJSRAW" data-enlighter-language="generic">home()</code>, связанная с URL-адресом, указанным в аннотации, будет выполняться при отправке запроса на этот маршрут. Функция возвращает строку текста <code class="EnlighterJSRAW" data-enlighter-language="generic">'&lt;h1&gt;Hello, World!&lt;/h1&gt;'</code>.</p>
<h2>Как создать Python requirement.txt файл для Docker</h2>
<p>Файл <code class="EnlighterJSRAW" data-enlighter-language="generic">requirement.txt</code> содержит список пакетов и зависимостей, необходимых для запуска вашего проекта, а также их соответствующие версии, требуемые для корректной работы приложения.</p>
<p>Внутри активированной venv выполните следующую команду в терминале:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">pip freeze &gt; requirements.txt</pre>
<p>Эта команда сгенерирует имена пакетов и их соответствующих версий, которые вы установили, а также некоторые другие встроенные зависимости, которые запускают ваше приложение Flask. Затем он сохраняет их в файле с именем requirements.txt</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">click==8.1.2
Flask==2.1.1
importlib-metadata==4.11.3
itsdangerous==2.1.2
Jinja2==3.1.1
MarkupSafe==2.1.1
Werkzeug==2.1.1
zipp==3.8.0</pre>
<p>В зависимости от сложности вашего проекта и установленных пакетов содержимое этого файла будет варьироваться от проекта к проекту.</p>
<p>Номера версий, сгенерированные в файле требований, могут отличаться от указанных здесь, потому что они зависят от типа приложения, которое вы создаете, и версий пакетов, которые вы установили при создании своего приложения.</p>
<p>Вы можете проверить, работает ли приложение, прежде чем приступить к его контейнеризации. Запустите эту команду на своем терминале в корневом каталоге:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">python app.py</pre>
<h2>Настройка Dockerfile для создания образа приложения Flask</h2>
<p>Создайте файл Dockerfile внутри webapp. Добавьте в файл следующий фрагмент кода:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic"># start by pulling the python image
FROM python:3.8-alpine

# copy the requirements file into the image
COPY ./requirements.txt /app/requirements.txt

# switch working directory
WORKDIR /app

# install the dependencies and packages in the requirements file
RUN pip install -r requirements.txt

# copy every content from the local file to the image
COPY . /app

# configure the container to run in an executed manner
ENTRYPOINT ["python"]

CMD ["app.py"]</pre>
<p>Давайте рассмотрим инструкции в этом Dockerfile:</p>
<ul>
<li><code class="EnlighterJSRAW" data-enlighter-language="generic">FROM python:3.8-alpine</code> &#8212; Поскольку Docker позволяет нам наследовать существующие образы, мы устанавливаем образ Python и устанавливаем его в наш образ Docker. Alpine &#8212; это легкий дистрибутив Linux, который будет служить ОС, на которую мы устанавливаем наш образ</li>
<li><code class="EnlighterJSRAW" data-enlighter-language="generic">COPY ./requirements.txt /app/requirements.txt</code><span style="font-size: 17px;"> &#8212; Здесь мы копируем requirements файл и его содержимое (сгенерированные пакеты и зависимости) в app папку образа.</span></li>
<li><code class="EnlighterJSRAW" data-enlighter-language="generic">WORKDIR /app</code><span style="font-size: 17px;"> &#8212; </span><span style="font-size: 17px;">мы приступаем к установке рабочего каталога как app, который будет корневым каталогом нашего приложения в контейнере.</span></li>
<li><code class="EnlighterJSRAW" data-enlighter-language="generic">RUN pip install -r requirements.txt</code><span style="font-size: 17px;"> &#8212; </span><span style="font-size: 17px;">эта команда устанавливает все зависимости, определенные в файле requirements.txt в наше приложение внутри контейнера.</span></li>
<li><code class="EnlighterJSRAW" data-enlighter-language="generic">COPY . /app</code><span style="font-size: 17px;"> &#8212; </span><span style="font-size: 17px;">это копирует все остальные файлы и их соответствующее содержимое в app папку, которая является корневым каталогом нашего приложения в контейнере.</span></li>
<li><code class="EnlighterJSRAW" data-enlighter-language="generic">ENTRYPOINT ["python"]</code><span style="font-size: 17px;"> &#8212; </span><span style="font-size: 17px;">это команда, которая запускает приложение в контейнере.</span></li>
<li><code class="EnlighterJSRAW" data-enlighter-language="generic">CMD ["app.py"]</code><span style="font-size: 17px;"> &#8212; </span><span style="font-size: 17px;">Наконец, это добавляет список параметров к EntryPoint параметру для выполнения команды, запускающей приложение. Это похоже на то, как вы запускаете приложение Python на своем терминале с помощью команды python app.py</span></li>
</ul>
<h2>Создадим образ (image) Docker</h2>
<p>Выйдем из активированной среды venv:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">deactivate</pre>
<p>Для этого необходимо в командном окне (не в активированной среде), запустить команду:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">sudo docker image build -t flask_docker .</pre>
<p>Точка в конце обязательна, не пропустите её.</p>
<h2>Запуск контейнера из образа в Docker</h2>
<p>После успешного билда образа необходимо запустить экземляр образа в Docker. Сделать это можно следующей командой:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">sudo docker run -p 5000:5000 -d flask_docker</pre>
<p>Эта команда запускает контейнер и его встроенное приложение, каждое из которых использует подход с привязкой к порту. Первая часть 5000 — это порт, который мы выделяем контейнеру на нашей машине. Второй 5000 — это порт, на котором приложение будет работать в контейнере.</p>
<p>Вот вывод нашего приложения, когда мы отправляем запрос в нашем браузере:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">localhost:5000</pre>
<h3>Предупреждение</h3>
<blockquote><p><span style="color: #0000ff;">WARNING: Running pip as the &#8216;root&#8217; user can result in broken permissions and conflicting behaviour with the system package manager. It is recommended to use a virtual environment instead: https://pip.pypa.io/warnings/venv</span></p></blockquote>
<p>туду</p>
<h2>Развертывание Flask App, PostgreSQL, PGAdmin с помощью Docker-Compose</h2>
<p>Для создания приложения необходимо добавить базу данных postgresql, панель управления pgadmin, а также пропишем процесс сборки образа на основе нашего Dockerfile.</p>
<p><strong>Файл docker-compose.yml:</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">version: '3.9'

services:  
  flask_web:
    container_name: flask_web_container
    build: .
    ports:
      - 5000:5000
    restart: unless-stopped

  postgres:
    env_file: ./docker/.env-postgresql
    container_name: postgres_flask_container
    image: postgres:14
    volumes:
       - flaskdb:/var/lib/postgresql/data
    ports:
      - 5432:5432
    restart: unless-stopped
    networks:
      - backend
  
  pgadmin:
    container_name: pgadmin_container
    image: dpage/pgadmin4
    environment:
      PGADMIN_DEFAULT_EMAIL: ${PGADMIN_DEFAULT_EMAIL:-qlik@ivan-shamaev.ru}
      PGADMIN_DEFAULT_PASSWORD: ${PGADMIN_DEFAULT_PASSWORD:-A-&gt;V9&gt;pS6HJ~xY8d}
      PGADMIN_CONFIG_SERVER_MODE: 'False'
    volumes:
       - pgadmin:/var/lib/pgadmin
    ports:
      - "${PGADMIN_PORT:-5050}:80"
    restart: unless-stopped
    networks:
      - backend

volumes:
    flaskdb:
      driver: local
    pgadmin:
      driver: local

networks:
  backend:
    driver: bridge</pre>
<p><strong>Файл docker/.env-postgresql:</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic"># database engine specific environment variables
DATABASE_PORT=5432
DATABASE_DIALECT=postgresql
POSTGRES_DB=flaskdb
POSTGRES_USER=flaskuser
POSTGRES_PASSWORD=flaskpassword</pre>
<p>Доступ в pgadmin <a href="http://localhost:5050/browser/" target="_blank" rel="noopener" data-wplink-url-error="true">http://localhost:5050/browser/</a></p>
<h3>Скачать код первого этапа для развертывания flask приложения в docker</h3>
<p>Получить код пройденного этапа можно в github <a href="https://github.com/python-flask-app/deploy-python-flask-app-tutorial/tree/main/Example%201" target="_blank" rel="noopener">deploy-python-flask-app-tutorial/Example 1/</a>.</p>
<p><a class="a2a_button_telegram" href="https://www.addtoany.com/add_to/telegram?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Frun-install-deploy-flask-web-app-docker-dockerfile-compose%2F&amp;linkname=%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5%20Web-%D0%BF%D1%80%D0%B8%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F%20Flask%20%D0%B8%20%D0%B4%D0%B5%D0%BF%D0%BB%D0%BE%D0%B9%20%D1%81%20%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E%20Docker%20Compose%20%26%20Dockerfile" title="Telegram" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_whatsapp" href="https://www.addtoany.com/add_to/whatsapp?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Frun-install-deploy-flask-web-app-docker-dockerfile-compose%2F&amp;linkname=%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5%20Web-%D0%BF%D1%80%D0%B8%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F%20Flask%20%D0%B8%20%D0%B4%D0%B5%D0%BF%D0%BB%D0%BE%D0%B9%20%D1%81%20%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E%20Docker%20Compose%20%26%20Dockerfile" title="WhatsApp" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Frun-install-deploy-flask-web-app-docker-dockerfile-compose%2F&amp;linkname=%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5%20Web-%D0%BF%D1%80%D0%B8%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F%20Flask%20%D0%B8%20%D0%B4%D0%B5%D0%BF%D0%BB%D0%BE%D0%B9%20%D1%81%20%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E%20Docker%20Compose%20%26%20Dockerfile" title="Facebook" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_linkedin" href="https://www.addtoany.com/add_to/linkedin?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Frun-install-deploy-flask-web-app-docker-dockerfile-compose%2F&amp;linkname=%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5%20Web-%D0%BF%D1%80%D0%B8%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F%20Flask%20%D0%B8%20%D0%B4%D0%B5%D0%BF%D0%BB%D0%BE%D0%B9%20%D1%81%20%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E%20Docker%20Compose%20%26%20Dockerfile" title="LinkedIn" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_vk" href="https://www.addtoany.com/add_to/vk?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Frun-install-deploy-flask-web-app-docker-dockerfile-compose%2F&amp;linkname=%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5%20Web-%D0%BF%D1%80%D0%B8%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F%20Flask%20%D0%B8%20%D0%B4%D0%B5%D0%BF%D0%BB%D0%BE%D0%B9%20%D1%81%20%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E%20Docker%20Compose%20%26%20Dockerfile" title="VK" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_twitter" href="https://www.addtoany.com/add_to/twitter?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Frun-install-deploy-flask-web-app-docker-dockerfile-compose%2F&amp;linkname=%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5%20Web-%D0%BF%D1%80%D0%B8%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F%20Flask%20%D0%B8%20%D0%B4%D0%B5%D0%BF%D0%BB%D0%BE%D0%B9%20%D1%81%20%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E%20Docker%20Compose%20%26%20Dockerfile" title="Twitter" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_email" href="https://www.addtoany.com/add_to/email?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Frun-install-deploy-flask-web-app-docker-dockerfile-compose%2F&amp;linkname=%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5%20Web-%D0%BF%D1%80%D0%B8%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F%20Flask%20%D0%B8%20%D0%B4%D0%B5%D0%BF%D0%BB%D0%BE%D0%B9%20%D1%81%20%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E%20Docker%20Compose%20%26%20Dockerfile" title="Email" rel="nofollow noopener" target="_blank"></a><a class="a2a_dd addtoany_share_save addtoany_share" href="https://www.addtoany.com/share#url=https%3A%2F%2Fpython.ivan-shamaev.ru%2Frun-install-deploy-flask-web-app-docker-dockerfile-compose%2F&#038;title=%D0%A1%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5%20Web-%D0%BF%D1%80%D0%B8%D0%BB%D0%BE%D0%B6%D0%B5%D0%BD%D0%B8%D1%8F%20Flask%20%D0%B8%20%D0%B4%D0%B5%D0%BF%D0%BB%D0%BE%D0%B9%20%D1%81%20%D0%BF%D0%BE%D0%BC%D0%BE%D1%89%D1%8C%D1%8E%20Docker%20Compose%20%26%20Dockerfile" data-a2a-url="https://python.ivan-shamaev.ru/run-install-deploy-flask-web-app-docker-dockerfile-compose/" data-a2a-title="Создание Web-приложения Flask и деплой с помощью Docker Compose &amp; Dockerfile"></a></p><p>Сообщение <a href="https://python.ivan-shamaev.ru/run-install-deploy-flask-web-app-docker-dockerfile-compose/">Создание Web-приложения Flask и деплой с помощью Docker Compose &#038; Dockerfile</a> появились сначала на <a href="https://python.ivan-shamaev.ru">Python 3 | Data Science | Нейронные сети | AI - Искусственный Интеллект</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://python.ivan-shamaev.ru/run-install-deploy-flask-web-app-docker-dockerfile-compose/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Пример скрипта для расчета индикаторов TA_LIB Python</title>
		<link>https://python.ivan-shamaev.ru/example-script-calculate-ta-lib-indicators/</link>
					<comments>https://python.ivan-shamaev.ru/example-script-calculate-ta-lib-indicators/#comments</comments>
		
		<dc:creator><![CDATA[Шамаев Иван]]></dc:creator>
		<pubDate>Mon, 08 Jun 2020 06:31:59 +0000</pubDate>
				<category><![CDATA[Введение в Python 3]]></category>
		<category><![CDATA[talib]]></category>
		<category><![CDATA[talib python]]></category>
		<category><![CDATA[расчет индикаторов]]></category>
		<guid isPermaLink="false">https://python.ivan-shamaev.ru/?p=1196</guid>

					<description><![CDATA[<p>Есть библиотека для расчета индикаторов по техническому анализу. Ниже пример (не все идеально, как ориентир). Ссылка на библиотеку https://github.com/mrjbq7/ta-lib #===================================================== # Импорт библиотек #===================================================== from iexfinance.stocks import get_historical_data import datetime import pandas as pd from pandas import DataFrame import talib as ta import matplotlib.pyplot as plt import seaborn as sns import psycopg2 import csv from [&#8230;]</p>
<p>Сообщение <a href="https://python.ivan-shamaev.ru/example-script-calculate-ta-lib-indicators/">Пример скрипта для расчета индикаторов TA_LIB Python</a> появились сначала на <a href="https://python.ivan-shamaev.ru">Python 3 | Data Science | Нейронные сети | AI - Искусственный Интеллект</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><a class="a2a_button_telegram" href="https://www.addtoany.com/add_to/telegram?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fexample-script-calculate-ta-lib-indicators%2F&amp;linkname=%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%20%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B0%20%D0%B4%D0%BB%D1%8F%20%D1%80%D0%B0%D1%81%D1%87%D0%B5%D1%82%D0%B0%20%D0%B8%D0%BD%D0%B4%D0%B8%D0%BA%D0%B0%D1%82%D0%BE%D1%80%D0%BE%D0%B2%20TA_LIB%20Python" title="Telegram" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_whatsapp" href="https://www.addtoany.com/add_to/whatsapp?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fexample-script-calculate-ta-lib-indicators%2F&amp;linkname=%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%20%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B0%20%D0%B4%D0%BB%D1%8F%20%D1%80%D0%B0%D1%81%D1%87%D0%B5%D1%82%D0%B0%20%D0%B8%D0%BD%D0%B4%D0%B8%D0%BA%D0%B0%D1%82%D0%BE%D1%80%D0%BE%D0%B2%20TA_LIB%20Python" title="WhatsApp" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fexample-script-calculate-ta-lib-indicators%2F&amp;linkname=%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%20%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B0%20%D0%B4%D0%BB%D1%8F%20%D1%80%D0%B0%D1%81%D1%87%D0%B5%D1%82%D0%B0%20%D0%B8%D0%BD%D0%B4%D0%B8%D0%BA%D0%B0%D1%82%D0%BE%D1%80%D0%BE%D0%B2%20TA_LIB%20Python" title="Facebook" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_linkedin" href="https://www.addtoany.com/add_to/linkedin?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fexample-script-calculate-ta-lib-indicators%2F&amp;linkname=%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%20%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B0%20%D0%B4%D0%BB%D1%8F%20%D1%80%D0%B0%D1%81%D1%87%D0%B5%D1%82%D0%B0%20%D0%B8%D0%BD%D0%B4%D0%B8%D0%BA%D0%B0%D1%82%D0%BE%D1%80%D0%BE%D0%B2%20TA_LIB%20Python" title="LinkedIn" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_vk" href="https://www.addtoany.com/add_to/vk?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fexample-script-calculate-ta-lib-indicators%2F&amp;linkname=%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%20%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B0%20%D0%B4%D0%BB%D1%8F%20%D1%80%D0%B0%D1%81%D1%87%D0%B5%D1%82%D0%B0%20%D0%B8%D0%BD%D0%B4%D0%B8%D0%BA%D0%B0%D1%82%D0%BE%D1%80%D0%BE%D0%B2%20TA_LIB%20Python" title="VK" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_twitter" href="https://www.addtoany.com/add_to/twitter?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fexample-script-calculate-ta-lib-indicators%2F&amp;linkname=%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%20%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B0%20%D0%B4%D0%BB%D1%8F%20%D1%80%D0%B0%D1%81%D1%87%D0%B5%D1%82%D0%B0%20%D0%B8%D0%BD%D0%B4%D0%B8%D0%BA%D0%B0%D1%82%D0%BE%D1%80%D0%BE%D0%B2%20TA_LIB%20Python" title="Twitter" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_email" href="https://www.addtoany.com/add_to/email?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fexample-script-calculate-ta-lib-indicators%2F&amp;linkname=%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%20%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B0%20%D0%B4%D0%BB%D1%8F%20%D1%80%D0%B0%D1%81%D1%87%D0%B5%D1%82%D0%B0%20%D0%B8%D0%BD%D0%B4%D0%B8%D0%BA%D0%B0%D1%82%D0%BE%D1%80%D0%BE%D0%B2%20TA_LIB%20Python" title="Email" rel="nofollow noopener" target="_blank"></a><a class="a2a_dd addtoany_share_save addtoany_share" href="https://www.addtoany.com/share#url=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fexample-script-calculate-ta-lib-indicators%2F&#038;title=%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%20%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B0%20%D0%B4%D0%BB%D1%8F%20%D1%80%D0%B0%D1%81%D1%87%D0%B5%D1%82%D0%B0%20%D0%B8%D0%BD%D0%B4%D0%B8%D0%BA%D0%B0%D1%82%D0%BE%D1%80%D0%BE%D0%B2%20TA_LIB%20Python" data-a2a-url="https://python.ivan-shamaev.ru/example-script-calculate-ta-lib-indicators/" data-a2a-title="Пример скрипта для расчета индикаторов TA_LIB Python"></a></p><p>Есть библиотека для расчета индикаторов по техническому анализу. Ниже пример (не все идеально, как ориентир). Ссылка на библиотеку <a href="https://github.com/mrjbq7/ta-lib">https://github.com/mrjbq7/ta-lib</a></p>
<pre class="EnlighterJSRAW" data-enlighter-language="generic">#=====================================================
# Импорт библиотек
#=====================================================
from iexfinance.stocks import get_historical_data
import datetime
import pandas as pd
from pandas import DataFrame
import talib as ta
import matplotlib.pyplot as plt
import seaborn as sns
import psycopg2
import csv
from sqlalchemy import create_engine
import json
import requests
from sys import argv
from scipy.signal import argrelextrema
import numpy as np

#=====================================================
# ЗАГРУЗКА ДАННЫХ ИЗ API
#=====================================================
symbol = argv[1]
interval = argv[2]
urltext = 'https://api.binance.com/api/v1/klines?symbol='+symbol+'&amp;interval='+interval
result_req = requests.get(urltext)

result_json = result_req.json()

# Получаем наименования колонок
array_data = []
for row in result_json:
    array_data.append({
                        'open_time':row[0],
                        'date_time':datetime.datetime.fromtimestamp(row[0] / 1e3).strftime('%Y-%m-%d %H:%M:%S'), #utcfromtimestamp fromtimestamp #utcfromtimestamp(ts).strftime('%Y-%m-%d %H:%M:%S')
            'dateformat':datetime.datetime.fromtimestamp(row[0] / 1e3).strftime('%Y.%m.%d %H:%M'),
                        'open':(row[1]),
                        'high':(row[2]),
                        'low':(row[3]),
                        'close':(row[4]),
                        'volume':(row[5])
                        })
    

# Формируем массив data
data = pd.DataFrame(array_data)

multipleCoeff = 1000
data['open']=pd.to_numeric(data['open']).mul(multipleCoeff)
data['high']=pd.to_numeric(data['high']).mul(multipleCoeff)
data['low']=pd.to_numeric(data['low']).mul(multipleCoeff)
data['close']=pd.to_numeric(data['close']).mul(multipleCoeff)
data['volume']=pd.to_numeric(data['volume']).mul(multipleCoeff)

data.index = pd.to_datetime(data.date_time)

#==============================================
# ПОЛУЧАЕМ ПАРАМЕТРЫ ИЗ БАЗЫ ДАННЫХ
#==============================================

# 1. Подключаемся к базе данных PGSQL
conn = psycopg2.connect(dbname='dbname', user='username', 
                        password='your_password', host='96.154.12.134')
# 2. Получаем данные, кладем их в курсор
cursor = conn.cursor()
cursor.execute('select trim(parameter) parameter,value from ddt.calc_settings')

# 3. Пишем paramData[]
paramData = []
for paramRow in cursor:
    paramData.append(paramRow)

# 4. Закрываем курсор
cursor.close()
conn.close()

# 5. Устанавливаем переменные
for row in enumerate(paramData):
    exec("%s=%s" % (row[1][0],row[1][1]))


#=====================================================
# Расчет
#=====================================================

#Фрактал
n_min_max = 5
data['Fractal_UP'] = data.iloc[argrelextrema(data.low.values, np.less_equal, order=n_min_max)[0]]['low']
data['Fractal_Down'] = data.iloc[argrelextrema(data.high.values, np.greater_equal, order=n_min_max)[0]]['high']

# Обнуляем последний элемент массива по фракталу
data['Fractal_UP'].iloc[-1] = np.nan
data['Fractal_Down'].iloc[-1] = np.nan

# Simple Moving Average
data['SMA'] = ta.SMA(data.close, timeperiod = SMA_TimePeriod)

# Exponential Moving Average
data['EMA'] = ta.EMA(data.close, timeperiod = EMA_TimePeriod)

# Bollinger Bands
data['upper_band'], data['middle_band'], data['lower_band'] = ta.BBANDS(data.close, timeperiod = Bollinger_Bands_TimePeriod)

# MACD
data['macd'], data['macdsignal'], data['macdhist'] = ta.MACD(data.close, fastperiod=MACD_fastperiod, slowperiod=MACD_slowperiod, signalperiod=MACD_signalperiod)

# RSI
data['RSI'] = ta.RSI(data.close, timeperiod=RSI_TimePeriod)

# OBV (On Balance Volume)
data['OBV'] = ta.OBV(data.close, data.volume)

#Alligator SMA
data['SMA_green'] = ta.SMA(data.close, timeperiod = SMA_Green_TimePeriod)
data['SMA_red'] = ta.SMA(data.close, timeperiod = SMA_Red_TimePeriod)
data['SMA_blue'] = ta.SMA(data.close, timeperiod = SMA_Blue_TimePeriod)

#Alligator EMA
data['EMA_green'] = ta.EMA(data.close, timeperiod = EMA_Green_TimePeriod)
data['EMA_red'] = ta.EMA(data.close, timeperiod = EMA_Red_TimePeriod)
data['EMA_blue'] = ta.EMA(data.close, timeperiod = EMA_Blue_TimePeriod)

#ADX
data['ADX'] = ta.ADX(data.high, data.low, data.close, timeperiod=ADX_TimePeriod)
data['MINUS_DI'] = ta.MINUS_DI(data.high, data.low, data.close, timeperiod=ADX_TimePeriod)
data['PLUS_DI'] = ta.PLUS_DI(data.high, data.low, data.close, timeperiod=ADX_TimePeriod)

data['TEMA'] = ta.TEMA(data.close, timeperiod=TEMA_TimePeriod)

# Убираем масштабирование
data['open'] = pd.to_numeric(data['open'])/multipleCoeff
data['high'] = pd.to_numeric(data['high'])/multipleCoeff
data['low'] = pd.to_numeric(data['low'])/multipleCoeff
data['close'] = pd.to_numeric(data['close'])/multipleCoeff
data['upper_band'] = pd.to_numeric(data['upper_band'])/multipleCoeff
data['middle_band'] = pd.to_numeric(data['middle_band'])/multipleCoeff
data['lower_band'] = pd.to_numeric(data['lower_band'])/multipleCoeff
data['volume'] = pd.to_numeric(data['volume'])/multipleCoeff
data['OBV'] = pd.to_numeric(data['OBV'])/multipleCoeff
data['SMA'] = pd.to_numeric(data['SMA'])/multipleCoeff
data['EMA'] = pd.to_numeric(data['EMA'])/multipleCoeff
data['macd'] = pd.to_numeric(data['macd'])/multipleCoeff
data['macdsignal'] = pd.to_numeric(data['macdsignal'])/multipleCoeff
data['macdhist'] = pd.to_numeric(data['macdhist'])/multipleCoeff

data['SMA_green'] = pd.to_numeric(data['SMA_green'].shift(periods=SMA_Green_Offset))/multipleCoeff
data['SMA_red'] = pd.to_numeric(data['SMA_red'].shift(periods=SMA_Red_Offset))/multipleCoeff
data['SMA_blue'] = pd.to_numeric(data['SMA_blue'].shift(periods=SMA_Blue_Offset))/multipleCoeff

data['EMA_green'] = pd.to_numeric(data['EMA_green'].shift(periods=EMA_Green_Offset))/multipleCoeff
data['EMA_red'] = pd.to_numeric(data['EMA_red'].shift(periods=EMA_Red_Offset))/multipleCoeff
data['EMA_blue'] = pd.to_numeric(data['EMA_blue'].shift(periods=EMA_Blue_Offset))/multipleCoeff

data['TEMA'] = pd.to_numeric(data['TEMA'])/multipleCoeff

data['Fractal_UP'] = pd.to_numeric(data['Fractal_UP'])/multipleCoeff
data['Fractal_Down'] = pd.to_numeric(data['Fractal_Down'])/multipleCoeff

#=====================================================
# JSON
#=====================================================

jsonstring = data.to_json(orient='records')
print(jsonstring)</pre>
<p>Вызвать скрипт можно из PHP, вот скрипт:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="php">&lt;?php	

  //Получаем переменные из URL запроса
  if (isset($_GET['symbol']) and isset($_GET['interval'])) {
    $symbol   = htmlspecialchars($_GET["symbol"]);
    $interval   = htmlspecialchars($_GET["interval"]);
  }
  else {
    err();
  }        

  echo exec("python3 /home/admin/web/domain-name.ru/public_html/panel/98hlkjg987gtkbjbIUYG98iub/python_api/5_indicators.py ".$symbol." ".$interval);
                                                                                                                                                     
?&gt;</pre>
<p><a class="a2a_button_telegram" href="https://www.addtoany.com/add_to/telegram?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fexample-script-calculate-ta-lib-indicators%2F&amp;linkname=%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%20%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B0%20%D0%B4%D0%BB%D1%8F%20%D1%80%D0%B0%D1%81%D1%87%D0%B5%D1%82%D0%B0%20%D0%B8%D0%BD%D0%B4%D0%B8%D0%BA%D0%B0%D1%82%D0%BE%D1%80%D0%BE%D0%B2%20TA_LIB%20Python" title="Telegram" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_whatsapp" href="https://www.addtoany.com/add_to/whatsapp?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fexample-script-calculate-ta-lib-indicators%2F&amp;linkname=%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%20%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B0%20%D0%B4%D0%BB%D1%8F%20%D1%80%D0%B0%D1%81%D1%87%D0%B5%D1%82%D0%B0%20%D0%B8%D0%BD%D0%B4%D0%B8%D0%BA%D0%B0%D1%82%D0%BE%D1%80%D0%BE%D0%B2%20TA_LIB%20Python" title="WhatsApp" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fexample-script-calculate-ta-lib-indicators%2F&amp;linkname=%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%20%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B0%20%D0%B4%D0%BB%D1%8F%20%D1%80%D0%B0%D1%81%D1%87%D0%B5%D1%82%D0%B0%20%D0%B8%D0%BD%D0%B4%D0%B8%D0%BA%D0%B0%D1%82%D0%BE%D1%80%D0%BE%D0%B2%20TA_LIB%20Python" title="Facebook" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_linkedin" href="https://www.addtoany.com/add_to/linkedin?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fexample-script-calculate-ta-lib-indicators%2F&amp;linkname=%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%20%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B0%20%D0%B4%D0%BB%D1%8F%20%D1%80%D0%B0%D1%81%D1%87%D0%B5%D1%82%D0%B0%20%D0%B8%D0%BD%D0%B4%D0%B8%D0%BA%D0%B0%D1%82%D0%BE%D1%80%D0%BE%D0%B2%20TA_LIB%20Python" title="LinkedIn" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_vk" href="https://www.addtoany.com/add_to/vk?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fexample-script-calculate-ta-lib-indicators%2F&amp;linkname=%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%20%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B0%20%D0%B4%D0%BB%D1%8F%20%D1%80%D0%B0%D1%81%D1%87%D0%B5%D1%82%D0%B0%20%D0%B8%D0%BD%D0%B4%D0%B8%D0%BA%D0%B0%D1%82%D0%BE%D1%80%D0%BE%D0%B2%20TA_LIB%20Python" title="VK" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_twitter" href="https://www.addtoany.com/add_to/twitter?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fexample-script-calculate-ta-lib-indicators%2F&amp;linkname=%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%20%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B0%20%D0%B4%D0%BB%D1%8F%20%D1%80%D0%B0%D1%81%D1%87%D0%B5%D1%82%D0%B0%20%D0%B8%D0%BD%D0%B4%D0%B8%D0%BA%D0%B0%D1%82%D0%BE%D1%80%D0%BE%D0%B2%20TA_LIB%20Python" title="Twitter" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_email" href="https://www.addtoany.com/add_to/email?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fexample-script-calculate-ta-lib-indicators%2F&amp;linkname=%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%20%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B0%20%D0%B4%D0%BB%D1%8F%20%D1%80%D0%B0%D1%81%D1%87%D0%B5%D1%82%D0%B0%20%D0%B8%D0%BD%D0%B4%D0%B8%D0%BA%D0%B0%D1%82%D0%BE%D1%80%D0%BE%D0%B2%20TA_LIB%20Python" title="Email" rel="nofollow noopener" target="_blank"></a><a class="a2a_dd addtoany_share_save addtoany_share" href="https://www.addtoany.com/share#url=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fexample-script-calculate-ta-lib-indicators%2F&#038;title=%D0%9F%D1%80%D0%B8%D0%BC%D0%B5%D1%80%20%D1%81%D0%BA%D1%80%D0%B8%D0%BF%D1%82%D0%B0%20%D0%B4%D0%BB%D1%8F%20%D1%80%D0%B0%D1%81%D1%87%D0%B5%D1%82%D0%B0%20%D0%B8%D0%BD%D0%B4%D0%B8%D0%BA%D0%B0%D1%82%D0%BE%D1%80%D0%BE%D0%B2%20TA_LIB%20Python" data-a2a-url="https://python.ivan-shamaev.ru/example-script-calculate-ta-lib-indicators/" data-a2a-title="Пример скрипта для расчета индикаторов TA_LIB Python"></a></p><p>Сообщение <a href="https://python.ivan-shamaev.ru/example-script-calculate-ta-lib-indicators/">Пример скрипта для расчета индикаторов TA_LIB Python</a> появились сначала на <a href="https://python.ivan-shamaev.ru">Python 3 | Data Science | Нейронные сети | AI - Искусственный Интеллект</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://python.ivan-shamaev.ru/example-script-calculate-ta-lib-indicators/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>Язык программирования Python 3. Обзор библиотек принципов modules</title>
		<link>https://python.ivan-shamaev.ru/overview-python-programming-language-modules-library-principles/</link>
					<comments>https://python.ivan-shamaev.ru/overview-python-programming-language-modules-library-principles/#respond</comments>
		
		<dc:creator><![CDATA[Шамаев Иван]]></dc:creator>
		<pubDate>Thu, 30 Apr 2020 20:35:04 +0000</pubDate>
				<category><![CDATA[Введение в Python 3]]></category>
		<category><![CDATA[python 3]]></category>
		<category><![CDATA[архитектура Python]]></category>
		<category><![CDATA[библиотеки Python]]></category>
		<category><![CDATA[модули Python]]></category>
		<category><![CDATA[принципы программирования python]]></category>
		<category><![CDATA[Язык программирования Python]]></category>
		<category><![CDATA[Язык программирования Python 3]]></category>
		<guid isPermaLink="false">https://python.ivan-shamaev.ru/?p=1033</guid>

					<description><![CDATA[<p>Привет! Эта статья является кратким справочником по различным инструментам обработки данных, построения pipelines, системам для управления процессом разработки и т.д. Моя цель &#8212; создать короткую статью-обзор, прочитав/просмотрев которую Вы будете примерно представлять весь спектр инструментов для работы с данными на языке Python. В основном упор будет сделан на обработку данных, но также будут упомянуты и [&#8230;]</p>
<p>Сообщение <a href="https://python.ivan-shamaev.ru/overview-python-programming-language-modules-library-principles/">Язык программирования Python 3. Обзор библиотек принципов modules</a> появились сначала на <a href="https://python.ivan-shamaev.ru">Python 3 | Data Science | Нейронные сети | AI - Искусственный Интеллект</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><a class="a2a_button_telegram" href="https://www.addtoany.com/add_to/telegram?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Foverview-python-programming-language-modules-library-principles%2F&amp;linkname=%D0%AF%D0%B7%D1%8B%D0%BA%20%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F%20Python%203.%20%D0%9E%D0%B1%D0%B7%D0%BE%D1%80%20%D0%B1%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D1%82%D0%B5%D0%BA%20%D0%BF%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF%D0%BE%D0%B2%20modules" title="Telegram" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_whatsapp" href="https://www.addtoany.com/add_to/whatsapp?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Foverview-python-programming-language-modules-library-principles%2F&amp;linkname=%D0%AF%D0%B7%D1%8B%D0%BA%20%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F%20Python%203.%20%D0%9E%D0%B1%D0%B7%D0%BE%D1%80%20%D0%B1%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D1%82%D0%B5%D0%BA%20%D0%BF%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF%D0%BE%D0%B2%20modules" title="WhatsApp" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Foverview-python-programming-language-modules-library-principles%2F&amp;linkname=%D0%AF%D0%B7%D1%8B%D0%BA%20%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F%20Python%203.%20%D0%9E%D0%B1%D0%B7%D0%BE%D1%80%20%D0%B1%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D1%82%D0%B5%D0%BA%20%D0%BF%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF%D0%BE%D0%B2%20modules" title="Facebook" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_linkedin" href="https://www.addtoany.com/add_to/linkedin?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Foverview-python-programming-language-modules-library-principles%2F&amp;linkname=%D0%AF%D0%B7%D1%8B%D0%BA%20%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F%20Python%203.%20%D0%9E%D0%B1%D0%B7%D0%BE%D1%80%20%D0%B1%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D1%82%D0%B5%D0%BA%20%D0%BF%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF%D0%BE%D0%B2%20modules" title="LinkedIn" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_vk" href="https://www.addtoany.com/add_to/vk?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Foverview-python-programming-language-modules-library-principles%2F&amp;linkname=%D0%AF%D0%B7%D1%8B%D0%BA%20%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F%20Python%203.%20%D0%9E%D0%B1%D0%B7%D0%BE%D1%80%20%D0%B1%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D1%82%D0%B5%D0%BA%20%D0%BF%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF%D0%BE%D0%B2%20modules" title="VK" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_twitter" href="https://www.addtoany.com/add_to/twitter?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Foverview-python-programming-language-modules-library-principles%2F&amp;linkname=%D0%AF%D0%B7%D1%8B%D0%BA%20%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F%20Python%203.%20%D0%9E%D0%B1%D0%B7%D0%BE%D1%80%20%D0%B1%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D1%82%D0%B5%D0%BA%20%D0%BF%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF%D0%BE%D0%B2%20modules" title="Twitter" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_email" href="https://www.addtoany.com/add_to/email?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Foverview-python-programming-language-modules-library-principles%2F&amp;linkname=%D0%AF%D0%B7%D1%8B%D0%BA%20%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F%20Python%203.%20%D0%9E%D0%B1%D0%B7%D0%BE%D1%80%20%D0%B1%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D1%82%D0%B5%D0%BA%20%D0%BF%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF%D0%BE%D0%B2%20modules" title="Email" rel="nofollow noopener" target="_blank"></a><a class="a2a_dd addtoany_share_save addtoany_share" href="https://www.addtoany.com/share#url=https%3A%2F%2Fpython.ivan-shamaev.ru%2Foverview-python-programming-language-modules-library-principles%2F&#038;title=%D0%AF%D0%B7%D1%8B%D0%BA%20%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F%20Python%203.%20%D0%9E%D0%B1%D0%B7%D0%BE%D1%80%20%D0%B1%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D1%82%D0%B5%D0%BA%20%D0%BF%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF%D0%BE%D0%B2%20modules" data-a2a-url="https://python.ivan-shamaev.ru/overview-python-programming-language-modules-library-principles/" data-a2a-title="Язык программирования Python 3. Обзор библиотек принципов modules"></a></p><p>Привет!</p>
<p>Эта статья является кратким справочником по различным инструментам обработки данных, построения pipelines, системам для управления процессом разработки и т.д.</p>
<p><strong>Моя цель</strong> &#8212; создать короткую статью-обзор, прочитав/просмотрев которую Вы будете примерно представлять весь спектр инструментов для работы с данными на языке Python. В основном упор будет сделан на обработку данных, но также будут упомянуты и другие библиотеки (web разработка, асинхронное программирование, принципы написания кода и т.д.), которые возможно пригодятся для выполнения поставленных перед Вами задач.</p>
<blockquote>
<p>Если Вы ищите литературу по направлению Python или Power BI (разработка аналитических приложений), то загляните обязательно в <strong><a href="https://t.me/python_powerbi" target="_blank" rel="noopener noreferrer">мой Telegram канал @python_powerbi (пишу про разработку на Python, построение аналитических отчетов на Power BI)</a></strong> <img src="https://s.w.org/images/core/emoji/15.0.3/72x72/1f609.png" alt="😉" class="wp-smiley" style="height: 1em; max-height: 1em;" /></p>
</blockquote>
<p>Итак, приступим. Начнем с библиотек обработки данных.</p>
<h2><strong>Обзор библиотек Python для обработки данных, анализа и визуализации данных</strong></h2>
<ul>
<li><strong>Numpy</strong> &#8212; это библиотека языка Python, которая позволяет работать с многомерными массивами и матрицами, в том числе внутри библиотеки есть большой выбор математических функций для выполнения операций над массивами и матрицами.</li>
<li><strong><span style="color: #ff6600;">Pandas</span> </strong>&#8212; это библиотека для работы с данными, а именно для анализа данных, трансформации данных (обработки данных), загрузки данных из различных источников и сохранения данных в разных форматах как в файловую систему, так и в базу данных. В качестве структуры данных используется Pandas DataFrame или Pandas Series.</li>
<li><strong>pyodbc </strong>&#8212; это Python модуль/библиотека, драйвер для подключения к базе данных через ODBC.</li>
<li><strong>pymssql </strong>&#8212; это библиотека Python для подключения к базе данных на MSSQL (но можно использовать и pyodbc).</li>
<li><span style="font-size: inherit;"><strong><span style="color: #ff6600;">SQLAlchemy</span> </strong>&#8212; это очень популярная библиотека Python для работы с реляционными СУБД для выполнения SQL или для использования технологии ORM (Object-Relational Mapping или объектно-реляционное отображение). ORM необходим для объектно-ориентированных языков программирования. С помощью ORM классы могут быть сопоставлены с базой данных, что позволяет с самого начала четко связать объектную модель и схему базы данных.</span></li>
<li><strong>Alembic</strong> &#8212; это инструмент миграции баз данных, написанный автором SQLAlchemy. Также может использоваться для создания таблиц, их удаления, добавления или удаления полей таблиц.</li>
<li><strong>SciPy</strong> &#8212; это пакет прикладных математических процедур (или научных инструментов), основанный на расширении Numpy Python. Содержит модули для оптимизации, интегрирования, специальных функций, обработки сигналов, обработки изображений, генетических алгоритмов, решения обыкновенных дифференциальных уравнений и других задач, обычно решаемых в науке и при инженерной разработке.</li>
<li><strong>Plotly</strong> &#8212; это графическая библиотека Python (с открытым исходным кодом), с помощью которой можно создавать интерактивную визуализацию (scatter plots, box plots, 3D графики, bar charts, heatmaps, дендрограммы и т.д.). Если коротко, то эту библиотеку можно охарактеризовать как <em>&#171;Красочное интерактивное отображение датасета в одну строку&#187;</em>.</li>
<li><strong>Dash</strong> &#8212; это передовой web‑фреймворк Python с открытым исходным кодом, предназначенный для создания реактивных веб-приложений / аналитических веб-приложений. С помощью Dash можно создать интерактивное приложения для аналитических отчетов и просматривать приложение в браузере, при этом не нужно использовать в приложении JavaScript или HTML. Для привязки пользовательского кода анализа данных к пользовательскому интерфейсу в Dash используется реактивный декоратор. С его помощью можно фильтровать DataFrame Pandas, выполнить SQL‑запрос, запустить расчет и т.д.</li>
<li><strong>Seaborn</strong> &#8212; это</li>
<li><strong>json</strong> — это модуль python, который позволяет кодировать и декодировать данные в удобном формате. Входит в стандартную библиотеку Python и является эффективным средством взаимодействия с JSON (JavaScript Object Notation).</li>
</ul>
<h2><strong>Библиотеки Python для парсинга страниц web сайтов (Web Scraping) и работа с API сайтов</strong></h2>
<ul>
<li><strong>Requests </strong>&#8212; это библиотека, с помощью которой можно отправлять все виды HTTP-запросов к различным ресурсам в сети интернет (сайты, API различных сервисов, поисковики). После выполнения запроса Вы получите ответ от сервера (данные, контент страницы сайта). По сути, с помощью этой библиотеки Вы можете автоматизировать обмен данными с такими ресурсами, как Yandex Метрика, Bitrix24, Мой Склад, Google Analytics, Google BigQuery, AmoCRM, Binance и др.</li>
<li><strong>Beautiful Soup</strong> &#8212; это библиотека Python, парсер для синтаксического разбора файлов HTML/XML. Может преобразовать даже неправильную разметку в дерево, состоящее из тегов, элементов, атрибутов и значений.</li>
<li><strong>Selenium</strong> &#8212; это это инструмент для автоматизации действий веб-браузера. В большинстве случаев используется для тестирования Web-приложений, но этим не ограничивается. Selenium представляет собой драйвер, который управляет поведением браузера. Состоит из нескольких продуктов: Selenium WebDriver, Selenium RC, Selenium Server, Selenium Grid, Selenium IDE.</li>
<li><strong>Lxml</strong> &#8212; это библиотека для парсинга сайтов и документов с разметкой XML и HTML. С её помощью можно разложить элементы документа/страницы в дерево. Обработка производится через XPath (язык запросов к элементам xml или html документа).</li>
<li><strong>Scrapy </strong>&#8212; это быстрый бесплатный фреймворк для веб-краулинга (веб-паук, поисковый робот, т.е. для работ по перебору страниц сайта и занесения информации в базу данных) или веб-скрейпинга (получение веб-данных путем извлечения их со страниц веб-ресурсов). С его помощью можно извлечь данные с веб-страниц сайтов с помощью селекторов на основе XPath.</li>
</ul>
<h2><strong>Многопоточность, параллелизм, многопроцессорная обработка &#8212; библиотеки Python</strong></h2>
<p>В операционной системе существует два типа многозадачности:</p>
<ul>
<li><strong>На основе процессов:</strong> несколько потоков, работающих в одной ОС одновременно.</li>
<li><strong>На основе потоков:</strong> один процесс, состоящий из отдельных задач.</li>
</ul>
<ul>
<li><strong>AsyncIO</strong> &#8212; это библиотека Python для написания параллельного кода. Библиотека asyncio позволяет вам писать код, который выглядит и чувствует себя синхронно, но работает асинхронно. Модуль asyncio предоставляет инфраструктуру для написания однопоточного параллельного кода с использованием сопрограмм, мультиплексирования доступа ввода-вывода через сокеты и другие ресурсы, запуска сетевых клиентов и серверов и других связанных примитивов.</li>
<li><strong>Threading </strong>&#8212; это стандартная библиотека Python, которая содержит необходимые классы для работы с потоками. Модуль threading значительно упрощает работу с потоками и позволяет программировать запуск нескольких задач одновременно. Python содержит Global Interpreter Lock (GIL), который запускает все потоки внутри главного потока. Если Вы запустите несколько интенсивных операций с потоками, то программа будет работать достаточно медленно, т.к. запуск потоков производится только на одном процессоре.</li>
<li><strong>Multiprocessing </strong>&#8212; это Модуль multiprocessing позволяет вам создавать процессы таким же образом, как при создании потоков при помощи модуля threading, но с помощью multiprocessing Вы сможете обойти GIL и использовать несколько процессоров на вашей вычислительной машине. Т.е. в рамках библиотеки multiprocessing Вы можете задействовать несколько процессоров для выполнения ваших операций.</li>
<li><strong>Aiohttp</strong> &#8212; это фреймворк для создания асинхронных HTTP Client и/или HTTP Server. Является HTTP-клиентом / сервером для asyncio.  Пакет aiohttp также поддерживает Server WebSockets и Client WebSockets.</li>
</ul>
<h2><strong>Python Libraries / Инструменты для Machine Learning</strong></h2>
<ul>
<li><strong>TensorFlow</strong> &#8212; это это комплексная платформа для машинного обучения с открытым исходным кодом. Основной объект &#8212; это тензор, или многомерный массив чисел. TensorFlow используется для создания многослойных нейронных сетей.</li>
<li><strong>Keras </strong>&#8212; это библиотека, позволяющая на более высоком уровне работать с нейросетями, упрощает код, увеличивает быстродействие. Изначально была разработана в целях ускорения экспериментов. Keras может запускаться поверх TensoFlow, Theano или CNTK. Этот фреймворк применяется для перевода, распознавании изображений, речи и т.п.</li>
<li><strong>Theano </strong>&#8212; это библиотека Python, которая используется для разработки систем Machine Learning (ML) и Artificial Intelligence (AI) как сама по себе, так и в качестве вычислительного backend для более высокоуровневых библиотек (например для Keras, Lasagne или Blocks). Библиотека построена поверх NumPy. Theano позволяет достигать больших скоростей, которые конкурируют с кодом C, написанным вручную, для задач, связанных с большими объемами данных. Theano компилируется на архитектурах CPU и GPU.</li>
<li><strong>Scikit-Learn</strong> &#8212; это инструмент для обработки изображений и имитации искусственного интеллекта. Библиотека построена на SciPy (Scientific Python). Библиотека Scikit-Learn использует в своей реализации NumPy массивы. Она предоставляет широкий выбор алгоритмов обучения с учителем и без учителя. В этой библиотеке находится большое количество алгоритмов для задач, связанных с классификацией и машинным обучением в целом.</li>
<li><strong>PyTorch </strong>&#8212; это machine learning framework или библиотека для решения задач с помощью машинного обучения, используется для приложений по обработке естественного языка. PyTorch считается Pythonic, т.е. плавно интегрируется со стеком данных Python. С помощью PyTorch можно построить динамический вычислительный граф. PyTorch сейчас используется в таких компаниях как Twitter, Facebook, NVIDIA и др. PyTorch создана на базе Torch (MATLAB-подобная библиотека для языка программирования Lua). Вокруг фреймворка PyTorch выстроена экосистема из различных библиотек: Fast.ai (упрощающая процесс обучения моделей), Pyro (модуль для вероятностного программирования от Uber), Flair (для обработки естественного языка) и Catalyst (для обучения DL и RL моделей).</li>
<li><strong>LightGBM (Light Gradient Boosted Machine)</strong> — это быстрая, распределенная, высокопроизводительная библиотека для повышения градиента, основанная на алгоритмах обучения на основе дерева решений. Используется для решения задач ранжирования, классификации, популярен для задач структурированного прогнозного моделирования, регрессия табличных данных и др. Разработана Microsoft. Справочно: Повышение градиента &#8212; это мощный алгоритм машинного обучения.</li>
<li><strong>XGBoost</strong> — это оптимизированная распределенная библиотека повышения градиента (GBM, GBRT, GBDT) с открытым исходным кодом. Доступна для языков программирования C++, Java, Python, R, Julia, Perl и Scala. Работает на Linux, Windows и macOS. Код работает в распределенной среде (Hadoop, SGE, MPI) и может решать проблемы с миллиардами примеров. В последнее время он приобрел большую популярность и внимание как алгоритм выбора для команд-победителей соревнований по машинному обучению.</li>
<li><strong>VowpalWabbit</strong> — это библиотека машинного обучения для онлайн интерактивного обучения, разработанная в Yahoo. К разработке и развитию подключилась команда Microsoft Research. Используются методы: online, hashing, allreduce, reductions, learning2search, active and interactive learning.</li>
<li><strong>CatBoost</strong> — это высокопроизводительная библиотека с открытым исходным кодом для повышения градиента в деревьях решений. Библиотека разработана компанией Яндекс, использует одну из оригинальных схем градиентного бустинга (boosting — улучшение). Библиотека является преемником алгоритма MatrixNet, который широко используется в компании для ранжирования задач, прогнозирования и выработки рекомендаций.<br /><strong></strong></li>
<li><strong>Hyperopt</strong> — это библиотека, в которой реализован алгоритм оптимизации Tree-Structured Parzen Estimators (TPE). Используется байесовская оптимизация для настройки параметров модели.</li>
<li><strong>fastText</strong> — это бесплатная, легковесная библиотека с открытым исходным кодом, которая позволяет пользователям изучать текстовые представления и классификаторы текста. Инструмент поддерживает несколько языков, включая английский, немецкий, испанский, французский, чешский и русский. Библиотека разработана в лаборатории Facebook AI Research (FAIR).</li>
</ul>
<h2><strong>Python Web Frameworks &#8212; Веб-Разработка сайтов, микросервисов. Обзор фреймворков</strong></h2>
<ul>
<li><strong>Django </strong>&#8212; это фреймворк для веб-приложений, работающий на Python, считается лучшим web-framework на языке Python. Фреймворки облегчают процесс разработки и позволяют разработчикам не изобретать колесо (в Django есть набор компонентов, которые можно использовать в своем проекте), поэтому создание сайта на Django можно сравнить с конструктором Lego. Django подходит для разработки высоконагруженных веб-приложений. Django следует философии &#171;все включено&#187;, Вам только нужно найти нужный компонент для той или иной задачи.</li>
<li><strong>Flask </strong>&#8212; это легковесный и гибкий фреймворк, который используется для создания веб-приложений на языке Python. Flask реализуется с минимальными надстройками, позволяет выбирать модули под конкретные задачи и устанавливать их по мере необходимости. Вы вправе самостоятельно решить, как стоит реализовать те или иные вещи в вашем проекте. Flask стоит выбрать, если необходима тонкая настройка проекта. Flask из-за своей гибкости лучше подходит для создания REST API.</li>
<li><strong>Tornado </strong>&#8212; это веб-фреймворк Python и асинхронная библиотека для NetWorking (сетей). Используя неблокирующий сетевой ввод/вывод (I/O), Tornado может масштабироваться до десятков тысяч открытых соединений, что делает его идеальным для веб-сервисов реального времени (например для длинных опросов или long polling, WebSockets, т.е. которые требуют долгого соединения с каждым пользователем). Был создан для использования в проекте FriendFeed, который в 2009 году приобрела компания Facebook. После этого исходный код этой библиотеки разместили в открытом доступе. Есть интеграция с Amazon S3. Есть реализация сторонних схем аутентификации и авторизации (Google OpenID / OAuth, Facebook, Yahoo BBAuth, FriendFeed OpenID/OAuth, Twitter OAuth).</li>
<li><strong>Pyramid </strong>&#8212; это это самый молодой web-фреймворк Python с открытым исходным кодом для веб-проектов среди других популярных frameworks. Pyramid очень похожа на Flask (мало усилий для установки и запуска). Pyramid хорошо себя проявляет как в небольших, так и в больших проектах.</li>
<li><strong>Bottle</strong> &#8212; это быстрый, простой и легкий микро-фреймворк Python для небольших веб-приложений. Включает в себя диспетчеризацию запросов (маршрутизацию) с поддержкой параметров URL, шаблоны, имеет встроенный HTTP-сервер и адаптеры для сторонних WSGI/HTTP-серверов. <strong>Протокол WSGI</strong> &#8212; стандарт взаимодействия между Python-программой, выполняющейся на стороне сервера, и самим веб-сервером, например, Apache.</li>
<li><strong>CherryPy</strong> &#8212; это минималистичный объектно-ориентированный веб-фреймворк с открытым исходным кодом на языке Python. Является Pythonic. Спроектирован для быстрой разработки веб-приложений, используя ООП. CherryPy может быть настроек, как самостоятельный веб-сервер, или может работать под управлением другого серверного приложения, которое поддерживает протокол WSGI. CherryPy имеет собственный совместимый с HTTP веб-сервер WSGI.</li>
</ul>
<h2><strong>Фреймворки для разработки мобильных приложений, GUI Development</strong></h2>
<ul>
<li><strong>Kivy</strong> &#8212; это кросс-платформенный фреймворк Python с открытым исходным кодом для быстрой разработки межплатформенных В дополнение к стандартному вводу через клавиатуру и мышь он поддерживает мультитач. Kivy работает на Linux, Windows, OS X, Android, iOS и Raspberry Pi. Графика создается через OpenGL ES 2, что приводит к равномерному появлению в разных операционных системах.</li>
<li><strong>PyQt5 / PyQt4 / PyQt</strong> &#8212; это это библиотека Python для разработки приложений с графическим интерфейсом пользователя GUI (создано на основе набора кроссплатформенных библиотек C++). Является одной из самых мощных библиотек GUI (более 600 классов, более 6000 функций и методов). Библиотека доступна для Python 2.x и 3.x. PyQt работает на всех платформах, поддерживаемых Qt: Linux и другие UNIX-подобные ОС, Mac OS X и Windows. Существует 2 версии: PyQt5, поддерживающий Qt 5, и PyQt4, поддерживающий Qt 4.</li>
<li><strong>Tkinter </strong>&#8212; это бесплатная кросс-платформенная графическая библиотека Python, которая позволяет создавать программы с оконным интерфейсом (стандратный модуль Python для создания приложений с GUI интерфейсом). Tkinter является кроссплатформенной библиотекой и может быть использована в большинстве распространённых операционных систем (Windows, Linux, Mac OS X и др.). Функционирует на основе средств Tk (широко распространённая в мире GNU/Linux и других UNIX‐подобных систем, портирована также и на Microsoft Windows).</li>
<li><strong>WxPython </strong>&#8212; это это бесплатная кросс-платформенная библиотека Python для разработки приложений GUI (Windows, Mac OS X, Linux), поставляется вместе с Python и является альтернативой Tkinter. Библиотека написана на C++. Реализовано на основе wxWidgets &#8212; инструмент разработчика для написания настольных или мобильных приложений с графическим интерфейсом (GUI).</li>
<li><strong>PyGUI </strong>&#8212; это</li>
<li><strong>PySide </strong>&#8212; это</li>
</ul>
<h2><strong>Фреймворки Python для разработки API</strong></h2>
<ul>
<li><strong>Marchmallow</strong> &#8212; это библиотека, независимая от ORM/ODM/Framework для преобразования сложных типов данных, таких как объекты, в простые типы данных Python, а также обратная операция. Наиболее распространенное использование Marshmallow &#8212; десериализация объекта JSON в объект Python или сериализация объекта Python в объект JSON для использования в веб-API. Marshmallow делает это путем определения схемы, которую можно использовать для применения правил проверки десериализации данных или изменения способа сериализации данных.</li>
<li><strong>OpenAPI = спецификация.</strong> OpenAPI &#8212; это официальное название спецификации. Разработка спецификации поддерживается инициативой OpenAPI, в которой участвуют более 30 организаций из разных областей технического мира, включая Microsoft, Google, IBM и CapitalOne. Smartbear Software, которая является компанией, которая возглавляет разработку инструментов Swagger, также является участником инициативы OpenAPI, помогая вести эволюцию спецификации.</li>
<li><strong>Swagger = Инструменты для реализации спецификации.</strong> Swagger &#8212; это имя, связанное с некоторыми из самых известных и широко используемых инструментов для реализации спецификации OpenAPI. Набор инструментов Swagger включает в себя набор открытых, бесплатных и коммерческих инструментов, которые можно использовать на разных этапах жизненного цикла API. Инструменты Swagger &#8212; не единственные инструменты, доступные для реализации спецификации OpenAPI. <strong>Инструменты Swagger включают в себя:</strong>
<ul>
<li><span style="color: #008080;"><strong>Редактор Swagger:</strong></span> Редактор Swagger позволяет редактировать спецификации OpenAPI в YAML внутри вашего браузера и просматривать документы в реальном времени.</li>
<li><span style="color: #008080;"><strong>Swagger UI:</strong></span> Swagger UI &#8212; это набор ресурсов HTML, Javascript и CSS, которые динамически генерируют прекрасную документацию из OAS-совместимого API.</li>
<li><span style="color: #008080;"><strong>Swagger Codegen:</strong></span> позволяет автоматически генерировать клиентские библиотеки API (SDK), заглушки серверов и документацию с учетом спецификации OpenAPI.</li>
<li><span style="color: #008080;"><strong>Swagger Parser:</strong></span> автономная библиотека для анализа определений OpenAPI из Java</li>
<li><span style="color: #008080;"><strong>Swagger Core:</strong></span> Java-библиотеки для создания, использования и работы с определениями OpenAPI</li>
<li><span style="color: #008080;"><strong>Swagger Inspector (бесплатно):</strong></span> инструмент тестирования API, который позволяет проверять ваши API и генерировать определения OpenAPI из существующего API</li>
<li><span style="color: #008080;"><strong>SwaggerHub (бесплатный и коммерческий):</strong></span> API-дизайн и документация, созданные для команд, работающих с OpenAPI.</li>
</ul>
</li>
<li><strong>FastAPI</strong> &#8212; это это современная, быстрая (высокопроизводительная) веб-фреймворк для создания лаконичных и довольно быстрых HTTP API-серверов со встроенными валидацией, сериализацией и асинхронностью, работает с Python 3.6+. Работу с web в FastAPI выполняет Starlette, а валидацию &#8212; Pydantic. FastAPI интегрируется с OpenAPI-schema и автоматически генерирует документацию для API посредством Swagger и ReDoc.</li>
</ul>
<h2><strong>Python Libraries for Game Development (Библиотеки Python для разработки игр)</strong></h2>
<ul>
<li><strong>PyGame</strong> &#8212; это библиотека модулей/фреймворк Python для разработки 2D игр и мультимедиа-приложений. Pygame основывается на мультимедийной библиотеке SDL (Simple DirectMedia Layer &#8212; кроссплатформенная мультимедийная библиотека с открытым исходным кодом, которая реализует единый программный интерфейс для работы с графикой и анимацией, со звуком и музыкой, для работы с интерфейсами I/O &#8212; мышь, клавиатура, джойстик и т.д.). Pygame содержит функции и классы Python, которые позволяют вам использовать поддержку SDL.</li>
<li><strong>Pyglet </strong>&#8212; это кроссплатформенная библиотека окон и мультимедиа для Python, предназначенная для разработки игр и других мультимедийных приложений Windows, Mac OS X и Linux. Pyglet поддерживает работу с окнами, обработку событий пользовательского интерфейса, графику OpenGL, загрузку изображений и видео, а также воспроизведение звуков и музыки.</li>
<li><strong>PyOpenGL </strong>&#8212; это это большой пакет Python, который позволяет работать с функциями OpenGL, GLU, GLE и GLUT. PyOpenGL обеспечивает реализацию приложений с двухмерной и трехмерной графикой.</li>
<li><strong>Arcade </strong>&#8212; это простая в освоении библиотека Python для создания 2D видеоигр. Он идеально подходит для людей, которые учатся программировать, или для разработчиков, которые хотят написать двумерную игру, не изучая сложную структуру.</li>
<li><strong>Panda3D </strong>&#8212; это полностью бесплатный в использовании движок с открытым исходным кодом для создания 3D-игр, визуализаций, симуляций, экспериментов в реальном времени. Его богатый набор функций легко адаптируется к вашим рабочим процессам и потребностям разработки. Игровой движок включает в себя графику, звук, ввод/вывод, обнаружение и столкновение, а также другие функции, относящиеся к созданию 3D игр.</li>
</ul>
<h2><strong>Python Libraries/Tools for Image Processing</strong></h2>
<p><strong>Анализ изображений</strong> – это извлечение значимой информации из изображений. Что полезного можно получить из изображений?</p>
<ul>
<li>Медицина (выявление аномалий, диагностика заболеваний)</li>
<li>Системы безопасности (обнаружение «подозрительных» предметов)</li>
<li>Военная промышленность (системы слежения и целенаведения)</li>
<li>Обнаружение и распознавание текста</li>
</ul>
<p><span style="color: #008080;"><strong>Обзор инструментов:</strong></span></p>
<ul>
<li><strong>OpenCV (Open Source Computer Vision Library)</strong> &#8212; это библиотека алгоритмов компьютерного зрения с исходным кодом, для обработки изображений и видео, ориентирована на приложения реального времени. Реализована на C/C++, также разрабатывается для Python, Java, Ruby, Matlab, Lua и других языков. Библиотека opencv-python &#8212; неофициальный релиз пакетов OpenCV для Python.</li>
<li><strong>Mahotas</strong> — это библиотека компьютерного зрения и обработки изображений для Python, которая включает в себя множество алгоритмов, реализованных в C++ для повышения скорости при работе с большими массивами данных. Mahotas в настоящее время имеет более 100 функций для обработки изображений и компьютерного зрения и продолжает расти.</li>
<li><strong>SimpleITK (Insight Segmentation and Registration Toolkit, ITK)</strong> — это набор инструментов для анализа изображений с большим количеством компонентов, поддерживающих общие операции фильтрации, сегментации и регистрации изображений. Сам SimpleITK написан на C++, но доступен для большого количества языков программирования, включая Python.</li>
<li><strong>Pillow</strong> — это библиотека языка Python, предназначенная для работы с растровой графикой. Однако проект под названием Pillow, являющийся форком PIL, развивается и включает, в том числе, поддержку Python 3.x.</li>
<li><strong>SciKit-image</strong> — это библиотека Python, предназначенная для обработки изображений, включает в себя набор алгоритмов обработки изображений (сегментации, геометрических преобразований, управления цветовым пространством, анализа, фильтрации, морфологии, обнаружения признаков и многое другое). Библиотека доступна бесплатно и без ограничений.</li>
</ul>
<h2><strong>Python Libraries For Text Analytics &#8212; библиотеки для анализа текста / NLP</strong></h2>
<p>Обработка написанных на естественном языке текстов <strong>(Natural Language Processing, NLP)</strong>, с которой мы познакомились в предыдущей главе, и вычислительная лингвистика <strong>(Computational Linguistics, CL)</strong> — две сферы вычислительных методов изучения естественных языков.</p>
<p><strong>NLP</strong> занимается разработкой методов решения связанных с языками практических задач, таких как извлечением информации, автоматическим распознаванием речи, машинным переводом, анализом тональности высказываний, формированием ответов на вопросы и автоматическим реферированием.</p>
<p><strong>CL</strong>, с другой стороны, применяет вычислительные методы для постижения свойств естественных языков. Как мы понимаем язык? Как мы создаем языки? Как мы учим языки? Как различные языки связаны друг с другом?</p>
<ul>
<li><strong>SpaCy</strong> &#8212; это open-source библиотека для NLP, написанная на Python и Cython. В отличие от NLTK, который широко используется для преподавания и исследований, spaCy фокусируется на предоставлении программного обеспечения для разработки. spaCy поставляется с предварительно обученными статистическими моделями и векторами слов, и в настоящее время поддерживает токенизацию для 50+ языков. В нем реализована современная скорость, сверточные модели нейронных сетей для тегирования, анализа и распознавания именованных объектов, а также простая интеграция с глубоким обучением. Это коммерческое программное обеспечение с открытым исходным кодом, выпущенное под лицензией MIT.</li>
<li><strong>NLTK (Natural Language Toolkit) </strong>&#8212; это библиотека для обработки естественного языка на Python, которая позволяет создавать программы для работы с данными на человеческом языке. NLTK доступен для Windows, Mac OS X и Linux. NLTK &#8212; это бесплатный проект с открытым исходным кодом, который поддерживает и развивает сообщество специалистов.</li>
<li><strong>Flair </strong>&#8212; это мощная библиотека NLP, которая позволяет применять современные модели обработки естественного языка (NLP) к тексту, такие как распознавание именованных объектов (NER), тегирование частей речи (PoS), устранение неоднозначности смысла и классификация.</li>
<li><strong>TextBlob </strong>&#8212; это библиотека Python (2 и 3) для обработки текстовых данных. Он предоставляет простой API для погружения в общие задачи обработки естественного языка (NLP), такие как определение части речи, извлечение имен существительных, анализ настроений, классификация, перевод и многое другое.</li>
<li><strong>Gensim </strong>&#8212; это библиотека для обработки естественного языка, с помощью которой осуществляют индексацию документов, моделирование тем, поиска сходства. Целевая область применения &#8212; это natural language processing (NLP) обработка естественного языка и information retrieval (IR) поиск информации.</li>
<li><strong>Наташа</strong> &#8212; это библиотека для извлечения структурированной информации из текстов на русском языке (например извлечения имён, адресов, дат, сумм денег и других сущностей). В библиотеке собраны грамматики и словари для парсера Yargy.</li>
</ul>
<h2><strong>Инструментарий Python для автоматического тестирования</strong></h2>
<ul>
<li><strong>Исследовательское тестирование (Exploratory Testing, ET).</strong> Объединяет тестовый дизайн и тестовое выполнение. Оно направлено на изучение приложения в условиях тестирования.</li>
<li><strong>Модульные тесты (Unit Test).</strong> Определяют поведение малых частей системы, например ветвей конкретных функций. Могут быть направлены на объект или метод, вытекающий из одного или нескольких дизайнерских решений. В контексте Agile автоматизированные модульные тесты направляют программирование на низшем уровне. Как правило, код модульных тестов составляет менее двенадцати строк. Некоторые специалисты предпочитают термин &#171;микротест&#187;.</li>
<li><strong>Операционное тестирование (Operational Acceptance Testing, OAT).</strong> Используется для проведения OPS-подготовки (предвыпуска) продукта, услуги или системы как части контроля качества. OAT &#8212; стандартный тип нефункционального тестирования программного обеспечения, по большей части поддерживающий софт и проекты ПО.</li>
<li><strong>Приемочное тестирование (Acceptance Test).</strong> Тесты, определяющие бизнес-ценность и объемы каждой истории (функции). Могут определять как функциональные, так и нефункциональные требования, например, рабочие показатели или надежность. Хотя используются для разработки на основе примеров, представляют собой тесты высшего уровня, в отличие от модульных, используемых для создания кода в разработке на основе тестов. Это широкий термин, он может включать в себя бизнес-ориентированные и технологические тесты.</li>
<li><strong>Регрессионное тестирование (Regression Test).</strong> Определяет, что поведение системы в условиях тестирования не меняется. Регрессионные тесты часто пишутся как модульные, чтобы поддерживать программирование, или как приемочные, чтобы определять желаемое поведение системы. Как только проверка завершена, она становится частью набора регрессионных тестов, предотвращающих незапланированные изменения. Регрессионные тесты должны быть автоматизированы для обеспечения непрерывной обратной связи.</li>
<li><strong>Автотест (автоматизированный тест)</strong> – это скрипт, который имитирует взаимодействие бизнес-пользователя с приложением. Целью автотестов является локализация ошибок в работе системы/ПО. Конечная цель автоматического тестирования &#8212; создание набора автотестов, которые будут поочередно запускаться после нажатия на кнопку &#171;Старт&#187;. Также должны быть предусмотрены одиночные автотесты для проверки отдельной функциональности. Каждый тестовый скрипт контролирует правильность работы определенной функциональности приложения (его части) и фиксирует ошибки, если что-то пошло не так.</li>
</ul>
<p><strong>Библиотеки Python для тестирования:</strong></p>
<ul>
<li><strong>Splinter</strong> &#8212; это инструмент с открытым исходным кодом для тестирования веб-приложений с использованием Python. Позволяет автоматизировать действия браузера, такие как посещение URL-адресов и взаимодействие с их элементами. Например, 1) Посетите веб-сайт Google, 2) Введите текст поиска, 3) Нажмите кнопку поиска, 4) Узнайте, находится ли сайт вашей компании в результатах поисковой выдачи. И т.д.</li>
<li><strong>Robot (Robot Framework)</strong> &#8212; это универсальная среда автоматизации с открытым исходным кодом. Он может быть использован для автоматизации тестирования и автоматизации процессов (RPA). Robot Framework активно поддерживается, и многие ведущие компании используют его при разработке программного обеспечения. Robot Framework имеет простой синтаксис, использующий удобочитаемые ключевые слова. Его возможности могут быть расширены библиотеками, реализованными на Python или Java.</li>
<li><strong>Behave &#8212; это behavior-driven (BDD)</strong> фреймворк для тестирования, который использует тесты, написанные в стиле естественного языка, подкрепленные кодом Python. Выдаёт красивые, аккуратные и понятные отчеты. Лучше всего подходит для тестирования &#171;черного ящика&#187;. Лучше не использовать для модульного тестирования или низкоуровневого интеграционного тестирования.</li>
<li><strong>PyUnit (или unittest)</strong> &#8212; это framework для тестирования, входящий в стандартную библиотеку языка Python. Представляет собой версию JUnit на языке Python. Позволяет просто создавать программы модульного тестирования с помощью Python.</li>
<li><strong>PyTest</strong> &#8212; это фреймворк для тестирования, который позволяет легко писать небольшие тесты, а также масштабируется для поддержки сложного функционального тестирования приложений и библиотек. Это один из лучших инструментов, которые вы можете использовать для повышения производительности тестирования. Может запускать тесты параллельно. Может выполнить определенный тест или подмножество тестов.</li>
</ul>
<h2><strong>Обзор других библиотек Python (работа со временем, оперативной системой, числами и т.д.)</strong></h2>
<ul>
<li><strong>math</strong> — это модуль Python, который обеспечивает доступ к математическим функциям для работы с числами (набор функций для выполнения математических, тригонометрических и логарифмических операций и другие).</li>
<li><strong>time</strong> — это модуль Python, который предоставляет различные функции для работы со временем (смещение DST часового пояса, форматирование времени, делать задержки по таймеру и др.). Большинство функций, определенных в этом модуле, вызывают библиотечные функции платформы С с тем же именем.</li>
<li><strong>datetime</strong> — это модуль, который предоставляет классы для работы с датой и временем (формирование даты, вычисление разницы между двумя моментами времени, получение информации о временной зоне, получение текущего времени, получение даты из datetime, получение времени из datetime и др.).</li>
<li><strong>calendar</strong> — это модуль Python, который позволяет выводить календари (в виде простого текста или в HTML формате), а также предоставляет дополнительные полезные функции, связанные с календарем.</li>
<li><strong>os</strong> — это модуль, который предоставляет функции для работы с операционной системой. Модель содержит функции для работы с файлами, директориями, с переменными окружения, производить работу с путями, получать информацию об операционной системе и др.</li>
<li><strong>sys</strong> — это модуль, который предоставляет доступ к некоторым переменным и функциям для получения информации о взаимодействии интерпретатора Python с операционной системой. Модуль sys очень часто используют вместе с os модулем. С помощью sys можно получить такую информацию, как запущенная версия Питона, путь к интерпретатору Python, каталог установки Python, кодировка файловой системы, параметры командной строки и др.</li>
<li><strong>random</strong> — это модуль, который реализует генераторы псевдослучайных чисел для различных распределений (равномерного, нормального/гауссовского, логнормального, отрицательного экспоненциального, гамма- и бета-распределений).</li>
<li><strong>re</strong> — это модуль предоставляет операции сопоставления регулярных выражений (поиск с помощью «регулярных выражений» или с помощью текстовых &#171;паттернов&#187;/&#187;patterns&#187;). Другими словами это парсинг текста или поиск последовательностей символов, согласно заданным правилам, которые описываются в виде шаблонов.</li>
<li><strong>python-docx</strong> — это библиотека Python для создания и обновления/изменения файлов Microsoft Word (.docx).</li>
<li><strong>python-play</strong> — это модуль python, позволяющий воспроизводить аудиофайл в формате mp3.</li>
<li><strong>PyPDF2</strong> &#8212; это библиотека PDF на чистом python, способная разбивать, объединять, обрезать и преобразовывать страницы файлов PDF. Он также может добавлять пользовательские данные, параметры просмотра и пароли к файлам PDF. Он может извлекать текст и метаданные из PDF-файлов, а также объединять файлы целиком.</li>
</ul>
<h2><strong>Лучшие IDE (интегрированные среды разработки) и редакторы кода для Python</strong></h2>
<ul>
<li><strong>IDLE (Integrated Development and Learning Environment)</strong> &#8212; это интегрированная среда разработки и обучения на языке Python, созданная с помощью библиотеки Tkinter. Это оболочка Python, окно для ввода команд на языке Python. В Windows это поставляется с интерпретатором Python, т.е. устанавливается вместе с Python.</li>
<li><strong>Jupyter Notebook</strong> &#8212; это веб-приложение с открытым исходным кодом, которое позволяет создавать и обмениваться документами, которые содержат живой код и результат его выполнения, уравнения, визуализации и текст с пояснениями по вычислениям. Часто используется для: очистки и преобразования данных, числового моделирования, статистического моделирования, визуализации данных, машинного обучения и др.</li>
<li><strong>Anaconda</strong> &#8212; дистрибутив языков программирования Python и R, включающий набор популярных свободных библиотек, объединённых проблематиками науки о данных и машинного обучения. Основная цель — поставка единым согласованным комплектом наиболее востребованных соответствующим кругом пользователей тематических модулей (таких как NumPy, SciPy, Astropy и других) с разрешением возникающих зависимостей и конфликтов, которые неизбежны при одиночной установке. По состоянию на 2019 год содержит более 1,5 тыс. модулей.</li>
<li><strong>PyCharm</strong> &#8212; это кросс-платформенная среда (Windows, MacOS, Linux) разработки для разных языков программирования (в частности для Python). PyCharm Community Edition (бесплатная версия) находится под лицензией Apache License, а PyCharm Professional Edition(платная версия) является проприетарным ПО. PyCharm предоставляет умную проверку кода, быстрое выявление ошибок и оперативное исправление, вкупе с автоматическим рефакторингом кода, и богатыми возможностями в навигации.</li>
<li><strong>Spyder</strong> &#8212; свободная и кроссплатформенная интерактивная IDE для научных расчетов на языке Python. Используется инженерами и аналитиками данных. Spyder является частью модуля spyderlib для Python, основанного на PyQt4, pyflakes, rope и Sphinx, предоставляющего мощные виджеты на PyQt4, такие как редактор кода, консоль Python (встраиваемая в приложения), графический редактор переменных (в том числе списков, словарей и массивов).</li>
<li><strong>Visual Studio Code</strong> &#8212; редактор кода, разработанный Microsoft для Windows, Linux и macOS. Позиционируется как &#171;лёгкий&#187; редактор кода для кроссплатформенной разработки веб- и облачных приложений. Включает в себя отладчик, инструменты для работы с Git, подсветку синтаксиса, IntelliSense (технология автодополнения Microsoft) и средства для рефакторинга. Имеет широкие возможности для кастомизации: пользовательские темы, сочетания клавиш, файлы конфигурации, имеет множество полезных плагинов. Распространяется бесплатно, разрабатывается как программное обеспечение с открытым исходным кодом, но готовые сборки распространяются под проприетарной лицензией.</li>
<li><strong>Thonny</strong> &#8212; интегрированная среда разработки для Python, специально разработанная для начинающих Pythonista. Поддерживает различные способы пошагового выполнения кода, пошаговое вычисление выражений, детальную визуализацию стека вызовов и режим объяснения концепций ссылок и кучи.</li>
<li><strong>Sublime Text</strong> &#8212; легковесный текстовый редактор для программистов. Поддерживает плагины на языке программирования Python. Разработчик позволяет бесплатно и без ограничений ознакомиться с продуктом, однако программа уведомляет о необходимости приобретения лицензии.</li>
<li><strong>Atom (с плагином atom-python-run)</strong> &#8212; бесплатный текстовый редактор с открытым исходным кодом для Linux, macOS, Windows с поддержкой плагинов, написанных на Node.js, и встраиваемых под управлением Git. Большинство плагинов имеют статус свободного программного обеспечения, разрабатываются и поддерживаются сообществом. Есть плагин для Python atom-python-run.</li>
</ul>
<h2>Синхронизация. Координация распределенных приложений</h2>
<ul>
<li><strong>ZooKeeper (Apache ZooKeeper)</strong> &#8212; это высокопроизводительный сервис координации для распределенных приложений; Служба, предназначенная для хранения конфигурационной информации, имён, выполнения распределённой синхронизации процессов. Фактически выполняет важнейшие задачи многих распределённых приложений. Является важной составляющей Hadoop-инфраструктуры, но может использоваться отдельно. Поддерживается Apache Foundation, написана на Java. Для получения информации каждый клиентский компьютер связывается с одним из серверов. ZooKeeper следит за синхронизацией всего кластера. Внедрение ZooKeeper делает ставку на высокую производительность, доступность и строго упорядоченный доступ. Аспекты производительности ZooKeeper позволяют использовать его в больших распределенных системах.</li>
</ul>
<ul></ul>
<h2><strong>Реляционные базы данных (СУБД)</strong></h2>
<ul>
<li><strong>MySQL</strong> &#8212; это</li>
<li><strong>PostgreSQL</strong> &#8212; это</li>
</ul>
<h2><strong>NoSQL СУБД и Time-Series DataBase</strong></h2>
<ul>
<li><strong>Redis (Remote Dictionary Server)</strong> — это база данных in-memory (хранимая в оперативной памяти) с исходным кодом (лицензиия BSD), которая хранится на диске. База данных организована по модели &#171;ключ-значение&#187;, также можно использовать другие типы значений: строки, списки, наборы, отсортированные наборы, хэши, потоки, HyperLogLogs, растровые изображения. Redis обеспечивает время отклика на уровне долей миллисекунды и позволяет приложениям, работающим в режиме реального времени, выполнять миллионы запросов в секунду. Такие приложения востребованы в сфере игр, рекламных технологий, финансовых сервисов, здравоохранения и IoT.</li>
<li><strong>MongoDB</strong> — это кросс-платформенная, документоориентированная NoSQL система управления базами данных с открытым исходным кодом, не требующая описания схемы таблиц (schemaless). Написана на C++. Хранит данные в JSON-подобных документах, в основе БД лежит концепция коллекций и документов. Обеспечивает высокую производительность и лугкую масштабируемость. Документ &#8212; JSON-объект имеющий произвольное число полей. Коллекция (таблица)- однотипные документы хранятся в отдельной коллекции.База данных &#8212; набор коллекций. Используется в веб-разработке.</li>
<li><strong>CouchDB (Сluster Of Unreliable Commodity Hardware)</strong> — это документо-ориентированная NoSQL СУБД с открытым исходным кодом, написанная на языке Erlang, которая не требует описания схемы данных. CouchDB предоставляет REST интерфейс для работы с базой: Если мы хотим получить информацию &#8212; отправляем GET запрос, Если надо создать документ &#8212; POST, Необходимо что-то изменить &#8212; PUT, COPY для копирования, DELETE для удаления. Используется в веб-разработке.</li>
<li><strong>Cassandra</strong> — это распределенная гибридная NoSQL система управления БД, которая используется для создания высокомасштабируемых и надежных хранилищ огромных массивов данных, которые представлены в виде хэша. Cassandra разработана Facebook на языке Java, а затем СУБД передали для дальнейшего развития фонду Apache Software Foundation. Cassandra сочетает в себе модель хранения данных на базе семейства столбцов (ColumnFamily) с концепцией key-value (ключ-значение). Есть возможность организации хранения хэшей с несколькими уровнями вложенности. Относится к категории отказоустойчивых СУБД: помещённые в базу данные автоматически реплицируются на несколько узлов распредёленной сети или даже равномерно распределяются в нескольких дата-центрах, при сбое узла его функции на лету подхватываются другими узлами, добавление новых узлов в кластер и обновление версии Cassandra производится на лету, без дополнительного ручного вмешательства и переконфигурации других узлов.</li>
<li><strong>Neo4j</strong> — является ведущей в мире графовой системой управления базами данных с открытым исходным кодом, разработана на Java. Данные хранит в собственном формате, специализированно приспособленном для представления графовой информации. Программист работает с гибкой сетевой структурой узлов и отношений, а не со статическими таблицами.</li>
<li><strong>Clickhouse</strong> — это колоночная аналитическая система управления базами данных с открытым исходным кодом, разрабатывается компанией Yandex (Яндекс). Позволяет выполнять аналитические запросы в режиме реального времени на структурированных больших данных. ClickHouse использует собственный диалект SQL близкий к стандартному, но содержащий различные расширения: массивы и вложенные структуры данных, функции высшего порядка, вероятностные структуры, функции для работы с URI, возможность для работы с внешними key-value хранилищами («словарями»), специализированные агрегатные функции, функциональности для семплирования, приблизительных вычислений, возможность создания хранимых представлений с агрегацией, наполнения таблицы из потока сообщений Apache Kafka и т.д.</li>
<li><strong>VictoriaMetrics</strong> — это масштабируемая база данных временных рядов с открытым исходным кодом, которую можно использовать в качестве долгосрочного удаленного хранилища для Prometheus. Prometheus &#8212; это бесплатное программное приложение с открытым исходным кодом, используемое для мониторинга событий и оповещения. Он записывает метрики в реальном времени в базу данных временных рядов, построенную с использованием HTTP pull model, с гибкими запросами и оповещениями в реальном времени.</li>
<li><strong>InfluxDB</strong> — это база данных временных рядов с открытым исходным кодом, которая предназначена для обработки высокой нагрузки записей и запросов. Является частью стека TICK (Telegraf, InfluxDB, Chronograf, Kapacitor). Используется для IoT мониторинга и аналитики, мониторинга инфраструктуры и приложений.</li>
</ul>
<h2><strong>WebSite Search Engine &#8212; механизм поиска для веб-сайта (поисковый движок)</strong></h2>
<ul>
<li><strong>Elasticsearch</strong> — это масштабируемый поисковый движок корпоративного уровня с открытым исходным кодом, основанный на библиотеке Lucene (NoSQL с JSON REST API). Данные хранятся в формате JSON, система работает на платформе Java. Официальные клиенты доступны на Java, .NET (C#), PHP, Python, Apache Groovy, Ruby и многих других языках. Система обеспечивает полнотекстовый поиск и анализ данных.</li>
<li><strong>Sphinx</strong> — это высокоскоростная система для полнотекстового поиска, которую разработал Адрей Аксенов на языке C++. Система работает в Linux (RedHat, Ubuntu и т.д.), Windows, MacOS, Solaris, FreeBSD. Официальные реализации Sphinx API доступны для PHP, Java, Perl, Ruby и Python. Поисковый сервер Sphinx имеет двойную лицензию, поэтому он может быть лицензирован для коммерческой деятельности, а также свободно доступен для загрузки на официальном сайте (если он будет использоваться в соответствии с условиями GPL v.2).</li>
<li><strong>Solr</strong> — это платформа для полнотекстового поиска с открытым исходным кодом, написанная на Java и основана на проекте Apache Lucene. Её основные функции включают в себя полнотекстовый поиск, подсветка результатов, фасетный поиск, индексация в реальном времени, динамическую кластеризацию, интеграцию с базами данных, функции NoSQL, а также обработку документов Word, PDF и др. В основе Solr для реализации поиска и индексации лежит Lucene. Solr имеет HTTP/XML и JSON API, поэтому эту платформу можно использовать из всех популярных языков программирования.</li>
<li><strong>Xapian</strong> &#8212; это библиотека для полнотекстового поиска с открытым исходным кодом. Используется во многих ОС: Linux, MacOS, FreeBSD, NetBSD, OpenBSD, Solaris, IRIX, Windows. Может использоваться совместно с Perl, Python, PHP, Java, Tcl, C#, Ruby, Lua, Erlang, Node.js.</li>
</ul>
<h2><strong>Workflow Management системы и Брокеры сообщений</strong></h2>
<ul>
<li><strong>Apache Airflow &#8212; </strong>это open-source набор библиотек, платформа для планирования, создания и мониторинга рабочих процессов. Airflow является незаменимым инструментом для современного дата инженера как планировщик ETL/ELT-процессов, предназначен для запуска цепочек задач (data pipelines). Для создания рабочих процессов используется язык Python. Основные компоненты рабочего процесса Airflow: Направленные ациклические графы (DAG), Планировщик (Scheduler), Операторы (Operators), Задачи (Tasks).</li>
<li><strong>Kafka</strong> &#8212; это брокер сообщений, проект с открытым исходным кодом, используется для создания конвейеров данных в реальном времени и потоковых приложений. Масштабируется по горизонтали, используется паттерн Producer-Consumer, отказоустойчив. Разработана компанией LinkedIn на JVM стеке (Scala). Приложения (генераторы) посылают сообщения (записи) на узел Kafka (брокер), и указанные сообщения обрабатываются другими приложениями, так называемыми потребителями. Указанные сообщения сохраняются в теме, a потребители подписываются на тему для получения новых сообщений.</li>
<li><strong>Luigi</strong> &#8212; это пакет Python (поддерживаются версии 2.7, 3.6, 3.7 и выше), который помогает вам создавать сложные конвейеры пакетных заданий. С помощью Luigi производится управление рабочими процессами, управление зависимостями между задачами, имеется центральный планировщик задач с веб-интерфейсом, статусом выполнения задач и трекингом ошибок, CLI (есть возможность работы через командную строку), failover recovery. Разработан был инженерами из Spotify.</li>
<li><strong>Celery</strong> &#8212; это простая, гибкая и надежная распределенная система для обработки в асинхронном режиме огромного количества сообщений. Инструмент, который позволяет обрабатывать очередь задач, причем с акцентом на обработку в реальном времени, а также с поддержкой планирования задач. С помощью Celery можно запускать отложенный или выделенный код в отдельном процессе или даже на отдельном компьютере или сервере. Также Celery можно использовать для отправки электронных писем.<br /><strong></strong></li>
<li><strong>RabbitMQ</strong> &#8212; это менеджер сообщений (message broker) на основе стандарта AMQP (тиражируемое связующее программное обеспечение, ориентированное на обработку сообщений). Создан на основе системы Open Telecom Platform, написан на языке Erlang, в качестве движка базы данных для хранения сообщений использует Mnesia. Состоит из сервера, библиотек поддержки протоколов HTTP, XMPP и STOMP[en], клиентских библиотек AMQP для Java и .NET Framework и различных плагинов. Если кратко, то это платформа, которая управляет очередью сообщений и к которой могут подключатся различные приложения и передавать/получать сообщения (т.е. предназначен для передачи данных между несколькими сервисами).</li>
<li><strong>ActiveMQ</strong> -это популярный многопротокольный сервер обмена сообщениями на основе Java с открытым исходным кодом. Он поддерживает стандартные отраслевые протоколы. Доступно подключение из C, C ++, Python, .Net и других языков программирования. Работает на основе протокола AMQP. Обмен сообщениями между веб-приложениями осуществляется с помощью STOMP через веб-сокеты. Также для работы с устройствами IoT используется MQTT. Обеспечивает «Enterprise Features», такие как кластеризация, хранение сообщений, с возможностью использовать различные базы данных, кэширование и ведение журналов. Написан на Java с полноценным клиентом Java Message Service (JMS).</li>
<li><strong>Kombu</strong> &#8212; это библиотека для работы с сообщениями на языке Python. Цель Kombu &#8212; максимально упростить обмен сообщениями в Python, предоставив высокоуровневый интерфейс для протокола AMQP, а также предоставить проверенные и проверенные решения для распространенных проблем обмена сообщениями. AMQP &#8212; это расширенный протокол очереди сообщений, открытый стандартный протокол для ориентации сообщений, организации очередей, маршрутизации, надежности и безопасности.</li>
</ul>
<h2><strong>Система контроля версий</strong></h2>
<ul>
<li><strong>Git</strong> &#8212; это бесплатная распределенная система контроля версий (управления версиями) с открытым исходным кодом, предназначенная для быстрой и эффективной работы с небольшими и очень крупными проектами. Хранилище истории разработки проектов, которое содержит в себе все версии его файлов (как текущие, так и старые неактуальные). Контроль версий означает что вы храните все версии редактируемых документов и можете вернуться к любой сохраненной версии в любой момент времени.</li>
<li><strong>Git-Flow</strong> &#8212; это набор расширений git предоставляющий высокоуровневые операции над репозиторием для поддержки модели ветвления Vincent Driessen.</li>
</ul>
<h2><strong>Git Frameworks. Автоматизация CI/CD</strong></h2>
<ul>
<li><strong>GitHub</strong> &#8212; это веб-платформа (облачный сервис по бизнес-модели SaaS), которая предлагает облачный хостинг Git (для контроля версий и совместной работы для разработчиков программного обеспечения). Microsoft, крупнейший участник GitHub, инициировала приобретение GitHub за 7,5 млрд долларов в июне 2018 года. GitHub был запущен в 2008 году и был основан на Git (системе управления открытым исходным кодом, созданная Линусом Торвальдсом для ускорения сборки программного обеспечения). <strong>GitHub это «социальная сеть для разработчиков».</strong> Участникам, кроме непосредственного хранения кода, своих проектов, можно общаться, комментировать изменения друг друга, отслеживать новости знакомых. У программистов есть возможность объединять репозитории и выводить вклад участника в виде дерева.</li>
<li><strong>BitBucket</strong> &#8212; это веб-сервис для хостинга GIT репозитория для контроля версий и совместной разработки проектов, основанный на системе контроля версий Mercurial и Git. Принадлежит Atlassian. Bitbucket предлагает как коммерческие планы, так и бесплатные аккаунты. <strong>Bitbucket интегрируется с другими программами Atlassian, такими как Jira, HipChat, Confluence и Bamboo.</strong> По назначению и основным предлагаемым функциям аналогичен GitHub. Основные преимущества GitHub лежат в области социализации программирования (social coding), Bitbucket больше ориентирован на небольшие закрытые команды разработчиков. Слоган сервиса — Bitbucket is the Git solution for professional teams («Bitbucket — это Git-решение для профессиональных команд»).</li>
<li><strong>GitLab</strong> &#8212; это веб-приложение на основе базы данных, так что его установка немного сложней, чем у некоторых других серверов git. GitLab помогает разработчикам вести непрерывный процесс развертывания для тестирования, создания и деплоя кода, следить за ходом тестов, повышать контроль над качеством, фокусирования на построении продукта вместо настройки инструментов. GitLab — <strong>веб-инструмент жизненного цикла DevOps</strong> с открытым исходным кодом, представляющий систему управления репозиториями кода для Git с собственной вики, системой отслеживания ошибок, CI/CD пайплайном и другими функциями. Код изначально был написан на Ruby, а некоторые его части были позже переписаны на Go.</li>
<li><strong>Jenkins</strong> &#8212; это система с открытым исходным кодом на Java, предназначенная для обеспечения процесса непрерывной интеграции программного обеспечения. Отсоединилась в 2008 году от проекта Hudson, принадлежащего компании Oracle, основным его автором был Косукэ Кавагути. Распространяется под лицензией MIT.</li>
</ul>
<h2><strong>Создание образов, сборка и доставка контейнеров</strong></h2>
<ul>
<li><strong>Docker</strong> &#8212; это программное обеспечение для автоматизации развертывания, быстрой разработки и тестирования приложений. Docker упаковывает ПО в стандартизованные блоки, которые называются контейнерами. Каждый контейнер включает все необходимое для работы приложения: библиотеки, системные инструменты, код и среду исполнения. Благодаря Docker можно быстро развертывать и масштабировать приложения в любой среде и сохранять уверенность в том, что код будет работать. Docker – это операционная система для контейнеров. Подобно тому как виртуальная машина создает виртуальное представление аппаратного обеспечения сервера (то есть устраняет необходимость непосредственно управлять таковым), контейнеры создают виртуальное представление серверной операционной системы. После установки на каждый сервер Docker предоставляет доступ к простым командам, необходимым для сборки, запуска или остановки контейнеров. Позволяет «упаковать» приложение со всем его окружением и зависимостями в контейнер, который может быть перенесён на любую Linux-систему с поддержкой cgroups в ядре, а также предоставляет среду по управлению контейнерами.</li>
<li><strong>OpenShift</strong> &#8212; это открытая и расширяемая платформа приложений-контейнеров, которая позволяет использовать Docker и Kubernetes на предприятии. Разработано компанией RedHat. OpenShift включает в себя Kubernetes для оркестрации контейнеров и управления ими.</li>
<li><strong>Kubernetes</strong> (также известный как <strong>k8s</strong> или «<strong>kube</strong>») &#8212; это платформа оркестрации контейнеров с открытым исходным кодом, которая автоматизирует многие ручные процессы, связанные с развертыванием, управлением и масштабированием контейнерных приложений. Kubernetes является идеальной платформой для размещения облачных приложений, требующих быстрого масштабирования, таких как потоковая передача данных в реальном времени через Apache Kafka.</li>
</ul>
<h2><strong>SQL Based Engines</strong></h2>
<ul>
<li><strong>Apache Hive</strong> — это система управления базами данных на основе платформы Hadoop. Позволяет выполнять запросы, агрегировать и анализировать данные, хранящиеся в Hadoop. Apache Hive был создан корпорацией Facebook и передан под открытой лицензией в собственность фонду Apache Software Foundation. На сегодняшний день эта система используется компанией Netflix и доступна в Amazon Web Services через Amazon Elastic MapReduce. Hive определяет простой SQL-подобный язык запросов, называемый HiveQL (Hive Query Language), что позволяет пользователям, знакомым с SQL легко работать с запросами к данным.</li>
<li><strong>Apache Impala</strong> &#8212; это аналитическая база данных с открытым исходным кодом для Apache Hadoop. Impala обеспечивает быстрые интерактивные SQL-запросы непосредственно на ваших данных Apache Hadoop, хранящихся в HDFS, HBase или Amazon Simple Storage Service (S3). Apache Impala &#8212; это механизм SQL-запросов с открытым исходным кодом для массивно-параллельной обработки (MPP) данных, хранящихся в компьютерном кластере под управлением Apache Hadoop.</li>
<li><strong>Apache Spark</strong> – это <strong>Big Data фреймворк</strong> с открытым исходным кодом для реализации распределённой обработки неструктурированных и слабоструктурированных данных, входящий в экосистему проектов Hadoop. В отличие от классического обработчика из ядра Hadoop, реализующего двухуровневую концепцию MapReduce с хранением промежуточных данных на накопителях, Spark работает в парадигме in-memory computing — обрабатывает данные в оперативной памяти, благодаря чему позволяет получать значительный выигрыш в скорости работы для некоторых классов задач, в частности, возможность многократного доступа к загруженным в память пользовательским данным делает библиотеку привлекательной для алгоритмов машинного обучения. Проект предоставляет программные интерфейсы для языков Java, Scala, Python, R. Изначально написан на Scala, впоследствии добавлена существенная часть кода на Java для предоставления возможности написания программ непосредственно на Java. Состоит из ядра и нескольких расширений, таких как Spark SQL (позволяет выполнять SQL-запросы над данными), Spark Streaming (надстройка для обработки потоковых данных), Spark MLlib (набор библиотек машинного обучения), GraphX (предназначено для распределённой обработки графов).</li>
<li><strong>Presto</strong> &#8212; это высокопроизводительный механизм распределенных SQL-запросов для Big Data (больших данных). Архитектура Presto позволяет пользователям отправлять запросы в различные источники данных, такие как Hadoop, AWS S3, Alluxio, MySQL, Cassandra, Kafka и MongoDB. Можно даже запросить данные из нескольких источников данных в рамках одного запроса. Presto &#8212; это программное обеспечение с открытым исходным кодом для сообщества, выпущенное по лицензии Apache.</li>
</ul>
<ul></ul>
<h2><strong>Качество кода</strong></h2>
<ul>
<li><strong>PIP8</strong> &#8212; это</li>
<li><strong>code review</strong> &#8212; это</li>
<li><strong>code refactoring</strong> &#8212; это</li>
</ul>
<h2><strong>JavaScript Инструменты</strong></h2>
<ul>
<li><strong>Socket.IO</strong> &#8212; это JavaScript библиотека, которая обеспечивает двустороннюю и основанную на событиях связь между браузером и сервером в режиме реального времени. Состоит из двух частей: клиентской, которая запускается в браузере и серверной для node.js. Socket.IO главным образом использует протокол WebSocket, но если нужно, использует другие методы, например Adobe Flash сокеты, JSONP запросы или AJAX запросы. Может быть установлена через npm (node package manager).</li>
<li><strong>NodeJS</strong> — это среда выполнения кода на JavaScript, созданная на основе движка Chrome V8 JavaScript, который позволяет транслировать вызовы на языке JavaScript в машинный код. NodeJS превращает JavaScript из узкоспециализированного языка в язык общего назначения. Node.js добавляет возможность JavaScript взаимодействовать с устройствами ввода-вывода через свой API (написанный на C++), подключать другие внешние библиотеки, написанные на разных языках, обеспечивая вызовы к ним из JavaScript-кода. Node.js применяется преимущественно на сервере, выполняя роль веб-сервера, но есть возможность разрабатывать на Node.js и десктопные оконные приложения (при помощи NW.js, AppJS или Electron для Linux, Windows и macOS) и даже программировать микроконтроллеры (например, tessel, low.js и espruino). В основе Node.js лежит событийно-ориентированное и асинхронное (или реактивное) программирование с неблокирующим вводом/выводом.</li>
<li><strong>Express.js (или просто Express)</strong> &#8212; это быстрый, гибкий, минималистичный веб-фреймворк для приложений Node.js, реализованный как свободное и открытое программное обеспечение под лицензией MIT. Он спроектирован для создания веб-приложений и API. Де-факто является стандартным каркасом для Node.js. Express может являться backend&#8217;ом для программного стека MEAN, вместе с базой данных MongoDB и каркасом Vue.js, React или AngularJS для frontend&#8217;а.</li>
<li><strong>WebSocket</strong> — это протокол связи поверх TCP-соединения, предназначенный для обмена сообщениями между браузером и веб-сервером в режиме реального времени. Веб-сокеты (Web Sockets) — это передовая технология, которая позволяет создавать интерактивное соединение между клиентом (браузером) и сервером для обмена сообщениями в режиме реального времени. Веб-сокеты, в отличие от HTTP, позволяют работать с двунаправленным потоком данных. WebSocket — это своего рода канал связи, открытый в двух направлениях.</li>
<li><strong>Vue.js</strong> — open source JavaScript веб-фреймворк с открытым исходным кодом для создания пользовательских интерфейсов. Легко интегрируется в проекты с использованием других JavaScript-библиотек. Может функционировать как веб-фреймворк для разработки одностраничных приложений в реактивном стиле. С его помощью можно создавать динамические сайты и сложные одностраничные веб-приложения. Ядро фреймворка ориентировано на решение задач уровня представления, благодаря чему фреймворк несложно интегрировать в проекты совместно с дополнительными библиотеками и различными инструментами. В отличие от React.js, jQuery, AngularJS и других фреймворков, Vue.js достаточно прост для изучения. Но, как и с другими JS-фреймворками, потребуются знания основ CSS, HTML и JavaScript, поэтому советуем сначала изучить их.</li>
<li><strong>Vuex</strong> &#8212; это шаблон/паттерн управления состоянием + библиотека для приложений Vue.js. Vuex можно рассматривать как единый источник данных для всего приложения. Vuex — это библиотека управления состоянием, специально предназначенная для создания сложных крупномасштабных приложений Vue.js. Она использует глобальное централизованное хранилище для всех компонентов в приложении, используя преимущества собственной системы реактивности для мгновенных обновлений. Хранилище Vuex спроектировано таким образом, что невозможно изменить его состояние из какого-либо компонента. Это гарантирует, что состояние может быть изменено только предсказуемым образом. Таким образом, хранилище становится единственным источником истины: каждый элемент данных хранится только один раз и доступен только для чтения, чтобы предотвратить разрушение компонентами приложения состояния, к которому обращаются другие компоненты. Хранилище Vuex — реактивное.</li>
<li><strong>Vue-router</strong> &#8212; является официальным маршрутизатор для Vue.js. Он тесно интегрируется с ядром Vue.js, что позволяет без проблем создавать одностраничные приложения с Vue.js.</li>
<li><strong>React</strong> — это декларативная, эффективная и гибкая библиотека JavaScript с открытым исходным кодом для разработки пользовательских интерфейсов. React может использоваться для разработки одностраничных и мобильных приложений. Его цель — предоставить высокую скорость, простоту и масштабируемость. В качестве библиотеки для разработки пользовательских интерфейсов React часто используется с другими библиотеками, такими как MobX, Redux и GraphQL.</li>
<li><strong>Angular</strong> — это JavaScript-фреймворк с открытым исходным кодом, написанный на языке TypeScript и который разрабатывается командой из компании Google, а также сообществом разработчиков из различных компаний. Цель фреймворка — расширение браузерных приложений на основе MVC-шаблона, а также упрощение тестирования и разработки.</li>
</ul>
<h2><strong>Траблшутинг</strong></h2>
<ul>
<li><strong>Wireshark</strong> — программа-анализатор сетевых протоколов (трафика для компьютерных сетей). Имеет графический пользовательский интерфейс. Он позволяет вам видеть то, что происходит в вашей сети, на микроскопическом уровне и является стандартом де-факто (и часто де-юре) для многих коммерческих и некоммерческих предприятий, государственных учреждений и образовательных учреждений. Развитие Wireshark процветает благодаря добровольному вкладу сетевых экспертов по всему миру и является продолжением проекта, начатого Джеральдом Комбсом в 1998 году. Работает на Windows, Linux, macOS, Solaris, FreeBSD, NetBSD и многих других платформах. Имеется выгрузка данных (экспорт данных) в XML, PostScript, CSV или простой текст (txt).</li>
<li><strong>Strace</strong> &#8212; утилита для Linux, которая позволяет отследить выполнение системных вызовов (system call) и сигналов к ядру системы. Она используется для мониторинга и вмешательства во взаимодействие между процессами и ядром Linux, которое включает системные вызовы, доставку сигналов и изменения состояния процессов. Операция strace стала возможной благодаря функции ядра, известной как ptrace. Присутствует во многих дистрибутивах Linux по умолчанию. strace может использоваться для отправки багрепортов разработчикам.</li>
<li><strong>Procmon (Process Monitor)</strong> — это инструмент отслеживания для Windows. В режиме реального времени отображает активность файловой системы, реестра, а также процессов и потоков, включая расширенную и безвредную фильтрацию, всеобъемлющие свойства событий, такие как ID сессий и имена пользователей, достоверную информацию о процессах, полноценный стек потока со встроенной поддержкой всех операций, одновременный запись информации в файл и многие другие возможности. Эти уникальные возможности делают Process Monitor ключевым инструментом для устранения неполадок и избавления от вредоносных программ.</li>
<li><strong>gdb</strong> — это переносимый отладчик проекта GNU, который умеет производить отладку многих языков программирования, включая Си, C++, Free Pascal, FreeBASIC, Ada, Фортран, Python3, Swift, NASM и Rust. GDB можно подключить к VSCode и другим редакторам кода (Включая Vim, NeoVim, Emacs, Atom и др.). GDB может работать на большинстве популярных вариантов UNIX и Microsoft Windows, а также на Mac OS X.</li>
<li><strong>Syslog (system log &#8212; системный журнал)</strong> &#8212; это стандарт отправки и регистрации сообщений о происходящих в системе событиях (то есть создания событийных журналов), использующийся в компьютерных сетях, работающих по протоколу IP. Термином &#171;syslog&#187; называют как ныне стандартизированный сетевой протокол syslog, так и программное обеспечение (приложение, библиотеку), которое занимается отправкой и получением системных сообщений.</li>
<li><strong>Windows Event Log (Средство просмотра событий Windows)</strong> &#8212; отображает журнал приложений и системных сообщений, включая ошибки, информационные сообщения и предупреждения. Это полезный инструмент для устранения различных проблем Windows. Можно выгрузить журнал в текстовый файл.</li>
</ul>
<h2><strong>BI &#8212; Business intelligence. Системы бизнес-аналитики</strong></h2>
<p>Ниже будут описаны 3 bi системы, по квадранту гартнера их можно упорядочить как:</p>
<ol>
<li>Power BI</li>
<li>Tableau</li>
<li>Qlik Sense</li>
</ol>
<p>Из всех трех я бы однозначно отдал первенство Power BI, т.к. будем откровенны &#8212; ни одна компания в мире не обладает потенциалом, который есть у Microsoft для работы с данными компаний. По сути, Power BI родился из Excel, сервисов хранилищ данных Microsoft. Инструментарий очень богат, плюс есть огромное множество интеграций с другим софтом (Python, R и др.).</p>
<p><strong>Tableau</strong> на втором месте по большей части из-за очень крутой визуализации.</p>
<p>Ну а<strong> Qlik Sense</strong> занимает третье место (по инерции), т.к. когда то был лидером квадранта и многие компании до сих пор используют это ПО. У меня есть опыт работы с Qlik Sense и хочу сказать, что мне сложно его отнести к лидерам BI инструментов, т.к. QlikTech развивает свою экосистему обработки данных в ущерб функционалу BI. Что несомненно сказалось на позициях Qlik Sense на рынке. Плюс QlikTech свернул свой бесплатный софт Qlik Sense Desktop, что несомненно негативно отразилось на настроениях специалистов.</p>
<ul>
<li><strong>Power BI</strong> — это это платформа бизнес-аналитики (Business Intelligence), которая предоставляет инструменты для агрегирования, анализа, визуализации данных. Как правило все инструменты максимально адаптированы для нетехнических пользователей для построения аналитических панелей. В случае больших объемов данных или сложной логики приложений требуется более углубленный технический бэкграунд для создания приложений. С помощью Power BI Вы можете построить дашборд с нужными KPI по компании. Power BI состоит из настольного приложения Windows, которое называется Power BI Desktop (в нем Вы создаете само приложение), онлайн-служба SaaS под названием Power BI Service (туда публикуется приложение из Power BI Desktop), а также мобильное приложение Power BI, которое доступно для платформ iOS, Android и Windows.</li>
<li><strong>Tableau</strong> – BI-система интерактивной аналитики, которая позволяет в кратчайшие сроки проводить глубокий и разносторонний анализ больших массивов информации и не требующая обучения бизнес-пользователей и дорогостоящего внедрения. Tableau Online — это онлайн-сервис (функционал Tableau Desktop, но удаленно, в облаке), Tableau Prep &#8212; подготовка данных к работе в Tableau, Tableau Server &#8212; ПО для установки BI на серверах компании. Также имеется мобильное приложение.</li>
<li><strong>Qlik Sense</strong> — это платформа для анализа данных / система бизнес-аналитики (Business Intelligence), которая позволяет создавать аналитические приложения (агрегирование данных, визуализация). В отличии от Power BI, можно купить свой Enterprice сервер и поставить на сервер компании. У Power BI тоже такое есть, но вроде как за очень большие деньги (честно сказать деталей не знаю). По сравнению с Power BI больше подходит для технических пользователей. Загрузку данных нужно кодить, есть визуальные инструменты, но они более скудные по функционалу и возможностям. Хотя есть платные расширения VizLib, которые разрабатывает тот же QlikTech, но это уже за дополнительные деньги. Сервер внутри компании облегчает доступ к данным, т.к. не нужно весь массив данных компании выводить в онлайн (создавать онлайн хранилище, закачивать данные в облако и т.д.). Также Qlik Sense имеет очень мощный API, с полным доступом ко всем функциям платформы Qlik Sense. Но стоит заметить, что подобный функционал не нужен в 85% случаев. Возможно только если компания захочет сделать свой &#171;космолет&#187;, который будет стоить очень больших денег на этапе эксплуатации.</li>
</ul>
<h3><strong>Другие системы визуализации данных, которые можно использовать в своих проектах</strong></h3>
<ul>
<li><strong>Prometheus</strong> &#8212; это</li>
<li><strong>Kibana</strong> &#8212; это</li>
<li><strong>Grafana</strong> &#8212; это</li>
<li><strong>Graphite</strong> &#8212; это</li>
</ul>
<h2><strong>Принципы разработки программного обеспечения</strong></h2>
<ul>
<li><strong>SOA (Service Oriented Architecture)</strong> &#8212; это модульный подход к разработке программного обеспечения, основанный на использовании распределённых, слабо связанных заменяемых компонентов, оснащённых стандартизированными интерфейсами для взаимодействия по стандартизированным протоколам. интеграции информационной инфраструктуры компании за счет построения архитектуры, позволяющей интегрировать с максимальной гибкостью разнородные приложения.</li>
</ul>
<blockquote>
<p><strong>В основе SOA</strong> лежат принципы многократного использования функциональных элементов ИТ, ликвидации дублирования функциональности в ПО, унификации типовых операционных процессов, обеспечения перевода операционной модели компании на централизованные процессы и функциональную организацию на основе промышленной платформы интеграции.</p>
<p><strong>С помощью SOA реализуются три аспекта ИТ-сервисов:</strong></p>
<ul>
<li><em>Сервисы бизнес-функций, </em></li>
<li><em>Сервисы инфраструктуры, </em></li>
<li><em>Сервисы жизненного цикла.</em></li>
</ul>
</blockquote>
<ul>
<li><strong>Архитектура SPA (Single-Page Application или одностраничные приложения)</strong> &#8212; тип веб-приложений, состоящие из одной страницы, на которых динамически обновляется контент, в зависимости от действий пользователей. При таком подходе разработки экономится время на повторную загрузку одних и тех же элементов (библиотек JS, стилей CSS, структуры сайта, меню и т.д.). По большей части этот подход реализуется за счет инструментов JavaScript (React.js, Angular.js, Vue.js и др.).</li>
<li><strong>Архитектура MPA (Multi-Page Application или многостраничные приложения)</strong> &#8212; в многостраничных приложениях каждая страница отправляет запрос на сервер и полностью обновляет все данные. Даже если эти данные небольшие. Таким образом тратятся ресурсы как сервера, так и браузера клиента на перерисовку одних и тех же элементов. Соответственно это сказывается на работоспособности сайта. Поэтому многие разработчики, для того чтобы повысить скорость и уменьшить нагрузку, используют комбинированный подход: сайт состоит из разных страниц (главная, корзина, категории товаров, информация и т.п.), но на каждой странице есть динамическая составляющая работы, например, на странице категории товаров при работе с фильтрами товары подгружаются/обновляются/фильтруются с помощью JavaScript (без перезагрузки всей страницы).</li>
<li><strong>Паттерн (Design Pattern &#8212; Шаблон проектирования)</strong> — многократно используемые архитектурные конструкции для решения известных и распространенных проблем проектирования программного обеспечения.<br />MVC, MVP и MVVM &#8212; три популярных шаблона проектирования в разработке программного обеспечения.</li>
<li><strong>MVC &#8212; Model-View-Controller в веб-приложении:</strong> 1) Пользователь вводит URL-адрес, 2) <strong>Контроллер (Controller)</strong> получает этот запрос, 3) Контроллер использует <strong>Модель (Model)</strong> для получения всех необходимых данных, организует их, и пересылает их 4) <strong>Представлению (View)</strong>, которое затем использует эти данные, чтобы отрисовать готовую страницу для пользователя в браузере. Т.е. <strong>Модель</strong> &#8212; это механизм общения с базой данных. <strong>Контролер</strong> &#8212; это функционал, который управляет последовательностью действий, принимает данные и передает их. <strong>View</strong> &#8212; отвечает за фронтэнд (frontend), то что видит пользователь.</li>
<li><strong>Паттерн MVP (Model-View-Presenter)</strong> &#8212; шаблон проектирования, производный от MVC, который используется в основном для построения пользовательского интерфейса. Состоит из 1) Модели (данные для отображения), 2) Вида/View (отображает данные из модели, обращается к Presenter), и 3) Представитель/Presenter (реализует взаимодействие между Моделью и Видом и содержит в себе всю бизнес-логику). По сути Presenter &#8212; это контроллер MVC, за исключением того, что он вообще не привязан к View, а просто взаимодействует с интерфейсом. Это решает проблемы тестируемости, а также проблемы модульности / гибкости, которые у нас были с MVC. Presenter сидят на одном уровне с View, слушая события как из View, так и из Model, и связывает действия между ними.</li>
<li><strong>Паттерн MVVM (Model-View-View Model)</strong> &#8212; модель, представление и третий компонент – дополнительная модель под названием ViewModel. MVVM позволяет нам создавать специфичные для View подмножества модели, которые могут содержать информацию о состоянии и логике, избегая необходимости представлять всю модель для представления. Шаблон MVVM поддерживает двустороннюю привязку данных между View и View-Model. Это позволяет автоматически распространять изменения внутри состояния View-Model на View.</li>
</ul>
<blockquote>
<p><strong>И MVP, и MVVM являются производными от MVC.</strong> Основное различие между MVC и его производными заключается в зависимости каждого слоя от других уровней, а также от того, насколько тесно они связаны друг с другом.</p>
<p>MVP и MVVM лучше по сравнению с MVC, разбивают ваше приложение на модульные, специализированные компоненты, но они также увеличивают сложность вашего приложения. Для очень простого приложения с одним или двумя экранами MVC может работать очень хорошо. MVVM с привязкой данных привлекателен, поскольку он следует более реактивной модели программирования и требует меньше кода.</p>
</blockquote>
<ul>
<li><strong>ESB (Enterprise Service Bus &#171;сервисная шина предприятия&#187;)</strong> &#8212; это концепция, элемент архитектуры IT-ландшафта, используемый для решения задачи интеграции разрозненных информационных систем в единый программный комплекс с централизованным управлением передачей информации и применением сервис-ориентированного подхода. Архитектура ESB строится на 3 компонентах: набор коннекторов, очередь сообщений, платформа. Архитектура ESB заключается во взаимодействии всех приложений через единую точку. При замене одного приложения, подключенного к шине, нет необходимости перенастраивать остальные.</li>
<li><strong>SOLID </strong>&#8212; принцип, за которым скрывается рекомендация следовать 5 базовым принципам ООП:
<ul>
<li><strong><span style="color: #ff6600;">S</span>ingle Responsibility Principle (принцип единственности ответственности)</strong> &#8212; один класс отвечает за один функционал.</li>
<li><strong><span style="color: #ff6600;">O</span>pen/Closed Principle (принцип открытости/закрытости)</strong> &#8212; программные сущности должны быть открыты к расширению, но закрыты к изменению.</li>
<li><strong><span style="color: #ff6600;">L</span>iskov Substitution Principle (принцип подстановки Барбары Лисков)</strong> &#8212; сущность, которая использует объект, реализующий определенный интерфейс, должна иметь возможность использовать другой объект с тем же интерфейсом, даже не зная об этом. Подклассы не могут замещать поведения базовых классов. Подтипы должны дополнять базовые типы.</li>
<li><strong><span style="color: #ff6600;">I</span>nterface Segregation Principle (принцип разделения интерфейса)</strong> &#8212; клиенты не должны зависеть от методов, которые они не используют. Слишком &#171;толстые&#187; интерфейсы необходимо дробить на более мелкие и специфические, чтобы клиенты маленьких интерфейсов знали только о методах, которые необходимы им в работе.</li>
<li><strong><span style="color: #ff6600;">D</span>ependency Inversion Principle (принцип инверсии зависимостей)</strong> &#8212; Модули верхнего уровня не зависят от модулей нижнего уровня. И те, и другие должны зависеть от абстракций. Абстракции не должны зависеть от деталей. Детали должны зависеть от абстракций.</li>
</ul>
</li>
<li><strong>KISS (&#171;Keep It Simple, Stupid&#187; или &#171;<span>Keep It Short and Simple</span>&#171;) </strong>&#8212; это принцип проектирования и программирования, согласно которому основной целью (ценностью) при разработке системы является её простота. Большинство систем работают лучше всего, если они остаются простыми, а не усложняются. Основная суть принципа: 1) нужно реализовывать только тот функционал, который необходим пользователю и описан в ТЗ, не нужно <span>закладывать в проект избыточные функции &#171;про запас&#187;</span>. 2) не нужно делать реализацию сложной универсальной бизнес-логики под все варианты поведения системы (это невозможно и с коммерческой точки зрения не принесет выгоды). 3) не стоит подключать огромную библиотеку ради пары функций.</li>
<li><strong>DRY (Don&#8217;t Repeat Yourself) </strong>&#8212; <span>не повторяйся</span>. Принцип DRY известен также как <strong>DIE (Duplication Is Evil)</strong> &#8212; дублирование это зло. Принцип состоит в том, что нужно избегать использования одного и того же кода. Дубли кода лучше заменять на универсальные свойства и/или функции.</li>
<li><strong>YAGNI (You Aren&#8217;t Gonna Need It) &#8212; &#171;Вам это не понадобится&#187;</strong> &#8212; это принцип проектирования программ/систем, согласно которому в качестве главной цели (ценности) является отказ от избыточной функциональности, которая не заявлена заказчиком. Исходя из экономики проекта можно сделать вывод, что любые реализованные &#171;фичи&#187; были оплачены либо Заказчиком, либо Исполнителем. В одном случае это завышенный бюджет проекта, в другом случае это уменьшенная прибыль. Любые дополнительные фичи в дальнейшем усложняют эксплуатацию систем/программ/проектов, увеличивают количество ошибок и снижают понимание клиентом продукта. Есть такая поговорка &#171;лучший код — это ненаписанный код&#187;. Помните, что ни одно гибкое решение никогда не будет достаточно гибким. При изменении входных параметров в системе что-то может &#171;сломаться&#187;, испортится бизнес-логика и т.д.</li>
<li><strong>GRASP (General Responsibility Assignment Software Patterns) </strong>&#8212; это шаблоны, используемые в объектно-ориентированном проектировании для решения общих задач по назначению ответственностей классам и объектам. GRASP состоит из 5 основных и 4 дополнительных шаблонов.</li>
<li><strong>SoC (Separation of Concerns)</strong> &#8212; это принцип в области разработки программного обеспечения, суть которого заключается в следующем: не пишите свою программу как один сплошной блок, вместо этого разбивайте код на куски, которые представляют собой крошечные фрагменты системы, каждый из которых способен выполнить простую отдельную работу. Разделение ответственностей &#8212; это процесс разделения компьютерной программы на функциональные блоки, которые не будут перекрывать функции друг друга.</li>
<li><strong>4C’s (Clean Code &gt; Clever Code)</strong> &#8212; дословно означает &#171;Чистый код -&gt; Умный код&#187;. Отладка в два раза сложнее написания первоначального кода.</li>
<li><strong>SLAP (Single Level Of Abstraction) &#8212; это Принцип Единого Уровня Абстракции:</strong> Идея заключается в том, что в рамках определенного метода/функции мы должны стремиться сохранить весь код на одном уровне абстракции, чтобы легче было его читать. Весь смысл заключается в том, чтобы при чтении кода нам приходилось держать в голове меньше контекста о коде и мы могли просто прочитать код и быстро понять, что происходит. Раскладывайте длинные методы/функции на более короткие методы/функции, каждый из которых несет решает одну задачу и имеет четкое название, прочитав которое станет понятно, что функция делает.</li>
</ul>
<h2><strong>Протоколы передачи финансовых данных</strong></h2>
<ul>
<li><strong>FIX (Financial Information eXchange)</strong> &#8212; открытый стандарт передачи информации в электронном виде, который передает финансовую информации и автоматизации коммуникаций на фондовом рынке. Протокол не справлялся с возросшим объёмом финансовой информации, генерируемой на фондовом рынке. При передачи больших объёмов данных с помощью FIX возникали значительные задержки в их обработке, что приносило трейдерам убытки и лишало их возможности разработки действующих торговых стратегий. Поэтому в 2004 году было решено разработать новый протокол (FAST), целью которого было добиться возможности передачи больших объёмов данных, избегая появления задержек в получении информации.<br /><strong></strong></li>
<li><strong>FAST (FIX Adapted for STreaming)</strong> &#8212; бинарный вариант протокола FIX, который был адаптирован для поточной передачи данных по сети. FAST позволяет в более компактном виде передавать большие объёмы информации о рыночных сделках, применяется в высокоскоростных торговых системах, требующих низких задержек передачи. Трейдеры могут получать по FAST таблицы финансовых инструментов (цены, объёмы торгов и т.п.), котировки, все сделки, индексы, а также информацию обо всех активных обезличенных заявках. Используется на многих мировых биржах, в том числе и на Московской бирже и Санкт-Петербургской бирже.</li>
</ul>
<h2><strong>Архитектурные подходы к проектированию модели данных</strong></h2>
<ul>
<li><strong>Kimball</strong> &#8212; это</li>
<li><strong>Inmon </strong>&#8212; это</li>
<li><strong>Data Vault</strong> &#8212; это</li>
<li><strong>Data Lake</strong> &#8212; это</li>
</ul>
<ul></ul>
<h2><strong>ETL, ELT, Data Pipeline &#8212; термины по обработке данных</strong></h2>
<h3><span style="color: #ff6600;"><strong>Что такое Data Pipeline или Конвейер данных?</strong></span></h3>
<p><strong>Data Pipeline (Конвейер данных)</strong> &#8212; это программное обеспечение, которое исключает множество ручных шагов из процесса и обеспечивает плавный, автоматизированный поток данных от одной станции к другой. Data Pipeline начинается с определения того, какие данные, откуда и как собирать. Он автоматизирует процессы, связанные с извлечением, преобразованием, объединением, проверкой и загрузкой данных для дальнейшего анализа и визуализации. Конвейер данных обеспечивает сквозную передачу данных, устраняя ошибки, узкие места или задержки. Data Pipeline может обрабатывать несколько потоков данных одновременно. Короче говоря, это абсолютная необходимость для современного data-driven предприятия.</p>
<p>Конвейер данных рассматривает все данные как потоковые данные и обеспечивает гибкие схемы. Независимо от того, поступают ли они из статических источников (например, базы данных с плоскими файлами) или из источников в реальном времени (например, онлайн розничные транзакции), конвейер данных делит каждый поток данных на более мелкие порции, которые он обрабатывает параллельно, предоставляя дополнительную вычислительную мощность.</p>
<p>Конвейер данных не требует, чтобы конечным пунктом назначения было хранилище данных. Он может направлять данные в другое приложение, такое как инструмент визуализации или Salesforce. Думайте о Data Pipeline как об окончательной сборочной линии.</p>
<h3><span style="color: #ff6600;"><strong>Чем конвейер данных отличается от ETL?</strong></span></h3>
<p><strong>ETL расшифровывается как Extract, Transform и Load.</strong> Системы ETL извлекают данные из одной системы, преобразуют их и загружают в базу данных или хранилище данных. Устаревшие конвейеры ETL обычно работают в пакетном режиме, что означает, что данные перемещаются единым большим блоком в определенное время в целевое хранилище данных. Как правило, это происходит по заданному расписанию или через регулярные запланированные интервалы. Например, вы можете настроить запуск пакетов в 00:30 каждый день, когда нагрузка на системы учета (ERP, MES и т.д.) низкая.</p>
<p><strong>&#171;Конвейер данных&#187;</strong> является более широким термином, который охватывает ETL как подмножество. Конвейер данных относится к системе для перемещения данных из одной системы в другую. Данные могут преобразовываться или не преобразовываться, и они могут обрабатываться в режиме реального времени (в потоковом режиме) вместо пакетного типа обработки. Кроме того, данные могут не загружаться в базу данных или хранилище данных. Конвейер данных может использоваться для разных целей: таких как корзина AWS (контейнеры для объектов) или озеро данных, или может запускать триггер в другой системе, например, для запуска определенного бизнес-процесса.</p>
<h3><span style="color: #ff6600;"><strong>ETL и ELT</strong></span></h3>
<p><strong>7 отличий ETL от ELT:</strong></p>
<ol>
<li><strong>ETL</strong> &#8212; это извлечение, преобразование и загрузка данных, а ELT &#8212; извлечение, загрузка и преобразование данных.</li>
<li>В <strong>ETL</strong> данные перемещаются из источника данных в промежуточное хранилище (Data Staging) и затем в хранилище данных.</li>
<li><strong>ELT</strong> использует хранилище данных для базовых преобразований. Data Staging не требуется.</li>
<li><strong>ETL</strong> обеспечивает конфиденциальность данных (data privacy), производится очистка данных и их преобразования.</li>
<li><strong>ETL</strong> может выполнять сложные преобразования данных и может быть более рентабельным, чем ELT.</li>
<li><strong>ETL</strong> применяется для работы с хранилищами данных</li>
<li><strong>ELT</strong> применяется, когда необходимо создавать озера данных.</li>
</ol>
<p><strong>Извлечение (Extract):</strong> это выгрузка исходных данных из исходной базы данных или источника данных (API, Excel, txt, csv и т.д.). При использовании ETL данные попадают во временную промежуточную область. В ELT данные сразу попадают в систему хранения озера данных.<br /><strong>Преобразование (Transform):</strong> это процесс изменения структуры информации, поэтому оно интегрируется с целевой системой данных и остальными данными в этой системе.<br /><strong>Загрузка (Load):</strong> относится к процессу внесения информации в систему хранения данных.</p>
<h4><strong>Что такое ETL?</strong></h4>
<p><strong>ETL (или Извлечение, Преобразование, Загрузка)</strong> &#8212; это сбор и обработка данных из различных источников в одно хранилище данных, где они могут быть проанализированы. Ваша компания имеет доступ ко многим источникам данных, но чаще всего эти данные представляются менее полезным для вас способом. Результаты этого анализа могут быть использованы для информирования ваших бизнес-стратегий и решений.</p>
<p><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2020/04/ETL_Process_Schema.png"><img fetchpriority="high" decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2020/04/ETL_Process_Schema.png" alt="" width="665" height="354" class="aligncenter size-full wp-image-1183" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2020/04/ETL_Process_Schema.png 665w, https://python.ivan-shamaev.ru/wp-content/uploads/2020/04/ETL_Process_Schema-300x160.png 300w" sizes="(max-width: 665px) 100vw, 665px" /></a></p>
<h4><strong>Что такое ELT?</strong></h4>
<blockquote>
<p><strong>ELT</strong> позволяет загрузить все данные немедленно, а пользователи могут позже определить, какие данные преобразовать и анализировать.</p>
</blockquote>
<p>Для начала рассмотрим термин <strong>&#171;Озера данных&#187;</strong> &#8212; это особые виды хранилищ данных, которые, в отличие от хранилищ данных OLAP, принимают любые виды структурированных или неструктурированных данных. Озера данных не требуют от вас преобразования данных перед их загрузкой. Вы можете немедленно загрузить любую необработанную информацию в озеро данных, независимо от ее формата или отсутствия формата. Преобразование данных все еще необходимо, прежде чем анализировать данные с помощью платформы бизнес-аналитики. Однако очистка, обогащение и преобразование данных происходят после загрузки данных в озеро данных.</p>
<p><strong>ELT</strong> &#8212; это относительно новая технология, которая стала возможной благодаря современным облачным серверным технологиям. ELT в сочетании с озером данных позволяет вам сразу же получать доступ к постоянно расширяющемуся пулу необработанных данных по мере их доступности. Основное преимущество ELT перед ETL связано с гибкостью и простотой хранения новых неструктурированных данных. С ELT вы можете сохранить любой тип информации &#8212; даже если у вас нет времени или возможности сначала преобразовать и структурировать ее &#8212; обеспечивая немедленный доступ ко всей вашей информации, когда вы этого хотите. Кроме того, вам не нужно разрабатывать сложные процессы ETL до поступления данных, что экономит время разработчиков и аналитиков BI при работе с новой информацией.</p>
<p><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2020/04/ELT_Process_Schema.png"><img decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2020/04/ELT_Process_Schema.png" alt="" width="655" height="354" class="aligncenter size-full wp-image-1184" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2020/04/ELT_Process_Schema.png 655w, https://python.ivan-shamaev.ru/wp-content/uploads/2020/04/ELT_Process_Schema-300x162.png 300w" sizes="(max-width: 655px) 100vw, 655px" /></a></p>
<h3>Управление данными</h3>
<ul>
<li><strong>Управление данными</strong> &#8212; общее управление доступностью, удобством использования, целостностью и безопасностью корпоративных данных. Это процесс создания согласованных и связанных слоев данных. Управление данными обеспечивает демократизацию данных, предоставляя целостное представление о постоянно расширяющейся вселенной данных для всех клиентов данных.</li>
<li><strong>Демократия данных</strong> &#8212; помогает всем, кому необходим доступ к аналитике данных в вашей компании, сократить крутые кривые обучения, задать правильные вопросы о данных и принять участие в процессе уточнения ответов.</li>
</ul>
<h3><strong>Виды трансформации данных</strong></h3>
<ul>
<li><strong>Дедупликация (нормализация) / Deduplication (normalizing):</strong> идентифицирует и удаляет дублирующую информацию.</li>
<li><strong>Перестройка ключей / Key restructuring:</strong> создание ключевых соединений одних таблиц с другими.</li>
<li><strong>Очистка / Cleansing:</strong> включает удаление старых, неполных и дублированных данных, чтобы максимизировать точность данных &#8212; путем анализа данных для удаления синтаксических ошибок, опечаток и фрагментов записей.</li>
<li><strong>Пересмотр формата / Format revision:</strong> преобразует форматы в разных наборах данных &#8212; таких как дата / время, мужчина / женщина и единицы измерения &#8212; в один согласованный формат.</li>
<li><strong>Деривация / Derivation:</strong> создает правила преобразования, которые применяются к данным. Например, может быть, вам нужно вычесть определенные затраты или налоговые обязательства из показателей доходов бизнеса, прежде чем анализировать их.</li>
<li><strong>Агрегирование / Aggregation:</strong> собирает и ищет данные, чтобы их можно было представить в виде сводного отчета.</li>
<li><strong>Интеграция / Integration:</strong> согласовывает различные имена / значения, которые применяются к одним и тем же элементам данных в хранилище данных, так что каждый элемент имеет стандартное имя и определение.</li>
<li><strong>Фильтрация / Filtering:</strong> выбирает определенные столбцы, строки и поля в наборе данных.</li>
<li><strong>Разделение / Splitting:</strong> разбивает один столбец на несколько столбцов.</li>
<li><strong>Присоединение / Joining:</strong> связывает данные из более чем одного источника, например, добавляет информацию о расходах на более чем одну платформу SaaS.</li>
<li><strong>Суммирование / Summarization:</strong> создает различные бизнес-показатели путем вычисления итоговых значений. Например, вы можете сложить все продажи, сделанные конкретным продавцом, чтобы создать метрики общих продаж за определенные периоды.</li>
<li><strong>Валидация / Validation:</strong> устанавливает автоматические правила, которым необходимо следовать при различных обстоятельствах. Например, если первые пять полей в строке имеют значение ПУСТО (NULL), вы можете пометить строку для исследования или запретить ее обработку с остальной информацией.</li>
</ul>
<h2>Системы мониторинга баз данных, IT-инфраструктуры</h2>
<ul>
<li><strong>Sentry</strong> &#8212; это</li>
<li><strong>ELK + elastalert</strong> &#8212; это</li>
<li><strong>Prometheus </strong>&#8212; это</li>
<li><strong>newrelic </strong>&#8212; это</li>
<li><strong>Kibana </strong>&#8212; это</li>
<li><strong>Grafana </strong>&#8212; это</li>
<li><strong>Zabbix</strong> — свободно распространяемая система универсального мониторинга любой <strong>IT инфраструктуры</strong> (сервисов компьютерной сети, серверов и сетевого оборудования), облачных ресурсов, сервисов и приложений, написанная Алексеем Владышевым. Для хранения данных используется MySQL, PostgreSQL, SQLite или Oracle Database, веб-интерфейс написан на PHP.</li>
</ul>
<h2><strong>Системы/Приложения/Сервисы для проектирования пользовательских интерфейсов</strong></h2>
<ul>
<li><strong>Balsamiq</strong> &#8212; это</li>
<li><strong>Axure </strong>&#8212; это</li>
<li><strong>Pencil </strong>&#8212; это</li>
<li><strong>Visio </strong>&#8212; это</li>
<li><strong><a href="https://app.diagrams.net/" target="_blank" rel="noopener noreferrer">app.diagrams.net</a> </strong>&#8212; это</li>
</ul>
<h2><strong>Системы управления конфигурацией</strong></h2>
<ul>
<li><strong>Ansible</strong> &#8212; это</li>
</ul>
<h2><strong>Терминология для разработчика (независимо от языка программирования)</strong></h2>
<ul>
<li><strong>DevOps.</strong> Термин, объединяющий разработку и эксплуатацию. Объединяет методы и шаблоны, способствующие налаживанию сотрудничества между специалистами команды разработчиков, направляет процесс разработки высококачественного программного обеспечения. Эти методы и шаблоны помогают командам писать пригодные для тестирования и поддержания кодов пакетные продукты, развертки и сохранять развертку кода.</li>
<li><strong>Выпуск продукта (Product Release).</strong> Выпуск продукта ПО может состоять из нового продукта или функций уже существующего. В контексте Agile функция может складываться из одной и более пользовательских историй.</li>
<li><strong>Продукт с минимальным функционалом (MVP)</strong> &#8212; продукт, который имеет достаточно ключевых функций, позволяющих делать развертку на небольшие группы потенциальных клиентов. Эти люди формируют часть цикла обратной связи build-measure-learn, или проверенного обучения, направляя дальнейшую разработку и принятие решений. Продукт с минимальным функционалом также используется для представления последних внесенных изменений, которые могут повысить его привлекательность для клиентов.</li>
<li><strong>Разработка на основе наборов (Set-based Development).</strong> В процессе разработки на основе наборов несколько специалистов или команд, независимо друг от друга, предлагают варианты решения проблемы. Заинтересованные стороны, представители бизнеса или другие участники процесса оценивают результаты и выбирают наиболее подходящий.</li>
<li><strong>Разработка на основе приемочного тестирования (Acceptance-Test-Driven Development, ATDD).</strong> Командам, занимающимся разработкой на основе приемочного тестирования, выполнимые тесты помогают определять примеры, полученные во время обсуждений работы с заказчиком. Каждый пример уточняется и представляется в выполнимом формате. Программисты при разработке функций используют тесты как руководство. Когда код написан, Тестирование может проводиться как автоматизированное регрессионное, документирующее поведение функций.</li>
<li><strong>Разработка через тестирование (Test-Driven Development, TDD).</strong> При разработке через тестирование программист, прежде чем написать минимальное количество кода, который позволит провести успешную проверку, создает и автоматизирует маленькие модульные тесты, которые изначально выдают ошибки. Код проходит рефакторинг для того, чтобы соответствовать стандартам. Производственный код написан так, чтобы пропускать по одному тесту за один раз. TDD также называют дизайном на основе тестов, поскольку этот процесс больше относится к методу написания кода, чем к тестированию, и помогает создать надежный, простой в обслуживании код.</li>
<li><strong>Разработка через поведение (Behavior-Driven Development, BDD).</strong> Примеры желаемого поведения, полученные от представителей заказчика, переводятся в выполнимые тесты в формате given_when_then. Программисты автоматизируют тесты, а затем пишут код для прохождения каждого из них. Разработка через поведение может быть использована на модульном уровне для дизайна на основе проверок и бизнес-ориентированных тестов, охватывающих множество компонентов и уровней приложения.</li>
<li><strong>Технический долг (Technical Debt).</strong> Когда команда разработчиков идет по пути наименьшего сопротивления и жертвует качеством ради того, чтобы бизнес мог воспользоваться ситуацией, они образуют долг в плохо спроектированном софте, не защищенном регрессионным тестированием или провисающем по другим качественным характеристикам. Если команда не находит времени, чтобы &#171;выплатить&#187; долг с помощью рефакторинга или добавления автоматизированных регрессионных тестов, разрабатывать новые функции становится сложнее, и &#171;общий&#187; долг замедляет работу команды.</li>
<li><strong>Унаследованная система (Legacy System).</strong> Система, не поддерживаемая автоматизированными регрессионными тестами. Внесение изменений в унаследованный код или его рефакторинг может представлять риски, поскольку не существует тестов, способных уловить незапланированные изменения в поведении системы.</li>
<li><strong>Legacy Code</strong> &#8212; это ценный код, доставшийся в наследство от предыдущих разработчиков, который Вы боитесь изменить, потому что не знаете, как внести изменения и при этом не нарушить существующее поведение системы или программы. Legacy code — тяжелая наследственность, устаревший код, который более не поддерживается и не обновляется, но используется.</li>
<li><strong>IaaS, PaaS и SaaS</strong> — это основные модели предоставления облачных услуг.
<ul>
<li><strong>Инфраструктура как сервис (Infrastructure as a Service, IaaS).</strong> Модель обслуживания, следуя которой организация использует облачные сервисы для поддержки эксплуатации, включая хранение данных, оборудование, серверы и сетевые компоненты. Сервисы принадлежат провайдеру, который отвечает за их размещение, работу и поддержку. Как правило, клиент платит по факту использования. В IaaS клиент получает только инфраструктуру. <strong>Пример</strong>: «виртуальный дата-центр» от Selectel или CloudLITE.</li>
<li><strong>Платформа как услуга (Platform-as-a-Service, Paas).</strong> Разновидность ПО как услуги. Модель предоставления услуг, позволяющая заказчику арендовать виртуальные серверы и сопутствующие услуги для работы существующих приложений или разработки новых. В PaaS — инфраструктуру и подготовленное для разработки приложений ПО. <strong>Пример</strong>: Облачная среда разработки Codenvy, Microsoft Azure или AWS.</li>
<li><strong>ПО как сервис (Software-as-a-Service, SaaS).</strong> В этой модели обслуживания подрядчик или провайдер самостоятельно размещает приложения. Вместо того, чтобы установить ПО на собственное оборудование (случай &#171;ПО как продукт&#187;), клиенты получают доступ к нему на серверах провайдера по сети, используя, как правило, подключение к интернету. В SaaS — готовое работающее в облаке приложение. <strong>Пример</strong>: amoCRM, Bitrix24, МойСклад, МангоТелеком и др.</li>
</ul>
</li>
</ul>


<p></p>
<p><a class="a2a_button_telegram" href="https://www.addtoany.com/add_to/telegram?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Foverview-python-programming-language-modules-library-principles%2F&amp;linkname=%D0%AF%D0%B7%D1%8B%D0%BA%20%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F%20Python%203.%20%D0%9E%D0%B1%D0%B7%D0%BE%D1%80%20%D0%B1%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D1%82%D0%B5%D0%BA%20%D0%BF%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF%D0%BE%D0%B2%20modules" title="Telegram" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_whatsapp" href="https://www.addtoany.com/add_to/whatsapp?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Foverview-python-programming-language-modules-library-principles%2F&amp;linkname=%D0%AF%D0%B7%D1%8B%D0%BA%20%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F%20Python%203.%20%D0%9E%D0%B1%D0%B7%D0%BE%D1%80%20%D0%B1%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D1%82%D0%B5%D0%BA%20%D0%BF%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF%D0%BE%D0%B2%20modules" title="WhatsApp" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Foverview-python-programming-language-modules-library-principles%2F&amp;linkname=%D0%AF%D0%B7%D1%8B%D0%BA%20%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F%20Python%203.%20%D0%9E%D0%B1%D0%B7%D0%BE%D1%80%20%D0%B1%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D1%82%D0%B5%D0%BA%20%D0%BF%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF%D0%BE%D0%B2%20modules" title="Facebook" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_linkedin" href="https://www.addtoany.com/add_to/linkedin?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Foverview-python-programming-language-modules-library-principles%2F&amp;linkname=%D0%AF%D0%B7%D1%8B%D0%BA%20%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F%20Python%203.%20%D0%9E%D0%B1%D0%B7%D0%BE%D1%80%20%D0%B1%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D1%82%D0%B5%D0%BA%20%D0%BF%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF%D0%BE%D0%B2%20modules" title="LinkedIn" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_vk" href="https://www.addtoany.com/add_to/vk?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Foverview-python-programming-language-modules-library-principles%2F&amp;linkname=%D0%AF%D0%B7%D1%8B%D0%BA%20%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F%20Python%203.%20%D0%9E%D0%B1%D0%B7%D0%BE%D1%80%20%D0%B1%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D1%82%D0%B5%D0%BA%20%D0%BF%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF%D0%BE%D0%B2%20modules" title="VK" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_twitter" href="https://www.addtoany.com/add_to/twitter?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Foverview-python-programming-language-modules-library-principles%2F&amp;linkname=%D0%AF%D0%B7%D1%8B%D0%BA%20%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F%20Python%203.%20%D0%9E%D0%B1%D0%B7%D0%BE%D1%80%20%D0%B1%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D1%82%D0%B5%D0%BA%20%D0%BF%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF%D0%BE%D0%B2%20modules" title="Twitter" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_email" href="https://www.addtoany.com/add_to/email?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Foverview-python-programming-language-modules-library-principles%2F&amp;linkname=%D0%AF%D0%B7%D1%8B%D0%BA%20%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F%20Python%203.%20%D0%9E%D0%B1%D0%B7%D0%BE%D1%80%20%D0%B1%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D1%82%D0%B5%D0%BA%20%D0%BF%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF%D0%BE%D0%B2%20modules" title="Email" rel="nofollow noopener" target="_blank"></a><a class="a2a_dd addtoany_share_save addtoany_share" href="https://www.addtoany.com/share#url=https%3A%2F%2Fpython.ivan-shamaev.ru%2Foverview-python-programming-language-modules-library-principles%2F&#038;title=%D0%AF%D0%B7%D1%8B%D0%BA%20%D0%BF%D1%80%D0%BE%D0%B3%D1%80%D0%B0%D0%BC%D0%BC%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F%20Python%203.%20%D0%9E%D0%B1%D0%B7%D0%BE%D1%80%20%D0%B1%D0%B8%D0%B1%D0%BB%D0%B8%D0%BE%D1%82%D0%B5%D0%BA%20%D0%BF%D1%80%D0%B8%D0%BD%D1%86%D0%B8%D0%BF%D0%BE%D0%B2%20modules" data-a2a-url="https://python.ivan-shamaev.ru/overview-python-programming-language-modules-library-principles/" data-a2a-title="Язык программирования Python 3. Обзор библиотек принципов modules"></a></p><p>Сообщение <a href="https://python.ivan-shamaev.ru/overview-python-programming-language-modules-library-principles/">Язык программирования Python 3. Обзор библиотек принципов modules</a> появились сначала на <a href="https://python.ivan-shamaev.ru">Python 3 | Data Science | Нейронные сети | AI - Искусственный Интеллект</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://python.ivan-shamaev.ru/overview-python-programming-language-modules-library-principles/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>51 Python Interview вопрос/ответ на собеседовании для Data Scientist</title>
		<link>https://python.ivan-shamaev.ru/python-job-interview-question-and-answer-for-data-scientist/</link>
					<comments>https://python.ivan-shamaev.ru/python-job-interview-question-and-answer-for-data-scientist/#respond</comments>
		
		<dc:creator><![CDATA[Шамаев Иван]]></dc:creator>
		<pubDate>Mon, 20 Apr 2020 21:11:24 +0000</pubDate>
				<category><![CDATA[Data Science. Data Analytics]]></category>
		<category><![CDATA[Введение в Python 3]]></category>
		<category><![CDATA[data scientist]]></category>
		<category><![CDATA[data scientist python]]></category>
		<category><![CDATA[Data Scientist Python Interview]]></category>
		<category><![CDATA[Python Interview]]></category>
		<category><![CDATA[вопрос/ответ data scientics]]></category>
		<category><![CDATA[вопрос/ответ на собеседовании]]></category>
		<category><![CDATA[вопросы и ответы на собеседовании Python]]></category>
		<category><![CDATA[Какие вопросы на собеседовании по Python]]></category>
		<category><![CDATA[Собеседование Python]]></category>
		<guid isPermaLink="false">https://python.ivan-shamaev.ru/?p=994</guid>

					<description><![CDATA[<p>Вопросы по Python для исследователей данных и разработчиков программного обеспечения 1. В чем разница между списком и кортежем? Этот вопрос звучит очень часто на каждом интервью по Python / Data Science. Обязательно запомните правильный ответ. Списки изменчивы. Они могут быть изменены после создания. Кортежи неизменны. Как только кортеж создан, он не может быть изменен. Списки имеют [&#8230;]</p>
<p>Сообщение <a href="https://python.ivan-shamaev.ru/python-job-interview-question-and-answer-for-data-scientist/">51 Python Interview вопрос/ответ на собеседовании для Data Scientist</a> появились сначала на <a href="https://python.ivan-shamaev.ru">Python 3 | Data Science | Нейронные сети | AI - Искусственный Интеллект</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><a class="a2a_button_telegram" href="https://www.addtoany.com/add_to/telegram?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpython-job-interview-question-and-answer-for-data-scientist%2F&amp;linkname=51%20Python%20Interview%20%D0%B2%D0%BE%D0%BF%D1%80%D0%BE%D1%81%2F%D0%BE%D1%82%D0%B2%D0%B5%D1%82%20%D0%BD%D0%B0%20%D1%81%D0%BE%D0%B1%D0%B5%D1%81%D0%B5%D0%B4%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B8%20%D0%B4%D0%BB%D1%8F%20Data%20Scientist" title="Telegram" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_whatsapp" href="https://www.addtoany.com/add_to/whatsapp?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpython-job-interview-question-and-answer-for-data-scientist%2F&amp;linkname=51%20Python%20Interview%20%D0%B2%D0%BE%D0%BF%D1%80%D0%BE%D1%81%2F%D0%BE%D1%82%D0%B2%D0%B5%D1%82%20%D0%BD%D0%B0%20%D1%81%D0%BE%D0%B1%D0%B5%D1%81%D0%B5%D0%B4%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B8%20%D0%B4%D0%BB%D1%8F%20Data%20Scientist" title="WhatsApp" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpython-job-interview-question-and-answer-for-data-scientist%2F&amp;linkname=51%20Python%20Interview%20%D0%B2%D0%BE%D0%BF%D1%80%D0%BE%D1%81%2F%D0%BE%D1%82%D0%B2%D0%B5%D1%82%20%D0%BD%D0%B0%20%D1%81%D0%BE%D0%B1%D0%B5%D1%81%D0%B5%D0%B4%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B8%20%D0%B4%D0%BB%D1%8F%20Data%20Scientist" title="Facebook" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_linkedin" href="https://www.addtoany.com/add_to/linkedin?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpython-job-interview-question-and-answer-for-data-scientist%2F&amp;linkname=51%20Python%20Interview%20%D0%B2%D0%BE%D0%BF%D1%80%D0%BE%D1%81%2F%D0%BE%D1%82%D0%B2%D0%B5%D1%82%20%D0%BD%D0%B0%20%D1%81%D0%BE%D0%B1%D0%B5%D1%81%D0%B5%D0%B4%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B8%20%D0%B4%D0%BB%D1%8F%20Data%20Scientist" title="LinkedIn" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_vk" href="https://www.addtoany.com/add_to/vk?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpython-job-interview-question-and-answer-for-data-scientist%2F&amp;linkname=51%20Python%20Interview%20%D0%B2%D0%BE%D0%BF%D1%80%D0%BE%D1%81%2F%D0%BE%D1%82%D0%B2%D0%B5%D1%82%20%D0%BD%D0%B0%20%D1%81%D0%BE%D0%B1%D0%B5%D1%81%D0%B5%D0%B4%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B8%20%D0%B4%D0%BB%D1%8F%20Data%20Scientist" title="VK" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_twitter" href="https://www.addtoany.com/add_to/twitter?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpython-job-interview-question-and-answer-for-data-scientist%2F&amp;linkname=51%20Python%20Interview%20%D0%B2%D0%BE%D0%BF%D1%80%D0%BE%D1%81%2F%D0%BE%D1%82%D0%B2%D0%B5%D1%82%20%D0%BD%D0%B0%20%D1%81%D0%BE%D0%B1%D0%B5%D1%81%D0%B5%D0%B4%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B8%20%D0%B4%D0%BB%D1%8F%20Data%20Scientist" title="Twitter" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_email" href="https://www.addtoany.com/add_to/email?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpython-job-interview-question-and-answer-for-data-scientist%2F&amp;linkname=51%20Python%20Interview%20%D0%B2%D0%BE%D0%BF%D1%80%D0%BE%D1%81%2F%D0%BE%D1%82%D0%B2%D0%B5%D1%82%20%D0%BD%D0%B0%20%D1%81%D0%BE%D0%B1%D0%B5%D1%81%D0%B5%D0%B4%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B8%20%D0%B4%D0%BB%D1%8F%20Data%20Scientist" title="Email" rel="nofollow noopener" target="_blank"></a><a class="a2a_dd addtoany_share_save addtoany_share" href="https://www.addtoany.com/share#url=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpython-job-interview-question-and-answer-for-data-scientist%2F&#038;title=51%20Python%20Interview%20%D0%B2%D0%BE%D0%BF%D1%80%D0%BE%D1%81%2F%D0%BE%D1%82%D0%B2%D0%B5%D1%82%20%D0%BD%D0%B0%20%D1%81%D0%BE%D0%B1%D0%B5%D1%81%D0%B5%D0%B4%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B8%20%D0%B4%D0%BB%D1%8F%20Data%20Scientist" data-a2a-url="https://python.ivan-shamaev.ru/python-job-interview-question-and-answer-for-data-scientist/" data-a2a-title="51 Python Interview вопрос/ответ на собеседовании для Data Scientist"></a></p><blockquote>
<p class="aq cl em ex eo ey eq ez es fa eu fb av">Вопросы по Python для исследователей данных и разработчиков программного обеспечения</p>
</blockquote>
<h2 id="dc1e" class="jk jl dt ar aq jm jn jo jp jq jr js jt ju jv jw jx" data-selectable-paragraph=""><span>1. В чем разница между списком и кортежем?</span></h2>
<p id="3262" class="ip iq dt ar ir b em jy eo jz iu ka iw kb iy kc ja dl" data-selectable-paragraph=""><span>Этот вопрос звучит очень часто на каждом интервью по Python / Data Science. Обязательно запомните правильный ответ.</span></p>
<ul class="">
<li id="1933" class="ip iq dt ar ir b em is eo it iu iv iw ix iy iz ja kd ke kf" data-selectable-paragraph=""><span>Списки изменчивы. Они могут быть изменены после создания.</span></li>
<li id="38ea" class="ip iq dt ar ir b em kg eo kh iu ki iw kj iy kk ja kd ke kf" data-selectable-paragraph=""><span>Кортежи неизменны. Как только кортеж создан, он не может быть изменен.</span></li>
<li id="9a85" class="ip iq dt ar ir b em kg eo kh iu ki iw kj iy kk ja kd ke kf" data-selectable-paragraph=""><span>Списки имеют порядок. Они представляют собой упорядоченную последовательность объектов одного типа. Т.е.: все имена пользователей упорядочены по дате создания,</span><code class="ia kl km kn ko b">["Seth", "Ema", "Eli"]</code></li>
<li id="4f79" class="ip iq dt ar ir b em kg eo kh iu ki iw kj iy kk ja kd ke kf" data-selectable-paragraph=""><span>Кортежи имеют структуру. Различные типы данных могут существовать в каждом индексе. Т.е.: запись базы данных в памяти </span><code class="ia kl km kn ko b">(2, "Ema", "2020–04–16") # id, name, created_at</code></li>
</ul>
<h2 id="3fd6" class="jk jl dt ar aq jm jn jo jp jq jr js jt ju jv jw jx" data-selectable-paragraph=""><span>2. Как выполняется интерполяция строк (string interpolation)?</span></h2>
<p id="8a6f" class="ip iq dt ar ir b em jy eo jz iu ka iw kb iy kc ja dl" data-selectable-paragraph=""><span>Без импорта </span><code class="ia kl km kn ko b">Template</code> <span>класса есть 3 способа интерполировать строки.</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">name = 'Chris'

# 1. f strings
print(f'Hello {name}')

# 2. % operator
print('Hey %s %s' % (name, name))

# 3. format
print(
 "My name is {}".format((name))
)</pre>
<h2>3. В чем разница между &#171;is&#187; и &#171;==&#187;?</h2>
<p id="2ab0" class="ip iq dt ar ir b em jy eo jz iu ka iw kb iy kc ja dl" data-selectable-paragraph=""><span>Запись </span><code class="ia kl km kn ko b">is</code> <span>проверяет идентичность, а запись </span><code class="ia kl km kn ko b">==</code> <span>проверяет равенство.</span></p>
<p id="4ae3" class="ip iq dt ar ir b em is eo it iu iv iw ix iy iz ja dl" data-selectable-paragraph=""><span>Рассмотрим пример. Создайте несколько списков и присвойте им имена. Обратите внимание, что </span><code class="ia kl km kn ko b">b</code> <span>указывает на тот же объект, что и </span><code class="ia kl km kn ko b">a</code> <span>ниже.</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">a = [1,2,3] 
b = a 
c = [1,2,3]</pre>
<p>Проверьте равенство и отметьте, что все они равны.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">print (a == b) 
print (a == c) 
# =&gt; True 
# =&gt; True</pre>
<p>Но они имеют одинаковую идентичность? Нет.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">print (a is b) 
print (a is c) 
# =&gt; True 
# =&gt; False</pre>
<p><span>Мы можем проверить это, напечатав их идентификаторы объектов.</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">print(id(a))
print(id(b))
print(id(c))
#=&gt; 4369567560
#=&gt; 4369567560
#=&gt; 4369567624</pre>
<p><code class="ia kl km kn ko b">c</code><span> has a different </span><code class="ia kl km kn ko b">id</code><span> than </span><code class="ia kl km kn ko b">a</code><span> and </span><code class="ia kl km kn ko b">b</code><span>.</span></p>
<h2 class="jk jl dt ar aq jm jn jo jp jq jr js jt ju jv jw jx" data-selectable-paragraph=""><span>4. Что такое декоратор (</span>decorator)<span>?</span></h2>
<p id="cf6c" class="ip iq dt ar ir b em is eo it iu iv iw ix iy iz ja dl" data-selectable-paragraph=""><span>Декоратор позволяет добавить функциональность к существующей функции, передав эту существующую функцию декоратору, который выполнит её и дополнительный код. Как бы это надстройка над существующей функцией.</span></p>
<p id="f6fb" class="ip iq dt ar ir b em is eo it iu iv iw ix iy iz ja dl" data-selectable-paragraph=""><span>Мы напишем декоратор, который будет писать лог при вызове другой функции.</span></p>
<p id="b774" class="ip iq dt ar ir b em is eo it iu iv iw ix iy iz ja dl" data-selectable-paragraph=""><strong class="ir kz"><span>Напишите функцию декоратора. </span></strong><span>Декоратор принимает функцию </span><code class="ia kl km kn ko b">func</code><span>, в качестве аргумента. Он также определяет функцию </span><code class="ia kl km kn ko b">log_function_called</code>, <span>которая вызывает </span><code class="ia kl km kn ko b">func()</code><span>и выполняет некоторый код </span><code class="ia kl km kn ko b">print(f'{func} called.')</code><span>. Затем он возвращает функцию, которую он определил.</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">def logging(func):
  def log_function_called():
    print(f'{func} called.')
    func()
  return log_function_called</pre>
<p><span>Давайте напишем другие функции, к которым мы затем добавим декоратор:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">def my_name():
  print('chris')
def friends_name():
  print('naruto')

my_name()
friends_name()

#=&gt; chris
#=&gt; naruto</pre>
<p><span>Теперь добавим декоратор к обоим функциям.</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">@logging
def my_name():
 print('chris')
@logging
def friends_name():
 print('naruto')

my_name()
friends_name()

#=&gt; &lt;function my_name at 0x10fca5a60&gt; called.
#=&gt; chris
#=&gt; &lt;function friends_name at 0x10fca5f28&gt; called.
#=&gt; naruto</pre>
<p><span>Посмотрите, как мы можем теперь легко добавить логирование в любую функцию, которую мы пишем, просто добавив </span><code class="ia kl km kn ko b">@logging</code> <span>над ней.</span></p>
<h2>5. Объясните, как работает функция диапазона (range function)</h2>
<p id="7521" class="ip iq dt ar ir b em jy eo jz iu ka iw kb iy kc ja dl" data-selectable-paragraph=""><span>Range генерирует список целых чисел и его можно использовать тремя способами.</span></p>
<p id="7b65" class="ip iq dt ar ir b em is eo it iu iv iw ix iy iz ja dl" data-selectable-paragraph=""><span>Функция принимает от 1 до 3 аргументов. Рассмотрим три случая &#8212; запись с одним, двумя и тремя аргументами.</span></p>
<p id="129e" class="ip iq dt ar ir b em is eo it iu iv iw ix iy iz ja dl" data-selectable-paragraph=""><code class="ia kl km kn ko b"></code><strong class="ir kz">range(stop)</strong><strong class="ir kz"><span>:</span></strong><span> генерирует целые числа от 0 до целого числа «stop».</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">for i in range(10)
#=&gt; [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]</pre>
<p data-selectable-paragraph=""><code class="ia kl km kn ko b"></code><strong class="ir kz">range(start, stop)</strong><strong class="ir kz"><span>:</span></strong><span> генерирует целые числа от «start» до «stop».</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">for i in range(2,10)
#=&gt; [2, 3, 4, 5, 6, 7, 8, 9]</pre>
<p data-selectable-paragraph=""><code class="ia kl km kn ko b"></code><strong class="ir kz">range(start, stop, step)</strong><strong class="ir kz"><span>:</span></strong><span> генерирует целые числа от «start» до «stop» с интервалами «step».</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">for i in range(2,10,2)
#=&gt; [2, 4, 6, 8]</pre>
<p>Во всех случаях stop (верхняя граница) не включается в список.</p>
<h2>6. Определите класс с именем car и с 2 свойствами, &#171;color&#187; и &#171;speed&#187;. Затем создайте экземпляр и верните свойство speed</h2>
<pre class="EnlighterJSRAW" data-enlighter-language="python">class Car :
    def __init__(self, color, speed):
        self.color = color
        self.speed = speed

car = Car('red','100mph')
car.speed

#=&gt; '100mph'</pre>
<h2>7. В чем разница между методом класса, методом экземпляра и статическим методом в Python?</h2>
<p id="0069" class="ip iq dt ar ir b em jy eo jz iu ka iw kb iy kc ja dl" data-selectable-paragraph=""><strong class="ir kz"><span>Методы экземпляра:</span></strong><span> принимают параметр </span><code class="ia kl km kn ko b">self</code> <span>и относятся к конкретному экземпляру класса.</span></p>
<p id="e033" class="ip iq dt ar ir b em is eo it iu iv iw ix iy iz ja dl" data-selectable-paragraph=""><strong class="ir kz"><span>Статические методы:</span></strong><span> используйте декоратор </span><code class="ia kl km kn ko b">@staticmethod</code> для методов<span>, которые не связаны с конкретными экземплярами и являются автономными (не изменяют свойств класса или экземпляра).</span></p>
<p id="87bb" class="ip iq dt ar ir b em is eo it iu iv iw ix iy iz ja dl" data-selectable-paragraph=""><strong class="ir kz"><span>Методы класса:</span></strong><span> принимают параметр </span><code class="ia kl km kn ko b">cls</code> <span>и могут изменять сам класс.</span></p>
<p id="b789" class="ip iq dt ar ir b em is eo it iu iv iw ix iy iz ja dl" data-selectable-paragraph=""><span>Проиллюстрируем разницу вокруг вымышленного </span><code class="ia kl km kn ko b">CoffeeShop</code> <span>класса.</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">class CoffeeShop:
    specialty = 'espresso'
    
    def __init__(self, coffee_price):
        self.coffee_price = coffee_price
    
    # instance method
    def make_coffee(self):
        print(f'Making {self.specialty} for ${self.coffee_price}')
    
    # static method    
    @staticmethod
    def check_weather():
        print('Its sunny')

    # class method
    @classmethod
    def change_specialty(cls, specialty):
        cls.specialty = specialty
        print(f'Specialty changed to {specialty}')</pre>
<p id="266f" class="ip iq dt ar ir b em is eo it iu iv iw ix iy iz ja dl" data-selectable-paragraph=""><code class="ia kl km kn ko b">CoffeeShop</code> <span>У класса есть свойство </span><code class="ia kl km kn ko b">specialty</code><span>, установленное значение по умолчанию </span><code class="ia kl km kn ko b">'espresso'</code><span>. Каждый экземпляр </span><code class="ia kl km kn ko b">CoffeeShop</code> <span>инициализируется со свойством </span><code class="ia kl km kn ko b">coffee_price</code><span>. Он также имеет 3 метода: метод экземпляра, статический метод и метод класса.</span></p>
<p id="2815" class="ip iq dt ar ir b em is eo it iu iv iw ix iy iz ja dl" data-selectable-paragraph=""><span>Давайте инициализируем экземпляр кофейни с </span><code class="ia kl km kn ko b">coffee_price</code> <span>= </span><code class="ia kl km kn ko b">5</code><span>. Затем вызовем метод экземпляра </span><code class="ia kl km kn ko b">make_coffee</code><span>.</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">coffee_shop = CoffeeShop('5')
coffee_shop.make_coffee()
#=&gt; Making espresso for $5</pre>
<p><span>Теперь вызовем статический метод. Статические методы не могут изменять класс или состояние экземпляра, поэтому они обычно используются для служебных функций. Мы используем наш ститический метод, чтобы проверить погоду. </span><code class="ia kl km kn ko b">Its sunny</code><span>.</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">coffee_shop.check_weather()
#=&gt; Its sunny</pre>
<p><span>Теперь давайте используем метод класса, чтобы изменить вид кофе, а затем вызовем метод </span><code class="ia kl km kn ko b">make_coffee</code><span>.</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">coffee_shop.change_specialty('drip coffee')
#=&gt; Specialty changed to drip coffee

coffee_shop.make_coffee()
#=&gt; Making drip coffee for $5</pre>
<p><span>Обратите внимание, как метод </span><code class="ia kl km kn ko b">make_coffee</code> <span>раньше изготавливал </span><code class="ia kl km kn ko b">espresso</code>, <span>но теперь делает </span><code class="ia kl km kn ko b">drip coffee</code><span>!</span></p>
<h2><strong>8. В чем разница между &#171;func&#187; и &#171;func()&#187;?</strong></h2>
<p>Цель этого вопроса &#8212; понять, знаете ли вы, что все функции также являются объектами в Python.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">def func():
    print('Im a function')
    
func
#=&gt; function __main__.func&gt;

func()    
#=&gt; Im a function</pre>
<p><code class="ia kl km kn ko b">func</code> <span>это объект, представляющий функцию, которую можно присвоить переменной или передать другой функции. </span><code class="ia kl km kn ko b">func()</code> <span>с круглыми скобками вызывает функцию и возвращает то, что находится в return.</span></p>
<h2>9. Объясните, как работает функция map()</h2>
<p><code class="ia kl km kn ko b">map</code><span> возвращает список, составленный из возвращаемых значений, от применения функции к каждому элементу в последовательности.</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">def add_three(x):
    return x + 3
li = [1,2,3]
list_data = [i for i in map(add_three, li)]
print(list_data)
# [4, 5, 6]</pre>
<h2>10. Объясните, как работает функция reduce()</h2>
<p id="4e69" class="ip iq dt ar ir b em jy eo jz iu ka iw kb iy kc ja dl" data-selectable-paragraph=""><span>Эту функцию довольно сложно сразу понять, пока вы не используете её несколько раз.</span></p>
<p id="7b73" class="ip iq dt ar ir b em is eo it iu iv iw ix iy iz ja dl" data-selectable-paragraph=""><code class="ia kl km kn ko b">reduce</code> <span>берет функцию и последовательность и перебирает эту последовательность. На каждой итерации текущий элемент и выходные данные предыдущего элемента передаются в функцию. В конце возвращается одно значение.</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">from functools import reduce

def add_three(x,y):
    return x + y

li = [1,2,3,5]

reduce(add_three, li)
#=&gt; 11</pre>
<p>Возвращается значение <code class="ia kl km kn ko b">11</code><span>, которое является суммой </span><code class="ia kl km kn ko b">1+2+3+5</code><span>.</span></p>
<h2>11. Объясните, как работает функция фильтра filter()</h2>
<p id="2a66" class="ip iq dt ar ir b em jy eo jz iu ka iw kb iy kc ja dl" data-selectable-paragraph=""><span>Функция filter() буквально делает то, о чем говорится в её названии: Фильтрует элементы в последовательности/списке.</span></p>
<p id="b800" class="ip iq dt ar ir b em is eo it iu iv iw ix iy iz ja dl" data-selectable-paragraph=""><span>Каждый элемент передается функции, которая возвращается в выведенной последовательности, если функция возвращается, </span><code class="ia kl km kn ko b">True</code> <span>и отбрасывается, если функция возвращается </span><code class="ia kl km kn ko b">False</code><span>.</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">def add_three(x):
    if x % 2 == 0:
        return True        
    else:
        return False

li = [1,2,3,4,5,6,7,8]
new_listdata = [i for i in filter(add_three, li)]
print(new_listdata)
#=&gt; [2, 4, 6, 8]</pre>
<p><span>Обратите внимание, что все элементы, не делимые на 2, были удалены.</span></p>
<h2 id="4475" class="jk jl dt ar aq jm jn jo jp jq jr js jt ju jv jw jx" data-selectable-paragraph=""><span>12. Питон вызывает по ссылке или по значению?</span></h2>
<p id="2a49" class="ip iq dt ar ir b em is eo it iu iv iw ix iy iz ja dl" data-selectable-paragraph=""><span>Неизменяемые объекты, такие как строки, числа и кортежи, вызываются по значению (т.е. в функцию передается именно значение, а не ссылка на объект). Обратите внимание, что значение </span><code class="ia kl km kn ko b">name</code> <span>не изменилось вне функции при изменении внутри. Значение </span><code class="ia kl km kn ko b">name</code> <span>было назначено новому блоку в памяти для переменной этой функции.</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">name = 'chr'
def add_chars(s):
    s += 'is'
    print(s)
    
add_chars(name)    
print(name)
#=&gt; chris
#=&gt; chr</pre>
<p><span>Изменяемые объекты, такие как список, вызываются по ссылке. Обратите внимание, как список, определенный вне функции, был изменен внутри функции. Параметр в функции указывает на оригинальный блок в памяти, в котором сохранено значение </span><code class="ia kl km kn ko b">li</code><span>.</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">li = [1,2]
def add_element(seq):
    seq.append(3)
    print(seq)
    
add_element(li)    
print(li)
#=&gt; [1, 2, 3]
#=&gt; [1, 2, 3]</pre>
<h2 id="5c35" class="jk jl dt ar aq jm jn jo jp jq jr js jt ju jv jw jx" data-selectable-paragraph=""><span>13. Как перевернуть список?</span></h2>
<p><span>Для того, чтобы перевернуть список, необходимо вызвать функцию </span><code class="ia kl km kn ko b">reverse()</code>, которая является методом списка. Функция изменяет сам список<span>.</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">li = ['a','b','c']
print(li)
li.reverse()
print(li)
#=&gt; ['a', 'b', 'c']
#=&gt; ['c', 'b', 'a']</pre>
<h2 id="578f" class="jk jl dt ar aq jm jn jo jp jq jr js jt ju jv jw jx" data-selectable-paragraph=""><span>14. Как работает умножение строк?</span></h2>
<p><span>Давайте посмотрим результаты умножения строки </span><code class="ia kl km kn ko b">'cat'</code> <span>на 3.</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">'cat' * 3
#=&gt; 'catcatcat'</pre>
<p><span>Строка соединяется сама с собой 3 раза.</span></p>
<h2 id="f94a" class="jk jl dt ar aq jm jn jo jp jq jr js jt ju jv jw jx" data-selectable-paragraph=""><span>15. Как работает умножение списков?</span></h2>
<p><span>Давайте посмотрим результат умножения списка </span><code class="ia kl km kn ko b">[1,2,3]</code> <span>на 2.</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">[1,2,3] * 2 
# =&gt; [1, 2, 3, 1, 2, 3]</pre>
<p><span>Выводится список, содержащий задвоенное содержимое [1,2,3].</span></p>
<h2 id="3991" class="jk jl dt ar aq jm jn jo jp jq jr js jt ju jv jw jx" data-selectable-paragraph=""><span>16. Что означает «self» в классе?</span></h2>
<p id="1d10" class="ip iq dt ar ir b em jy eo jz iu ka iw kb iy kc ja dl" data-selectable-paragraph=""><span>Self относится к экземпляру самого класса. Это то, как мы предоставляем методам доступ и возможность обновлять объект, которому они принадлежат.</span></p>
<p id="4ca7" class="ip iq dt ar ir b em is eo it iu iv iw ix iy iz ja dl" data-selectable-paragraph=""><span>Ниже передача self для </span><code class="ia kl km kn ko b">__init__()</code> <span>дает возможность установить </span><code class="ia kl km kn ko b">color</code> для <span>экземпляра при инициализации.</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">class Shirt:
    def __init__(self, color):
        self.color = color
        
s = Shirt('yellow')
s.color
#=&gt; 'yellow'</pre>
<h2 id="88a6" class="jk jl dt ar aq jm jn jo jp jq jr js jt ju jv jw jx" data-selectable-paragraph=""><span>17. Как объединить списки в Python?</span></h2>
<p>Сумма 2х списков объединяет их:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">a = [1,2]
b = [3,4,5]
c = a + b
print(c)
print(a + b)
#=&gt; [1, 2, 3, 4, 5]
#=&gt; [1, 2, 3, 4, 5]</pre>
<h2><strong>18. В чем разница между мелкой и глубокой копией (shallow copy vs. deep copy)?</strong></h2>
<p>Мы обсудим это в контексте изменяемого объекта &#8212; списка. Для неизменных объектов, shallow copy против deep copy не столь актуально.</p>
<p>Мы пройдемся по 3-м сценариям.</p>
<p><strong>1) Ссылка на оригинальный объект.</strong> Она указывает на новое имя, li2 указывает на то же место в памяти, на которое указывает li1. Таким образом, любое изменение, которое мы делаем в li1 также происходит в li2.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">li1 = [['a'],['b'],['c']]
li2 = li1
li1.append(['d'])
print(li2)
#=&gt; [['a'], ['b'], ['c'], ['d']]</pre>
<p><strong>2) Создать shallow copy оригинала.</strong> Мы можем сделать это с помощью list() конструктора или более питонического mylist.copy().<br />shallow copy создает новый объект, но заполняет его ссылками на оригинал. Таким образом, добавление нового объекта в исходную коллекцию li3 не распространяется на li4, а изменение одного из объектов li3 будет распространяться на li4.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">li3 = [['a'],['b'],['c']]
li4 = list(li3)
li3.append([4])
print(li4)
#=&gt; [['a'], ['b'], ['c']]
li3[0][0] = ['X']
print(li4)
#=&gt; [[['X']], ['b'], ['c']]</pre>
<p><strong>3) Создать deep copy.</strong> Это сделано с copy.deepcopy(). 2 объекта теперь полностью независимы, и изменения одного из них не влияют на другой список.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">import copy
li5 = [['a'],['b'],['c']]
li6 = copy.deepcopy(li5)
li5.append([4])
li5[0][0] = ['X']
print(li6)
#=&gt; [['a'], ['b'], ['c']]</pre>
<h2><strong>19. В чем разница между списками и массивами?</strong></h2>
<blockquote>
<p><strong>Примечание:</strong> стандартная библиотека Python имеет объект массива, но здесь я специально ссылаюсь на обычно используемый массив Numpy.</p>
</blockquote>
<ul>
<li>Списки существуют в стандартной библиотеке Python. Массивы определены Numpy.</li>
<li>Списки могут быть заполнены различными типами данных в каждом индексе. Массивы требуют однородных элементов.</li>
<li>Арифметика в списках добавляет или удаляет элементы из списка. Арифметика на массивах &#8212; это функция линейной алгебры.</li>
<li>Массивы также используют меньше памяти и обладают значительно большей функциональностью.</li>
</ul>
<h2><strong>20. Как объединить два массива Numpy?</strong></h2>
<p>Помните, массивы &#8212; это не списки. Массивы из Numpy нельзя сложить как списки, т.к. арифметические функции переходят в разряд линейной алгебры (сложение матриц).<br />Для объединения массивов нам нужно использовать функцию сцепления Numpy.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">import numpy as np

a = np.array([1,2,3])
b = np.array([4,5,6])

np.concatenate((a,b))

#=&gt; array([1, 2, 3, 4, 5, 6])</pre>
<h2><strong>21. Назовите изменяемые и неизменяемые объекты в Python</strong></h2>
<p><strong>Неизменяемые объекты</strong> &#8212; означает, что состояние не может быть изменено после создания. Примеры: <strong>int, float, bool, string и tuple</strong>.<br /><strong></strong></p>
<p><strong>Изменяемый объект</strong> &#8212; означает, что состояние может быть изменено после создания. Примерами являются <strong>list, dict и set</strong>.</p>
<h2><strong>22. Как округлить число до 3 десятичных знаков в Python?</strong></h2>
<p>Используйте функцию <strong>round(value, decimal_places)</strong>.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">a = 5.12345
round(a,3)
#=&gt; 5.123</pre>
<h2><strong>23. Как вывести кусок списка &#8212; slice a list?</strong></h2>
<p>Синтаксис <strong>slice</strong> следующий, необходимо <strong>list</strong> передать 3 аргумента, <strong>list[start:stop:step]</strong>, где <strong>step</strong> (шаг) &#8212; это интервал, через который возвращаются элементы.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">a = [0,1,2,3,4,5,6,7,8,9]
print(a[:2])
#=&gt; [0, 1]

print(a[8:])
#=&gt; [8, 9]

print(a[2:8])
#=&gt; [2, 3, 4, 5, 6, 7]

print(a[2:8:2])
#=&gt; [2, 4, 6]</pre>
<h2><strong>24. Что такое pickling (маринование)?</strong></h2>
<p><strong>Pickling</strong> &#8212; это метод сериализации и десериализации объектов в Python.</p>
<p>В приведенном ниже примере мы сериализуем и десериализуем список словарей.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">import pickle
obj = [
    {'id':1, 'name':'Stuffy'},
    {'id':2, 'name': 'Fluffy'}
]
with open('file.p', 'wb') as f:
    pickle.dump(obj, f)
with open('file.p', 'rb') as f:
    loaded_obj = pickle.load(f)
print(loaded_obj)
#=&gt; [{'id': 1, 'name': 'Stuffy'}, {'id': 2, 'name': 'Fluffy'}]</pre>
<h2><strong>25. В чем разница между словарями (dictionaries) и JSON?</strong></h2>
<p><strong>Dictionary</strong> &#8212; это тип данных Python, набор проиндексированных, но неупорядоченных ключей и значений.</p>
<p><strong>JSON</strong> &#8212; это просто строка, которая следует заданному формату и предназначена для передачи данных.</p>
<h2><strong>26. Какие ORM вы использовали в Python?</strong></h2>
<p><strong>ORM (объектно-реляционное отображение или object relational mapping)</strong> отображают модели данных (обычно в приложении) в таблицы базы данных и упрощают транзакции базы данных.</p>
<p><strong>SQLAlchemy</strong> обычно используется для фреймворка Flask, а Django имеет собственный ORM.</p>
<h2><strong>27. Как работает any() и all()?</strong></h2>
<p><strong>Any()</strong> принимает последовательность и возвращает true, если какой-либо элемент в последовательности равен true.<br /><strong>All()</strong> возвращает истину, только если все элементы в последовательности истинны.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">a = [False, False, False]
b = [True, False, False]
c = [True, True, True]

print( any(a) )
print( any(b) )
print( any(c) )
#=&gt; False
#=&gt; True
#=&gt; True

print( all(a) )
print( all(b) )
print( all(c) )
#=&gt; False
#=&gt; False
#=&gt; True</pre>
<h2><strong>28. Что быстрее для поиска элемента &#8212; словарь или список в Python?</strong></h2>
<p>Поиск значения в списке занимает <strong>O(n)</strong> времени, потому что весь список необходимо перебирать до тех пор, пока значение не будет найдено.</p>
<p>Поиск ключа в словаре занимает <strong>O(1)</strong> времени, потому что это хеш-таблица.</p>
<p>Это может иметь огромное значение во времени, если значений много, поэтому словари обычно рекомендуются для скорости. Но у них есть и другие ограничения, такие как необходимость в уникальных ключах.</p>
<h2><strong>29. В чем разница между модулем и пакетом?</strong></h2>
<p><strong>Модуль</strong> &#8212; это файл (или набор файлов), который можно импортировать вместе.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">import sklearn</pre>
<p><strong>Пакет</strong> &#8212; это каталог модулей.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">from sklearn import cross_validation</pre>
<p>Таким образом, пакеты являются модулями, но не все модули являются пакетами.</p>
<h2><strong>30. Как увеличить и уменьшить целое число в Python?</strong></h2>
<p>Увеличение и уменьшение может быть сделано с<strong> +=</strong> и <strong>-=.</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">value = 5

value += 1
print(value)
#=&gt; 6

value -= 1
value -= 1
print(value)
#=&gt; 4</pre>
<h2><strong>31. Как преобразовать целое число в двоичное?</strong></h2>
<p>Используйте <strong>bin()</strong> функцию.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">bin(5)
#=&gt; '0b101'</pre>
<h2><strong>32. Как удалить дубликаты элементов из списка?</strong></h2>
<p>Удалить дубликаты элементов из списка можно сделать путем преобразования списка в набор, а затем обратно в список.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">a = [1,1,1,2,3]
a = list(set(a))
print(a)

#=&gt; [1, 2, 3]</pre>
<p>Обратите внимание, что наборы не обязательно будут сохранять порядок списка.</p>
<h2><strong>33. Как проверить, существует ли значение в списке?</strong></h2>
<p>Использование <strong>in</strong>.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">'a' in ['a','b','c']
#=&gt; True

'a' in [1,2,3]
#=&gt; False</pre>
<h2><strong>34. В чем разница между дополнением и расширением?</strong></h2>
<p><strong>append</strong> добавляет значение в список, а <strong>extend</strong> добавляет в список значения из другого списка.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">a = [1,2,3]
b = [1,2,3]
a.append(6)
print(a)
#=&gt; [1, 2, 3, 6]

b.extend([4,5])
print(b)
#=&gt; [1, 2, 3, 4, 5]</pre>
<h2><strong>35. Как получить абсолютное значение (модуль) целого числа?</strong></h2>
<p>Это можно сделать с помощью abs() функции.<span class="jm jn ds as kq b fu kt ku r kv" data-selectable-paragraph=""></span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">abs(2)
#=&gt; 2

abs(-2)
#=&gt; 2</pre>
<h2><strong>36. Как объединить два списка (2 lists) в список кортежей (list of tuples)?</strong></h2>
<p>Вы можете использовать zip() функцию для объединения списков в список кортежей. Функция zip() не ограничена для объединения только 2 списков. zip() также можно вызвать с 3 или большим числом списков.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">a = ['a','b','c']
b = [1,2,3]
[(k,v) for k,v in zip(a,b)]
#=&gt; [('a', 1), ('b', 2), ('c', 3)]</pre>
<h2><strong>37. Как отсортировать словарь по ключу в алфавитном порядке?</strong></h2>
<p>Вы не можете &#171;отсортировать&#187; словарь, потому что словари не имеют порядка, но вы можете вернуть отсортированный список кортежей, в котором есть ключи и значения, которые есть в словаре.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">d = {'c':3, 'd':4, 'b':2, 'a':1}
sorted(d.items())
#=&gt; [('a', 1), ('b', 2), ('c', 3), ('d', 4)]</pre>
<h2><strong>38. Как класс наследуется от другого класса в Python?</strong></h2>
<p>В приведенном ниже примере Audi наследуется от Car. И с этим наследованием приходят методы экземпляра родительского класса (т.е. из класса Car в класс Audi).</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">class Car():
    def drive(self):
        print('vroom')

class Audi(Car):
    pass

audi = Audi()
audi.drive()</pre>
<h2><strong>39. Как можно удалить все пробелы из строки?</strong></h2>
<p>Применяем функцию replace</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">s = 'A string with     white space'
s.replace(' ', '')
#=&gt; 'Astringwithwhitespace'</pre>
<h2><strong>40. Почему следует использовать enumerate() для выполнения итерации последовательности?</strong></h2>
<p>Функция enumerate() позволяет отслеживать индекс при итерации по последовательности. Это более pythonic, чем определение и увеличение целого числа, представляющего индекс.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">li = ['a','b','c','d','e']

for idx,val in enumerate(li):
    print(idx, val)

#=&gt; 0 a
#=&gt; 1 b
#=&gt; 2 c
#=&gt; 3 d
#=&gt; 4 e</pre>
<h2><strong>41. В чем разница между pass, continue и break?</strong></h2>
<p><span style="color: #ff6600;"><strong>pass</strong></span> &#8212; значит ничего не делать. Обычно его используют, потому что Python не позволяет создавать класс, функцию или оператор if без кода внутри.<br />В приведенном ниже примере будет выдана ошибка без кода внутри <strong>i &gt; 3</strong>, поэтому следует использовать <strong>pass</strong>.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">a = [1,2,3,4,5]
for i in a:
    if i &gt; 3:
        pass
    print(i)
#=&gt; 1
#=&gt; 2
#=&gt; 3
#=&gt; 4
#=&gt; 5</pre>
<p><span style="color: #ff6600;"><strong>continue</strong></span> &#8212; переводит цикл на следующий элемент и останавливает выполнение цикла для текущего элемента. Так <strong>print(i)</strong> никогда не выполнится для значений, где <strong>i &lt; 3</strong>.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">for i in a:
    if i &lt; 3:
        continue
    print(i)
#=&gt; 3
#=&gt; 4
#=&gt; 5</pre>
<p><span style="color: #ff6600;"><strong>break</strong> </span>&#8212; прекращает цикл и последовательность больше не повторяется. Таким образом, элементы <strong>i со значения 3</strong> не выводятся.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">for i in a:
    if i == 3:
        break
    print(i)    
#=&gt; 1
#=&gt; 2</pre>
<h2><strong>42. Как перевести цикл (loop) в запись одной строки для списка (list)?</strong></h2>
<p>Рассмотрим цикл <strong>for (for loop)</strong> &#8212; Как было до</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">a = [1,2,3,4,5]
 
a2 = []
for i in a:
     a2.append(i + 1)
print(a2)
#=&gt; [2, 3, 4, 5, 6]</pre>
<p>Как можно преобразовать &#8212; Как стало после</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">a3 = [i+1 for i in a]
print(a3)
#=&gt; [2, 3, 4, 5, 6]</pre>
<p>Понимание списка обычно считается более pythonic, когда оно все еще читаемо.</p>
<h2><strong>43. Приведите пример троичного оператора (ternary operator)</strong></h2>
<p>Тернарный оператор (ternary operator) &#8212; это однострочный оператор if / else.<br />Синтаксис выглядит так <span style="color: #ff6600;"><strong>&#8216;a if condition else b&#8217;</strong></span>.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">x = 5
y = 10

'greater' if x &gt; 6 else 'less'
#=&gt; 'less'

'greater' if y &gt; 6 else 'less'
#=&gt; 'greater'</pre>
<pre class="hk hl hm hn ho kr ks ca"><span id="a45b" class="jm jn ds as kq b fu kt ku r kv" data-selectable-paragraph=""></span></pre>
<h2><strong>44. ​​Как проверить, что строка содержит только цифры?</strong></h2>
<p>Для этих целей Вы можете использовать функцию isnumeric()</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">'123a'.isnumeric()
#=&gt; False

'123'.isnumeric()
#=&gt; True</pre>
<h2><strong>45. Как проверить, что строка содержит только буквы</strong></h2>
<p>Для этих целей Вы можете использовать функцию isalpha().</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">'123a'.isalpha()
#=&gt; False

'a'.isalpha()
#=&gt; True</pre>
<h2><strong>46. Как проверить, что строка содержит только цифры и буквы</strong></h2>
<p>Для этих целей Вы можете использовать функцию isalnum().</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">'123abc...'.isalnum()
#=&gt; False

'123abc'.isalnum()
#=&gt; True</pre>
<h2><strong>47. Как вернуть список ключей из словаря</strong></h2>
<p>Это может быть сделано путем передачи словарю питона list() конструктора list()</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">d = {'id':7, 'name':'Shiba', 'color':'brown', 'speed':'very slow'}

list(d)
#=&gt; ['id', 'name', 'color', 'speed']</pre>
<h2><strong>48. Как строку преобразовать в верхний и нижний регистр?</strong></h2>
<p>Вы можете использовать строковые методы upper() и lower() для преобразования регистра</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">small_word = 'potatocake'
big_word = 'FISHCAKE'

small_word.upper()
#=&gt; 'POTATOCAKE'

big_word.lower()
#=&gt; 'fishcake'</pre>
<h2><strong>49. В чем разница между remove, del и pop?</strong></h2>
<p>remove() удаляет первое совпадающее значение</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">li = ['a','b','c','d']
li.remove('b')
li
#=&gt; ['a', 'c', 'd']</pre>
<p>del() удаляет элемент по индексу</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">li = ['a','b','c','d']
del li[0]
li
#=&gt; ['b', 'c', 'd']</pre>
<p>pop() удаляет элемент по индексу и возвращает этот элемент.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">li = ['a','b','c','d']
li.pop(2)
#=&gt; 'c'
li
#=&gt; ['a', 'b', 'd']</pre>
<h2><strong>50. Приведите пример словарного понимания (dictionary comprehension)</strong></h2>
<p>Ниже мы создадим словарь с буквами алфавита в качестве ключей и индекс в алфавите в качестве значений.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python"># creating a list of letters
import string
list(string.ascii_lowercase)
alphabet = list(string.ascii_lowercase)
# list comprehension
d = {val:idx for idx,val in enumerate(alphabet)} 
d
#=&gt; {'a': 0,
#=&gt;  'b': 1,
#=&gt;  'c': 2,
#=&gt; ...
#=&gt;  'x': 23,
#=&gt;  'y': 24,
#=&gt;  'z': 25}</pre>
<h2><strong>51. Как выполняется обработка исключений в Python?</strong></h2>
<p>Python предоставляет 3 слова для обработки исключений try, except и finally.<br />Синтаксис выглядит следующим образом.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">try:
    # try to do this
except:
    # if try block fails then do this
finally:
    # always do this</pre>
<p>В следующем примере блок try завершается ошибкой, потому что мы не можем складывать целые числа со строками. В except блоке val = 10 и затем finally блок печатает complete.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">try:
    val = 1 + 'A'
except:
    val = 10
finally:
    print('complete')
    
print(val)
#=&gt; complete
#=&gt; 10</pre>


<p></p>
<p><a class="a2a_button_telegram" href="https://www.addtoany.com/add_to/telegram?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpython-job-interview-question-and-answer-for-data-scientist%2F&amp;linkname=51%20Python%20Interview%20%D0%B2%D0%BE%D0%BF%D1%80%D0%BE%D1%81%2F%D0%BE%D1%82%D0%B2%D0%B5%D1%82%20%D0%BD%D0%B0%20%D1%81%D0%BE%D0%B1%D0%B5%D1%81%D0%B5%D0%B4%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B8%20%D0%B4%D0%BB%D1%8F%20Data%20Scientist" title="Telegram" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_whatsapp" href="https://www.addtoany.com/add_to/whatsapp?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpython-job-interview-question-and-answer-for-data-scientist%2F&amp;linkname=51%20Python%20Interview%20%D0%B2%D0%BE%D0%BF%D1%80%D0%BE%D1%81%2F%D0%BE%D1%82%D0%B2%D0%B5%D1%82%20%D0%BD%D0%B0%20%D1%81%D0%BE%D0%B1%D0%B5%D1%81%D0%B5%D0%B4%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B8%20%D0%B4%D0%BB%D1%8F%20Data%20Scientist" title="WhatsApp" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpython-job-interview-question-and-answer-for-data-scientist%2F&amp;linkname=51%20Python%20Interview%20%D0%B2%D0%BE%D0%BF%D1%80%D0%BE%D1%81%2F%D0%BE%D1%82%D0%B2%D0%B5%D1%82%20%D0%BD%D0%B0%20%D1%81%D0%BE%D0%B1%D0%B5%D1%81%D0%B5%D0%B4%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B8%20%D0%B4%D0%BB%D1%8F%20Data%20Scientist" title="Facebook" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_linkedin" href="https://www.addtoany.com/add_to/linkedin?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpython-job-interview-question-and-answer-for-data-scientist%2F&amp;linkname=51%20Python%20Interview%20%D0%B2%D0%BE%D0%BF%D1%80%D0%BE%D1%81%2F%D0%BE%D1%82%D0%B2%D0%B5%D1%82%20%D0%BD%D0%B0%20%D1%81%D0%BE%D0%B1%D0%B5%D1%81%D0%B5%D0%B4%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B8%20%D0%B4%D0%BB%D1%8F%20Data%20Scientist" title="LinkedIn" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_vk" href="https://www.addtoany.com/add_to/vk?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpython-job-interview-question-and-answer-for-data-scientist%2F&amp;linkname=51%20Python%20Interview%20%D0%B2%D0%BE%D0%BF%D1%80%D0%BE%D1%81%2F%D0%BE%D1%82%D0%B2%D0%B5%D1%82%20%D0%BD%D0%B0%20%D1%81%D0%BE%D0%B1%D0%B5%D1%81%D0%B5%D0%B4%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B8%20%D0%B4%D0%BB%D1%8F%20Data%20Scientist" title="VK" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_twitter" href="https://www.addtoany.com/add_to/twitter?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpython-job-interview-question-and-answer-for-data-scientist%2F&amp;linkname=51%20Python%20Interview%20%D0%B2%D0%BE%D0%BF%D1%80%D0%BE%D1%81%2F%D0%BE%D1%82%D0%B2%D0%B5%D1%82%20%D0%BD%D0%B0%20%D1%81%D0%BE%D0%B1%D0%B5%D1%81%D0%B5%D0%B4%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B8%20%D0%B4%D0%BB%D1%8F%20Data%20Scientist" title="Twitter" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_email" href="https://www.addtoany.com/add_to/email?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpython-job-interview-question-and-answer-for-data-scientist%2F&amp;linkname=51%20Python%20Interview%20%D0%B2%D0%BE%D0%BF%D1%80%D0%BE%D1%81%2F%D0%BE%D1%82%D0%B2%D0%B5%D1%82%20%D0%BD%D0%B0%20%D1%81%D0%BE%D0%B1%D0%B5%D1%81%D0%B5%D0%B4%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B8%20%D0%B4%D0%BB%D1%8F%20Data%20Scientist" title="Email" rel="nofollow noopener" target="_blank"></a><a class="a2a_dd addtoany_share_save addtoany_share" href="https://www.addtoany.com/share#url=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpython-job-interview-question-and-answer-for-data-scientist%2F&#038;title=51%20Python%20Interview%20%D0%B2%D0%BE%D0%BF%D1%80%D0%BE%D1%81%2F%D0%BE%D1%82%D0%B2%D0%B5%D1%82%20%D0%BD%D0%B0%20%D1%81%D0%BE%D0%B1%D0%B5%D1%81%D0%B5%D0%B4%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D0%B8%20%D0%B4%D0%BB%D1%8F%20Data%20Scientist" data-a2a-url="https://python.ivan-shamaev.ru/python-job-interview-question-and-answer-for-data-scientist/" data-a2a-title="51 Python Interview вопрос/ответ на собеседовании для Data Scientist"></a></p><p>Сообщение <a href="https://python.ivan-shamaev.ru/python-job-interview-question-and-answer-for-data-scientist/">51 Python Interview вопрос/ответ на собеседовании для Data Scientist</a> появились сначала на <a href="https://python.ivan-shamaev.ru">Python 3 | Data Science | Нейронные сети | AI - Искусственный Интеллект</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://python.ivan-shamaev.ru/python-job-interview-question-and-answer-for-data-scientist/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Функции Python 3: значение, аргументы, вызов, переменные, списки</title>
		<link>https://python.ivan-shamaev.ru/python-3-functions-value-arguments-call-variables-arrays/</link>
					<comments>https://python.ivan-shamaev.ru/python-3-functions-value-arguments-call-variables-arrays/#respond</comments>
		
		<dc:creator><![CDATA[Шамаев Иван]]></dc:creator>
		<pubDate>Sun, 29 Mar 2020 12:43:40 +0000</pubDate>
				<category><![CDATA[Введение в Python 3]]></category>
		<category><![CDATA[python 3]]></category>
		<category><![CDATA[Аргументы функции]]></category>
		<category><![CDATA[Вызов функции]]></category>
		<category><![CDATA[Значение функции]]></category>
		<category><![CDATA[Использование массивов в функциях Python]]></category>
		<category><![CDATA[Как написать функцию в Python 3]]></category>
		<category><![CDATA[Переменные функции Python]]></category>
		<category><![CDATA[Функции Python 3]]></category>
		<guid isPermaLink="false">https://python.ivan-shamaev.ru/?p=795</guid>

					<description><![CDATA[<p>Функции Python 3 &#8212; Краткая шпаргалка Функции – главный и самый важный способ организации и повторного использования кода в Python. Функций не может быть слишком много. 1 функция &#8212; это блок кода, который используется для выполнения одного связанного действия. В Python есть два инструмента для создания функций: def и lambda. Сначала рассмотрим def. К lambda функции вернемся позже. Python предоставляет [&#8230;]</p>
<p>Сообщение <a href="https://python.ivan-shamaev.ru/python-3-functions-value-arguments-call-variables-arrays/">Функции Python 3: значение, аргументы, вызов, переменные, списки</a> появились сначала на <a href="https://python.ivan-shamaev.ru">Python 3 | Data Science | Нейронные сети | AI - Искусственный Интеллект</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><a class="a2a_button_telegram" href="https://www.addtoany.com/add_to/telegram?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpython-3-functions-value-arguments-call-variables-arrays%2F&amp;linkname=%D0%A4%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B8%20Python%203%3A%20%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%2C%20%D0%B0%D1%80%D0%B3%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D1%8B%2C%20%D0%B2%D1%8B%D0%B7%D0%BE%D0%B2%2C%20%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5%2C%20%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%B8" title="Telegram" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_whatsapp" href="https://www.addtoany.com/add_to/whatsapp?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpython-3-functions-value-arguments-call-variables-arrays%2F&amp;linkname=%D0%A4%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B8%20Python%203%3A%20%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%2C%20%D0%B0%D1%80%D0%B3%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D1%8B%2C%20%D0%B2%D1%8B%D0%B7%D0%BE%D0%B2%2C%20%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5%2C%20%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%B8" title="WhatsApp" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpython-3-functions-value-arguments-call-variables-arrays%2F&amp;linkname=%D0%A4%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B8%20Python%203%3A%20%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%2C%20%D0%B0%D1%80%D0%B3%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D1%8B%2C%20%D0%B2%D1%8B%D0%B7%D0%BE%D0%B2%2C%20%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5%2C%20%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%B8" title="Facebook" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_linkedin" href="https://www.addtoany.com/add_to/linkedin?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpython-3-functions-value-arguments-call-variables-arrays%2F&amp;linkname=%D0%A4%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B8%20Python%203%3A%20%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%2C%20%D0%B0%D1%80%D0%B3%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D1%8B%2C%20%D0%B2%D1%8B%D0%B7%D0%BE%D0%B2%2C%20%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5%2C%20%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%B8" title="LinkedIn" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_vk" href="https://www.addtoany.com/add_to/vk?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpython-3-functions-value-arguments-call-variables-arrays%2F&amp;linkname=%D0%A4%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B8%20Python%203%3A%20%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%2C%20%D0%B0%D1%80%D0%B3%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D1%8B%2C%20%D0%B2%D1%8B%D0%B7%D0%BE%D0%B2%2C%20%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5%2C%20%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%B8" title="VK" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_twitter" href="https://www.addtoany.com/add_to/twitter?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpython-3-functions-value-arguments-call-variables-arrays%2F&amp;linkname=%D0%A4%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B8%20Python%203%3A%20%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%2C%20%D0%B0%D1%80%D0%B3%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D1%8B%2C%20%D0%B2%D1%8B%D0%B7%D0%BE%D0%B2%2C%20%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5%2C%20%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%B8" title="Twitter" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_email" href="https://www.addtoany.com/add_to/email?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpython-3-functions-value-arguments-call-variables-arrays%2F&amp;linkname=%D0%A4%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B8%20Python%203%3A%20%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%2C%20%D0%B0%D1%80%D0%B3%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D1%8B%2C%20%D0%B2%D1%8B%D0%B7%D0%BE%D0%B2%2C%20%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5%2C%20%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%B8" title="Email" rel="nofollow noopener" target="_blank"></a><a class="a2a_dd addtoany_share_save addtoany_share" href="https://www.addtoany.com/share#url=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpython-3-functions-value-arguments-call-variables-arrays%2F&#038;title=%D0%A4%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B8%20Python%203%3A%20%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%2C%20%D0%B0%D1%80%D0%B3%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D1%8B%2C%20%D0%B2%D1%8B%D0%B7%D0%BE%D0%B2%2C%20%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5%2C%20%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%B8" data-a2a-url="https://python.ivan-shamaev.ru/python-3-functions-value-arguments-call-variables-arrays/" data-a2a-title="Функции Python 3: значение, аргументы, вызов, переменные, списки"></a></p><h1><strong>Функции Python 3 &#8212; Краткая шпаргалка</strong></h1>
<p><strong>Функции</strong> – главный и самый важный способ организации и повторного использования кода в Python. Функций не может быть слишком много. <strong>1 функция</strong> &#8212; это блок кода, который используется для выполнения одного связанного действия.</p>
<blockquote>
<p><span>В Python есть </span>два<span> инструмента для создания функций: </span><strong><em>def</em></strong><span><strong> </strong>и </span><strong><em>lambda</em></strong><span>. </span></p>
<p><span>Сначала рассмотрим <em><strong>def</strong></em>. К <em><strong>lambda</strong> </em>функции вернемся позже.</span></p>
</blockquote>
<p><strong>Python</strong> предоставляет вам множество встроенных функций, таких как print() и т.д., но вы также можете создавать свои собственные функции. Эти функции называются пользовательскими функциями.</p>
<p>Объявление функции начинается ключевым словом <strong>def</strong>, а результат возвращается в предложении <strong>return</strong>:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">def my_function(x, y, z=1.5):
    if z &gt; 1:
        return z * (x + y)
    else:
        return z / (x + y)</pre>
<p>Ничто не мешает иметь в функции несколько предложений <strong>return</strong>. Если при выполнении достигнут конец функции, а предложение <strong>return</strong> не встретилось, то возвращается <strong>None</strong>.</p>
<p>У функции могут быть позиционные и именованные аргументы.</p>
<p><strong>Именованные аргументы</strong> обычно используются для задания значений по умолчанию и необязательных аргументов.</p>
<p>В примере выше:</p>
<ul>
<li>x и y – <em><strong>позиционные аргументы, </strong></em></li>
<li>а z – <em><strong>именованный. </strong></em></li>
</ul>
<p>Следующие вызовы функции эквивалентны:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">my_function(5, 6, z=0.7)
my_function(3.14, 7, 3.5)</pre>
<p>Основное ограничение состоит в том, <strong>именованные аргументы должны находиться после всех позиционных (если таковые имеются).</strong> Сами же именованные аргументы можно задавать в любом порядке, это освобождает программиста от необходимости помнить, в каком порядке были указаны аргументы функции в объявлении, важно лишь, как они называются.</p>
<h2><strong>Определение функции Python 3</strong></h2>
<p><span>Вы можете задать функции для реализации нужной вам функциональности. Вот простые правила для определения функции в Python.</span></p>
<ul class="list">
<li><span>Ключевое слово для определения функции: </span><b><span>def,</span></b><span> за которым следуют имя функции и круглые скобки () с параметрами.</span></li>
<li><span>Любые входные параметры или аргументы должны быть помещены в эти круглые скобки.</span></li>
<li><span>В качестве первой команды может быть необязательная конструкция &#8212; <strong>строка документации функции</strong> (эта часть функции &#8212; пояснение зачем функция создана, очень рекомендуется использовать для облегчения понимания кода при работе в команде или при повторном возвращении к коду через длительный промежуток времени)</span><span>.</span></li>
<li><span>Блок кода в каждой функции начинается с двоеточия <strong>:</strong> и имеет отступ.</span></li>
<li><span>Оператор <strong>return</strong> <strong>[выражение]</strong> возвращает результат из функции. Оператор <strong>return</strong> без аргументов аналогичен <strong>return None</strong>. <span style="color: #ff6600;"><strong>Функции всегда возвращают значение, хотя бы None.</strong></span></span></li>
</ul>
<h2><strong>Синтаксис функции Python</strong></h2>
<pre class="EnlighterJSRAW" data-enlighter-language="python">def function_name( parameter1, parameter2 ):
   """function_docstring: функция Python предназначена для расчета ROI"""
   function_suite (algorithms, expressions)
   return [expression]</pre>
<p><span>По умолчанию, параметры <em><strong>parameter1, parameter2</strong></em> имеют позиционное поведение, и вам необходимо сообщить их в том же порядке, в котором они были определены.</span></p>
<h2><strong>Пример реализации функции</strong></h2>
<p>Следующая функция принимает строку в качестве входного параметра и печатает ее на стандартном экране.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">def print_me( str ):
   """Выводит на печать переданную строку в эту функцию"""
   print(str)
   return</pre>
<h2><strong>Вызов функции</strong></h2>
<p>В определении функции указывается <strong>имя функции</strong>, <strong>её параметры</strong>, а также <strong>тело функции</strong> (реализация требуемой функциональности).</p>
<p>Как только базовая структура функции создана, вы можете выполнить ее, вызвав ее из другой функции или непосредственно из <span><strong>Python prompt</strong> (командной оболочки)</span>. Ниже приведен пример вызова функции <strong>printme()</strong>:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python"># Определение функции
def printme( str ):
    """This prints a passed string into this function"""
    print(str)
    return

# Теперь вы можете вызвать функцию printme
printme("I'm first call to user defined function!")
printme("Again second call to the same function")</pre>
<p><strong>Результат:</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">I'm first call to user defined function!
Again second call to the same function</pre>
<h1><strong>Аргументы функции</strong></h1>
<p><span>Вы можете вызвать функцию, используя следующие типы аргументов:</span></p>
<ul class="list">
<li><span>Обязательные аргументы</span></li>
<li><span>Ключевые аргументы</span></li>
<li><span>Аргументы по умолчанию</span></li>
<li><span>Аргументы переменной длины</span></li>
</ul>
<h2><strong>Обязательные (позиционные) аргументы</strong></h2>
<blockquote>
<p><strong>Позиционные аргументы:</strong> указываются простым перечислением</p>
</blockquote>
<p><span><strong>Обязательные аргументы</strong> &#8212; это аргументы, переданные функции в правильном позиционном порядке. Здесь количество аргументов и их порядок в вызове функции должно точно соответствовать определению функции.</span></p>
<p><span>Чтобы вызвать функцию </span><i><span>printme()</span></i><span> , вам обязательно нужно передать один аргумент, иначе она выдаст следующую синтаксическую ошибку:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python"># Определение функции
def printme( str ):
   """This prints a passed string into this function"""
   print(str)
   return

# Теперь вы можете вызвать функцию printme
printme()</pre>
<p>Ошибка (в функции Printme не указан аргумент):</p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">Traceback (most recent call last):
  File "C:/Users/User/Desktop/CodePythonFunc.py", line 8, in &lt;module&gt;
    printme()
TypeError: printme() missing 1 required positional argument: 'str'</pre>
<p>Правильно указать аргумент так:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python"># Определение функции
def printme( str ):
   """This prints a passed string into this function"""
   print(str)
   return

# Теперь вы можете вызвать функцию printme
printme("Текстовая переменная")</pre>
<h2><strong>Ключевые аргументы</strong></h2>
<blockquote>
<p><span><strong>Ключевые аргументы:</strong> указываются перечислением </span><code class="docutils literal notranslate"><span class="pre">ключ=значение</span></code></p>
</blockquote>
<p><span>Когда вы используете ключевые аргументы в вызове функции, вызывающая сторона идентифицирует аргументы по имени параметра. Плюс в определении функции у ключевого параметра можно указать значение по-умолчанию.</span></p>
<p><span>Это позволяет пропускать аргументы или размещать их не по порядку, поскольку интерпретатор Python может использовать предоставленные ключевые слова (ключи) для сопоставления значений с параметрами. Создадим ключевые слова для функции </span><i><span>printinfo()</span></i><span> следующими способами:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python"># Определение функции
def printinfo( name, age ):
   "This prints a passed info into this function"
   print("Name: " + name + "|Age: " + str(age))
   return

# Вызов функции printinfo
printinfo( age=23, name="Anton" )
printinfo( name="Alena", age=20 )</pre>
<p><strong><span style="color: #000000;">Результат:</span></strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">Name: Anton|Age: 23
Name: Alena|Age: 20</pre>
<blockquote>
<p><span style="color: #ff0000;"><strong>Важно!</strong></span> Позиционные и ключевые аргументы могут быть скомбинированы в одной функции. Позиционные параметры всегда идут перед ключевыми.</p>
</blockquote>
<h3><strong>Преимущества ключевых аргументов в функциях</strong></h3>
<ul>
<li>Нет необходимости отслеживать порядок аргументов;</li>
<li>У ключевых параметров есть значение по умолчанию, которое можно не передавать.</li>
</ul>
<h2><strong>Аргументы по умолчанию</strong></h2>
<p><span>Аргумент по умолчанию &#8212; это аргумент, который принимает значение по умолчанию (задается в описании функции), если при вызове функции аргументу не передается значение.</span></p>
<p><span>Следующий пример дает представление об аргументах по умолчанию, он печатает возраст по умолчанию, если он не был передан:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python"># Определение функции
def printinfo( name, age = 35 ):
   "This prints a passed info into this function"
   print("Name: " + name + "|Age: " + str(age))
   return

# Вызов функции printinfo
printinfo( age=19, name="Семен" )
printinfo( name="Николай" )</pre>
<p><strong>Результат:</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">Name: Семен|Age: 19
Name: Николай|Age: 35</pre>
<h2><strong>Аргументы переменной длины </strong></h2>
<h3><strong>Передача кортежа в функцию &#8212; Использование *args в Python</strong></h3>
<p><span>Вам может потребоваться разработать функцию для большего числа аргументов, чем Вы указали при определении функции. Эти аргументы называются <strong>аргументами </strong></span><strong><i>переменной длины</i></strong><span> и не указываются в определении функции, <strong>в отличие от позиционных и ключевых аргументов.</strong></span></p>
<p><span>В Python форма с одной звездочкой </span><code>*args</code><span>может использоваться в качестве параметра для отправки в список функций аргументов переменной длины без ключа. Стоит отметить, что звёздочка ( </span><code>*</code><span>) является здесь важным элементом, так как слово </span><code>args</code><span>является общепринятой традиционной идиомой, хотя оно не поддерживается языком.</span></p>
<p><span>Синтаксис для функции с аргументами переменной длины следующий:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">def function_name([formal_args,] *args_tuple ):
    """function_docstring"""
    function_body
    return [expression]</pre>
<p><span>Звездочка (*) ставится перед именем переменной, которая содержит в себе кортеж значений без ключевых слов.</span><span> Кортеж является необязательным параметром.</span></p>
<p><strong>Рассмотрим простой пример:</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python"># Определение функции
def print_info( parametr_1, *var_tuple ):
   """Эта функция производит вывод переданных аргументов"""
   print("Output is: ")
   print(parametr_1)
   for elem in var_tuple:
      print(elem)
   return

# Вызов функции printinfo
print_info( 10 )
print_info( 70, 60, 50 )</pre>
<p><strong>Результат:</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">Output is: 
10
Output is: 
70
60
50</pre>
<p>Еще один <strong>пример использования *args в функции</strong> Python:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">def multiply(*args):
    z = 1
    for num in args:
        z *= num
    print(z)

multiply(4, 5)
multiply(10, 9)
multiply(2, 3, 4)
multiply(3, 5, 10, 6)</pre>
<p><strong>Результат:</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">20
90
24
900</pre>
<p><span>Поскольку мы использовали </span><code>*args</code><span>для отправки списка аргументов переменной длины в нашу функцию, мы смогли передать столько аргументов, сколько пожелали, в вызовы функции.</span></p>
<p><span>С помощью </span><code>*args</code><span> вы можете создать более гибкий код, который принимает различное количество аргументов без ключевых слов в вашей функции.</span></p>
<h3><strong>Передачи словаря переменной длины с аргументами в функцию **kwargs</strong></h3>
<blockquote>
<p><strong>**kwargs</strong> &#8212; сокращение от “keyword arguments”</p>
</blockquote>
<p><span>Форма двойной звездочки </span><code>**kwargs</code><span>используется для передачи словарного </span><a href="https://www.digitalocean.com/community/tutorials/understanding-dictionaries-in-python-3"><span>словаря</span></a><span> с аргументами переменной длины в функцию. Опять же, две звездочки ( </span><code>**</code><span>) являются здесь важным элементом, так как слово </span><code>kwargs</code><span>используется условно, но не поддерживается языком.</span></p>
<p><span>Мол </span><code>*args</code><span>, </span><code>**kwargs</code><span>может принять столько аргументов, которые вы хотели бы привести к этому. Однако </span><code>**kwargs</code><span>отличается от того, </span><code>*args</code><span>что вам нужно будет назначить ключевые слова.</span></p>
<p><span>Во-первых, давайте просто распечатаем </span><code>**kwargs</code><span>аргументы, которые мы передаем функции. Мы создадим короткую функцию для этого:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">def print_kwargs(**kwargs):
        print(kwargs)

print_kwargs(kwargs_1="Shark", kwargs_2=4.5, kwargs_3=True)</pre>
<p><span>Давайте запустим программу выше и посмотрим на вывод:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">{'kwargs_1': 'Shark', 'kwargs_2': 4.5, 'kwargs_3': True}</pre>
<p><span>В зависимости от версии Python 3, которую вы используете в данный момент, тип данных словаря может быть неупорядоченным. В Python 3.6 и выше вы получите пары ключ-значение по порядку, но в более ранних версиях пары будут выводиться в случайном порядке.</span></p>
<p><span>Важно отметить, что </span><code>kwargs</code><span>созданный словарь создан, и мы можем работать с ним так же, как мы можем работать с другими словарями.</span></p>
<p><span>Давайте создадим еще одну короткую программу, чтобы показать, как мы можем использовать </span><code>**kwargs</code><span>. Здесь мы создадим функцию для приветствия словаря имен. Сначала мы начнем со словаря из двух имен:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">def print_values(**kwargs):
    for key, value in kwargs.items():
        print("The value of {} is {}".format(key, value))

print_values(my_name="Sammy", your_name="Casey")</pre>
<p>Результат:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">The value of my_name is Sammy
The value of your_name is Casey</pre>
<p><span>Использование </span><code>**kwargs</code><span>дает нам гибкость в использовании ключевых аргументов в нашей программе. Когда мы используем </span><code>**kwargs</code><span>в качестве параметра, нам не нужно знать, сколько аргументов мы в конечном итоге хотели бы передать функции.</span></p>
<h3 id="using-args-and-kwargs-in-function-calls"><strong>Использование *args и **kwargs в вызовах функций</strong></h3>
<p><span>Мы также можем использовать </span><code>*args</code><span>и </span><code>**kwargs</code><span>для передачи аргументов в функции.</span></p>
<p><span>Сначала давайте рассмотрим пример с </span><code>*args</code><span>.</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">def some_args(arg_1, arg_2, arg_3):
    print("arg_1:", arg_1)
    print("arg_2:", arg_2)
    print("arg_3:", arg_3)

args = ("Sammy", "Casey", "Alex")
some_args(*args)</pre>
<p><span>В функции выше, существует три параметра , определенный как </span><code>arg_1</code><span>, </span><code>arg_</code><span>и </span><code>arg_3</code><span>. Функция распечатает каждый из этих аргументов. Затем мы создаем переменную, для которой задано итеративное значение (в данном случае </span><a href="https://www.digitalocean.com/community/tutorials/understanding-tuples-in-python-3"><span>кортеж</span></a><span> ), и можем передать эту переменную в функцию с синтаксисом звездочки.</span></p>
<p><span>Когда мы запустим код,</span><span> мы получим следующий вывод:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">arg_1: Sammy
arg_2: Casey
arg_3: Alex</pre>
<p><span>Мы также можем изменить вышеприведенную программу для </span><span>типа данных</span><span> итеративного списка с другим именем переменной. Давайте также объединим </span><code>*args</code><span>синтаксис с </span><span>именованным параметром</span><span>:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">def some_args(arg_1, arg_2, arg_3):
    print("arg_1:", arg_1)
    print("arg_2:", arg_2)
    print("arg_3:", arg_3)

my_list = [2, 3]
some_args(1, *my_list)</pre>
<p><span>Если мы запустим программу выше, она выдаст следующий вывод:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">arg_1: 1
arg_2: 2
arg_3: 3</pre>
<p><span>Аналогично, </span><code>**kwargs</code><span>аргументы с ключевым словом могут использоваться для вызова функции. Мы установим переменную, равную словарю с 3 парами ключ-значение (мы будем использовать </span><code>kwargs</code><span>здесь, но она может называться как угодно), и передадим ее функции с 3 аргументами:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">def some_kwargs(kwarg_1, kwarg_2, kwarg_3):
    print("kwarg_1:", kwarg_1)
    print("kwarg_2:", kwarg_2)
    print("kwarg_3:", kwarg_3)

kwargs = {"kwarg_1": "Val", "kwarg_2": "Harper", "kwarg_3": "Remy"}
some_kwargs(**kwargs)</pre>
<p>Результат:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">kwarg_1: Val
kwarg_2: Harper
kwarg_3: Remy</pre>
<p><span>Мы можем использовать специальный синтаксис </span><code>*args</code> <span>и </span><code>**kwargs</code> <span>внутри определения функции, чтобы передать переменное число аргументов функции.</span></p>
<p><span>Создание функций, которые принимают </span><code>*args</code><span>и </span><code>**kwargs</code><span>лучше всего использовать в ситуациях, когда вы ожидаете, что количество входов в списке аргументов останется относительно небольшим. Использование </span><code>*args</code><span>и </span><code>**kwargs</code><span>в первую очередь для обеспечения удобочитаемости и удобства, но следует делать с осторожностью.</span></p>
<h3><strong>Комбинирование параметров *args и **kwargs в функции</strong></h3>
<p>При комбинировании параметров параметр с двумя звездочками записывается самым последним. Если в определении функции указывается комбинация параметров с одной звездочкой и двумя звездочками, то функция примет любые переданные ей параметры:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">def func(*args, **kwargs):
    """Функция примет любые параметры и выведет их на печать"""
    for elem in args:                   # Перебираем список с переданными параметрами
        print(elem, end=" ")
    for key, value in kwargs.items():   # Перебираем словарь с переданными параметрами
        print("{0} =&gt; {1}".format(key, value), end=" ")
    print("") #Перенос строки

func(35, 10, a=1, b=2, c=3) # Выведет: 35 10 a =&gt; 1 c =&gt; 3 b =&gt; 2
func(10)                    # Выведет: 10
func(3, a=1, b=2)           # Выведет: a =&gt; 1 b =&gt; 2</pre>
<p><strong>Результат:</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">35 10 a =&gt; 1 b =&gt; 2 c =&gt; 3 
10 
3 a =&gt; 1 b =&gt; 2 </pre>
<p><strong>Еще один пример использования комбинации *args &amp; **kwargs:</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python"># Описываем функцию
def echo(*args, **kwargs):
    print(args, kwargs)

# Задаем список
args = (10, 20)
# Задаем словарь
kwargs = {'a':30, 'b':40}

#Вызываем функцию
echo(*args, **kwargs)</pre>
<p><strong>Результат:</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">(10, 20) {'a': 30, 'b': 40}</pre>
<h3><strong>Порядок аргументов в функции Python</strong></h3>
<p>Аргументы внутри вызова функции должны стоять в определенном порядке:</p>
<ol>
<li><strong>Позиционные аргументы (arg_1, arg_2)</strong></li>
<li><strong>*args</strong></li>
<li><strong>Ключевые аргументы (kw_1=&#187;значение 1&#8243;, kw_2=&#187;значение 2&#8243;)</strong></li>
<li><strong>**kwargs</strong></li>
</ol>
<p>Рассмотрим детальный пример с использованием всех функций:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">def function_print(arg_1, arg_2, *args, kw_1="значение 1", kw_2="значение 2", **kwargs):
    """ Обобщенный пример вывода всех аргументов, переданных функции """
    print("===Позиционные аргументы===")
    print(str(arg_1) + "," + str(arg_2))
    print("===*args===")
    for elem in args: # Перебираем список с переданными параметрами
        print(elem, end=" ")
    print("") #Перенос строки
    print("===Ключевые аргументы===")
    print(kw_1 + "," + kw_2)
    print("===**kwargs===")
    for key, value in kwargs.items(): # Перебираем словарь с переданными параметрами
        print("{0} =&gt; {1}".format(key, value), end=" ")
    print("") #Перенос строки


function_print(1, 2, 4, kw_2="Иван", var1=4)</pre>
<p><strong>Результат:</strong></p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">===Позиционные аргументы===
1,2
===*args===
4 
===Ключевые аргументы===
значение 1,Иван
===**kwargs===
var1 =&gt; 4 </pre>
<h2><strong>Передача списка (list) по ссылке в функцию</strong></h2>
<pre class="EnlighterJSRAW" data-enlighter-language="python">def myfunction (list):
    list.append(40)
    print ("Modified list inside a function: ", list)
    return

mylist=[10,20,30]
myfunction(mylist)
print(mylist)</pre>
<p>Следующий результат подтверждает, что аргументы передаются по ссылке в функцию Python:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">Modified list inside a function: [10, 20, 30, 40]
[10, 20, 30, 40]</pre>
<h1><strong>Пространства имен, области видимости и локальные функции</strong></h1>
<h2><strong>Область действия переменной &#8212; область видимости переменных</strong></h2>
<p><span>Переменные в программе могут быть доступны или недоступны в разных местах этой программы. Это зависит от того, где вы объявили переменную.</span></p>
<p><span>Область действия переменной определяет ту часть программы, в которой вы можете получить доступ к определенному идентификатору (т.е. к значению переменной и возможности эту переменную поменять). <strong>В Python есть две основные области видимости переменных:</strong></span></p>
<ul class="list">
<li><span>Глобальные переменные</span></li>
<li><span>Локальные переменные</span></li>
</ul>
<p><strong>Область видимости переменной</strong> в Python называют также пространством имен. Любая переменная, которой присвоено значение внутри функции, по умолчанию попадает в локальное пространство имен.</p>
<p><strong>Локальное пространство имен</strong> создается при вызове функции, и в него сразу же заносятся аргументы функции. По завершении функции локальное пространство имен уничтожается (хотя бывают и исключения, см. ниже раздел о замыканиях).</p>
<p><strong>Переменные внутри функции – локальные.</strong> Поиск переменных: сперва среди локальных, потом среди глобальных.</p>
<p>Рассмотрим следующую функцию:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">def func():
    a = []
    for i in range(5):
        a.append(i)</pre>
<p>При вызове func() создается пустой список a, в него добавляется 5 элементов, а затем, когда функция завершается, список a уничтожается. Но допустим, что мы объявили a следующим образом:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">a = []
def func():
    for i in range(5):
        a.append(i)</pre>
<p>Присваивать значение глобальной переменной внутри функции допустимо, но такие переменные должны быть объявлены глобальными с помощью ключевого слова <strong>global</strong>:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">a = None

def bind_a_variable():
    global a
    a = []

bind_a_variable()
print a</pre>
<p>Результат:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">[]</pre>
<p>Функции можно объявлять в любом месте, в том числе допустимы локальные функции, которые динамически создаются внутри другой функции при ее вызове:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">def outer_function(x, y, z):
    def inner_function(a, b, c):
        pass
    pass</pre>
<p>Здесь функция <strong>inner_function</strong> не существует, пока не вызвана функция <strong>outer_function</strong>. Как только <strong>outer_function</strong> завершает выполнение, <strong>inner_function</strong> уничтожается.</p>
<blockquote>
<p>Не рекомендуется злоупотреблять ключевым словом <strong>global</strong>. Обычно глобальные переменные служат для хранения состояния системы. Если вы понимаете, что пользуетесь ими слишком часто, то стоит подумать о переходе к <strong>объектно-ориентированному программированию (использовать классы).</strong></p>
</blockquote>
<p>Вложенные функции могут обращаться к локальному пространству имен объемлющей функции, но не могут связывать в нем переменные. Подробнее смотрите в разделе о замыканиях.</p>
<p>Строго говоря, любая функция локальна в какой-то области видимости, хотя это может быть и область видимости на уровне модуля.</p>
<h2><strong>Возврат нескольких значений из одной функции</strong></h2>
<p>В Python существует возможность возвращать из функции несколько значений.</p>
<p>Вот простой пример:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">def f():
    a = 5
    b = 6
    c = 7
    return a, b, c
var1, var2, var3 = f()

print("var1={0} var2={1} var3={2}".format(var1, var2, var3))</pre>
<p>Результат:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">var1=5 var2=6 var3=7</pre>
<p>В анализе данных и других научных приложениях это встречается сплошь и рядом, потому что многие функции вычисляют несколько результатов.</p>
<p>На самом деле, функция возвращает только один объект, кортеж, который затем распаковывается в результирующие переменные.</p>
<p>Этот пример можно было бы записать и так:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">def f():
    a = 5
    b = 6
    c = 7
    return a, b, c
return_value = f()

print(return_value)</pre>
<p>Результат:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">(5, 6, 7)</pre>
<p>В таком случае <strong>return_value</strong> было бы кортежем, содержащим все три возвращенные переменные.</p>
<p>Иногда разумнее возвращать несколько значений не в виде кортежа, а <strong>в виде словаря</strong>:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">def f():
    a = 5
    b = 6
    c = 7
    return {'a' : a, 'b' : b, 'c' : c}

return_value = f()

print(return_value)</pre>
<p>Результат:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">{'a': 5, 'b': 6, 'c': 7}</pre>
<h2><strong>Функции являются объектами</strong></h2>
<p>Поскольку функции в Python – объекты, становятся возможны многие конструкции, которые в других языках выразить трудно. Пусть, например, мы производим очистку данных и должны применить ряд преобразований к следующему списку строк:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">states = [' Alabama ', 'Georgia!', 'Georgia', 'georgia', 'FlOrIda', 'south carolina##', 'West virginia?']</pre>
<p>Всякий, кому доводилось работать с присланными пользователями данными опроса, ожидает такого рода мусора. Чтобы сделать такой список строк пригодным для анализа, нужно произвести различные операции: удалить лишние пробелы и знаки препинания, оставить заглавные буквы только в нужных местах.</p>
<p>Первая попытка могла бы выглядеть так:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">import re # Модуль регулярных выражений

def clean_strings(strings):
    result = []
    for value in strings:
        value = value.strip()
        value = re.sub('[!#?]', '', value) # удалить знаки препинания
        value = value.title()
        result.append(value)
    return result

states = [' Alabama ', 'Georgia!', 'Georgia', 'georgia', 'FlOrIda', 'south carolina##', 'West virginia?']

states = clean_strings(states)

print(states)</pre>
<p>Результат:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">['Alabama', 'Georgia', 'Georgia', 'Georgia', 'Florida', 'South Carolina', 'West Virginia']</pre>
<p>Другой подход, который иногда бывает полезен, – составить список операций, которые необходимо применить к набору строк:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">import re # Модуль регулярных выражений

def remove_punctuation(value):
    return re.sub('[!#?]', '', value)

def clean_strings(strings, ops):
    result = []
    for value in strings:
        for function in ops:
            value = function(value)
        result.append(value)
    return result

clean_ops = [str.strip, remove_punctuation, str.title]
states = [' Alabama ', 'Georgia!', 'Georgia', 'georgia', 'FlOrIda', 'south carolina##', 'West virginia?']

states = clean_strings(states, clean_ops)

print(states)</pre>
<p>Результат:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">['Alabama', 'Georgia', 'Georgia', 'Georgia', 'Florida', 'South Carolina', 'West Virginia']</pre>
<p>Подобный <strong>функциональный подход</strong> позволяет задать способ модификации строк на очень высоком уровне. Степень повторной используемости функции <strong>clean_strings</strong> определенно возросла!</p>
<p><strong>Функции можно передавать в качестве аргументов другим функциям</strong>, например встроенной функции <strong>map</strong>, которая применяет переданную функцию к коллекции:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">import re # Модуль регулярных выражений

def remove_punctuation(value):
    return re.sub('[!#?]', '', value)

states = [' Alabama ', 'Georgia!', 'Georgia', 'georgia', 'FlOrIda', 'south carolina##', 'West virginia?']

states = list(map(remove_punctuation, states))
states = list(map(str.strip, states))
states = list(map(str.title, states))

print(states)</pre>
<p>Результат:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">['Alabama', 'Georgia', 'Georgia', 'Georgia', 'Florida', 'South Carolina', 'West Virginia']</pre>
<h2><strong>Анонимные функции или Лямбда-функции. Lambda Function Python 3</strong></h2>
<ul>
<li><strong>Лямбда-функции</strong> позволяют создавать «встроенные» функции, которые полезны для функционального программирования. Например, с <strong>Map, Filter или Reduce</strong>.</li>
<li><strong>Lambda</strong> &#8212; это инструмент для создания обработчиков обратного вызова (<strong>callback handlers</strong>).</li>
</ul>
<p><strong>Lambda Function &#8212; </strong>это анонимная однострочная функция, которая возвращает всегда 1 результат.</p>
<p>Определяются они с помощью ключевого слова <strong>lambda</strong></p>
<p><span style="color: #008080;"><strong>ИмяФункции</strong> =</span> <span style="color: #ff6600;"><strong>lambda</strong> </span><strong><span style="color: #008000;">переменная_1, переменная_2, &#8230;, переменная_N</span><span style="color: #ff0000;">:</span></strong> <strong><span style="color: #000080;">&lt;выражение, которое использует переменные&gt;</span></strong></p>
<p>Например, функция <strong><span style="color: #008080;">equiv_anon</span></strong>:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">equiv_anon = lambda x: x * 2</pre>
<p>эквивалентна функции <strong><span style="color: #008080;">short_function</span></strong>:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">def short_function(x):
    return x * 2</pre>
<p><strong>Лямбда-функции</strong> особенно удобны в ходе анализа данных, потому что, как вы увидите, во многих случаях функции преобразования данных принимают другие функции в качестве аргументов. Часто быстрее (и чище) передать лямбда-функцию, чем писать полноценное объявление функции или даже присваивать лямбда-функцию локальной переменной.</p>
<p>Рассмотрим такой простенький пример:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">def apply_to_list(some_list, f):
    return [f(x) for x in some_list]

ints = [4, 0, 1, 5, 6]

result = apply_to_list(ints, lambda x: x * 2)

print(result)</pre>
<p>Результат:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">[8, 0, 2, 10, 12]</pre>
<p>Можно было бы, конечно, написать <code class="EnlighterJSRAW" data-enlighter-language="null">[x * 2 for x in ints]</code>, но в данном случае нам удалось передать функции <strong>apply_to_list</strong> пользовательский оператор.</p>
<p><strong>Еще пример:</strong> пусть требуется отсортировать коллекцию строк по количеству различных букв в строке.</p>
<p>Для этого можно передать лямбда-функцию методу списка sort:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">strings = ['foo', 'card', 'bar', 'aaaa', 'abab']

strings.sort(key=lambda x: len(set(list(x))))

print(strings)</pre>
<p>Результат:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">['aaaa', 'foo', 'abab', 'bar', 'card']</pre>
<h3><strong>Для чего хороша лямбда-функция? Зачем нужная lambda function в Python?</strong></h3>
<p pid="4973"><strong>Ответ:</strong></p>
<ul>
<li><span>Нам не нужна лямбда функция, мы могли бы обойтись без нее. <strong>Но…</strong></span></li>
<li><span>Есть определенные ситуации, когда это удобно &#8212; <strong>lambda</strong> делает написание кода немного легче, а написанный код &#8212; немного чище.</span></li>
</ul>
<p><strong>Какие ситуации?</strong></p>
<p pid="4975"><span>Что ж, ситуации, в которых нам нужна простая одноразовая функция: функция, которая будет использоваться только один раз.</span></p>
<p pid="4976"><span>Обычно функции создаются для одной из двух целей: </span><span>(а) для уменьшения дублирования кода или </span><span>(б) для модульности кода.</span></p>
<ul>
<li><span>Если ваше приложение содержит повторяющиеся фрагменты кода в разных местах, то вы можете поместить одну копию этого кода в функцию, дать имя функции, а затем &#8212; используя это имя функции &#8212; вызвать ее из разных мест в вашем коде.</span></li>
<li><span>Если у вас есть кусок кода, который выполняет одну четко определенную операцию &#8212; но он действительно длинный и грубый и прерывает читаемый поток вашей программы, то вы можете извлечь этот длинный грубый код и поместить его в самостоятельную функцию.</span></li>
</ul>
<p><span>Но предположим, что вам нужно создать функцию, которая будет использоваться только один раз &#8212; вызываться </span><em><span>только </span></em><span>из <em>одного </em>места в вашем приложении. Ну, во-первых, вам не нужно давать имя функции. Это может быть «анонимно». И вы можете просто определить его прямо там, где вы хотите его использовать. Вот где лямбда полезна.</span></p>
<p>Еще один пример использования <strong>lambda функции</strong>:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">colors = ["Goldenrod", "Purple", "Salmon", "Turquoise", "Cyan"]

normalized_colors = list(map(lambda s: s.casefold(), colors))

print(normalized_colors)</pre>
<p>Результат:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">['goldenrod', 'purple', 'salmon', 'turquoise', 'cyan']</pre>
<h3 id="Misuse:_naming_lambda_expressions"><strong>Неправильное использование: именование лямбда-выражений</strong></h3>
<p><span>PEP8, официальное руководство по стилю Python, советует никогда не писать такой код:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">normalize_case = lambda s: s.casefold()</pre>
<p><span>Вышеприведенный оператор создает анонимную функцию, а затем назначает ее переменной. Приведенный выше код игнорирует причину полезности </span><strong><span>лямбда-функций</span></strong><span>: <strong>лямбда-функции могут передаваться без необходимости вначале присваивать их переменной</strong>.</span></p>
<p><span>Если вы хотите создать однострочную функцию и сохранить ее в переменной, вы должны использовать </span><code>def</code><span>вместо этого:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">def normalize_case(s): return s.casefold()</pre>
<p><span><strong>PEP8</strong> рекомендует это, потому что <strong>именованные функции</strong> &#8212; это обычная и понятная вещь. Именованная функция также имеет следующее преимущество: назначая нашей функции правильное имя, Вы упрощаете отладку кода. В отличие от функций, определенных с помощью </span><code>def</code><span>, лямбда-функции никогда не имеют имени (это всегда </span><code>&lt;lambda&gt;</code><span>).</span></p>
<p><strong><span>Если вы хотите создать функцию и сохранить ее в переменной, определите свою функцию с помощью </span><code>def</code></strong><span> . Это именно то, для чего существует именованная функция. Не имеет значения, является ли ваша функция одной строкой кода или вы определяете функцию внутри другой функции, </span><code>def</code> <span>отлично работает для этих случаев использования.</span></p>
<h3 id="Misuse:_needless_function_calls"><strong>Неправильное использование: ненужные вызовы функций</strong></h3>
<p><span>Периодически встречаются лямбда-выражения, которые используются для подстановки в функции python, которые уже содержат функциональность для решения задачи. Нужно только посмотреть в документацию по функциям.</span></p>
<p><span>Например, возьмем этот код:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">sorted_numbers = sorted(numbers, key=lambda n: abs(n))</pre>
<figure class="code">
<figcaption><span></span></figcaption>
</figure>
<p>Программист<span>, написавший этот код, вероятно, узнал, что лямбда-выражения используются для создания функции, которую можно передавать в другую функцию.</span></p>
<p><span>Поскольку </span><code>abs</code><span> (которая возвращает абсолютное значение числа) является функцией и все функции могут быть переданы, мы могли бы написать приведенный выше код следующим образом:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">sorted_numbers = sorted(numbers, key=abs)</pre>
<figure class="code">
<figcaption><span></span></figcaption>
</figure>
<p><span>Теперь этот пример может показаться надуманным, но нередко чрезмерно используют лямбда-выражения таким образом. Вот еще один пример, который иногда встречается:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">pairs = [(4, 11), (8, 8), (5, 7), (11, 3)]
sorted_by_smallest = sorted(pairs, key=lambda items: min(items))</pre>
<figure class="code">
<figcaption><span></span></figcaption>
</figure>
<p><span>Поскольку мы принимаем те же аргументы, что и при передаче </span><code>min</code><span>, нам не нужен этот дополнительный вызов функции. Вместо этого мы можем просто передать </span><code>min</code> <span>функцию </span><code>key</code><span>:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">pairs = [(4, 11), (8, 8), (5, 7), (11, 3)]
sorted_by_smallest = sorted(pairs, key=min)</pre>
<figure class="code">
<figcaption><span></span></figcaption>
</figure>
<p><span>Вам не нужна лямбда-функция, если у вас уже есть другая функция, которая делает то, что вы хотите.</span></p>
<h2><strong>Замыкания: функции, возвращающие функции. Динамически сгенерированная функция</strong></h2>
<p><strong>Замыканием</strong> называется любая <em><strong>динамически сгенерированная функция</strong></em>, возвращенная из другой функции. Основное свойство замыкания состоит в том, что оно имеет доступ к переменным, определенным в том локальном пространстве имен, в котором было создано.</p>
<p>Вот очень простой пример:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">def make_closure(a):
    def closure():
        print('Я знаю секрет: %d' % a)
    return closure

closure = make_closure(5)
closure()</pre>
<p>Результат:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">Я знаю секрет: 5</pre>
<p>Разница между замыканием и обычной функцией Python состоит в том, что <strong>замыкание сохраняет доступ к пространству имен (функции)</strong>, в котором было создано, даже если создавшая ее функция уже завершилась.</p>
<p>Так, в примере выше, возвращенное замыкание печатает строку <strong>&#171;Я знаю секрет: 5&#187;</strong>, в какой бы момент ее ни вызвать. Хотя обычно создают замыкания со статическим внутренним состоянием (в данном случае только значение a), ничто не мешает включить в состав состояния изменяемый объект – словарь, множество, список – и затем модифицировать его.</p>
<p>Например, ниже приведена функция, которая возвращает функцию, запоминающую, с какими аргументами вызывалась объемлющая функция:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">def make_watcher():
    have_seen = {}

    def has_been_seen(x):
        if x in have_seen:
            return True
        else:
            have_seen[x] = True
        return False

    return has_been_seen

watcher = make_watcher()

vals = [5, 6, 1, 5, 1, 6, 3, 5]

print([watcher(x) for x in vals])</pre>
<p>Результат:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">[False, False, False, True, True, True, False, True]</pre>
<p>Однако следует иметь в виду одно техническое ограничение: изменять внутреннее состояние объектов (например, добавлять в словарь пары ключ-значение) можно, но связывать переменные в области видимости объемлющей функции – нельзя. Обойти это ограничение можно, например, путем модификации словаря или списка вместо присваивания значений переменным.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">def make_counter():
    count = [0]

    def counter():
        # увеличить счетчик и вернуть новое значение
        count[0] += 1
        return count[0]
    return counter

counter = make_counter()
print(counter())</pre>
<p>Результат:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">1</pre>
<p><strong>Возникает вопрос, зачем все это нужно?</strong> На практике можно написать очень общую функцию с кучей параметров, а затем изготовить на ее основе более простые специализированные функции.</p>
<p>Вот пример функции форматирования строк:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">def format_and_pad(template, space):
    def formatter(x):
        return (template % x).rjust(space)
    return formatter

fmt = format_and_pad('%.4f', 15)
print(fmt(1.756))</pre>
<p>Результат:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">'         1.7560'</pre>
<h2><strong>Каррирование: частичное фиксирование аргументов функции</strong></h2>
<p>В информатике термином каррирование обозначается процедура порождения новых функций из существующих путем фиксирования некоторых аргументов.</p>
<p>Пусть, например, имеется тривиальная функция сложения двух чисел:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">def add_numbers(x, y):
    return x + y</pre>
<p>Мы можем породить на ее основе новую функцию одной переменной, <strong>add_five</strong>, которая прибавляет к своему аргументу 5:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">add_five = lambda y: add_numbers(5, y)</pre>
<p>Говорят, что второй аргумент функции <strong>add_numbers</strong> каррирован. Ничего особо примечательного здесь нет, поскольку мы просто определили новую функцию, которая вызывает существующую.</p>
<p>Теперь запустим полный код:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">def add_numbers(x, y):
    return x + y

add_five = lambda y: add_numbers(5, y)

print(add_five(10))</pre>
<p>Результат:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">15</pre>
<p>Стандартный модуль <strong>functools</strong> упрощает эту процедуру за счет функции <strong>partial</strong>:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="null">from functools import partial

def add_numbers(x, y):
    return x + y

add_five = partial(add_numbers, 5)

print(add_five(10))</pre>
<p>Также вернет <code class="EnlighterJSRAW" data-enlighter-language="null">15</code></p>
<p>При обсуждении библиотеки pandas мы будем пользоваться этой техникой для создания специализированных функций преобразования временных рядов:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="null"># вычислить скользящее среднее временного ряда x за 60 дней
ma60 = lambda x: pandas.rolling_mean(x, 60)
# вычислить скользящие средние за 60 дней всех временных рядов в data
data.apply(ma60)</pre>


<p></p>
<p><a class="a2a_button_telegram" href="https://www.addtoany.com/add_to/telegram?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpython-3-functions-value-arguments-call-variables-arrays%2F&amp;linkname=%D0%A4%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B8%20Python%203%3A%20%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%2C%20%D0%B0%D1%80%D0%B3%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D1%8B%2C%20%D0%B2%D1%8B%D0%B7%D0%BE%D0%B2%2C%20%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5%2C%20%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%B8" title="Telegram" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_whatsapp" href="https://www.addtoany.com/add_to/whatsapp?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpython-3-functions-value-arguments-call-variables-arrays%2F&amp;linkname=%D0%A4%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B8%20Python%203%3A%20%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%2C%20%D0%B0%D1%80%D0%B3%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D1%8B%2C%20%D0%B2%D1%8B%D0%B7%D0%BE%D0%B2%2C%20%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5%2C%20%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%B8" title="WhatsApp" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpython-3-functions-value-arguments-call-variables-arrays%2F&amp;linkname=%D0%A4%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B8%20Python%203%3A%20%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%2C%20%D0%B0%D1%80%D0%B3%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D1%8B%2C%20%D0%B2%D1%8B%D0%B7%D0%BE%D0%B2%2C%20%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5%2C%20%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%B8" title="Facebook" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_linkedin" href="https://www.addtoany.com/add_to/linkedin?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpython-3-functions-value-arguments-call-variables-arrays%2F&amp;linkname=%D0%A4%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B8%20Python%203%3A%20%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%2C%20%D0%B0%D1%80%D0%B3%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D1%8B%2C%20%D0%B2%D1%8B%D0%B7%D0%BE%D0%B2%2C%20%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5%2C%20%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%B8" title="LinkedIn" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_vk" href="https://www.addtoany.com/add_to/vk?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpython-3-functions-value-arguments-call-variables-arrays%2F&amp;linkname=%D0%A4%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B8%20Python%203%3A%20%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%2C%20%D0%B0%D1%80%D0%B3%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D1%8B%2C%20%D0%B2%D1%8B%D0%B7%D0%BE%D0%B2%2C%20%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5%2C%20%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%B8" title="VK" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_twitter" href="https://www.addtoany.com/add_to/twitter?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpython-3-functions-value-arguments-call-variables-arrays%2F&amp;linkname=%D0%A4%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B8%20Python%203%3A%20%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%2C%20%D0%B0%D1%80%D0%B3%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D1%8B%2C%20%D0%B2%D1%8B%D0%B7%D0%BE%D0%B2%2C%20%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5%2C%20%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%B8" title="Twitter" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_email" href="https://www.addtoany.com/add_to/email?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpython-3-functions-value-arguments-call-variables-arrays%2F&amp;linkname=%D0%A4%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B8%20Python%203%3A%20%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%2C%20%D0%B0%D1%80%D0%B3%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D1%8B%2C%20%D0%B2%D1%8B%D0%B7%D0%BE%D0%B2%2C%20%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5%2C%20%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%B8" title="Email" rel="nofollow noopener" target="_blank"></a><a class="a2a_dd addtoany_share_save addtoany_share" href="https://www.addtoany.com/share#url=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fpython-3-functions-value-arguments-call-variables-arrays%2F&#038;title=%D0%A4%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B8%20Python%203%3A%20%D0%B7%D0%BD%D0%B0%D1%87%D0%B5%D0%BD%D0%B8%D0%B5%2C%20%D0%B0%D1%80%D0%B3%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D1%8B%2C%20%D0%B2%D1%8B%D0%B7%D0%BE%D0%B2%2C%20%D0%BF%D0%B5%D1%80%D0%B5%D0%BC%D0%B5%D0%BD%D0%BD%D1%8B%D0%B5%2C%20%D1%81%D0%BF%D0%B8%D1%81%D0%BA%D0%B8" data-a2a-url="https://python.ivan-shamaev.ru/python-3-functions-value-arguments-call-variables-arrays/" data-a2a-title="Функции Python 3: значение, аргументы, вызов, переменные, списки"></a></p><p>Сообщение <a href="https://python.ivan-shamaev.ru/python-3-functions-value-arguments-call-variables-arrays/">Функции Python 3: значение, аргументы, вызов, переменные, списки</a> появились сначала на <a href="https://python.ivan-shamaev.ru">Python 3 | Data Science | Нейронные сети | AI - Искусственный Интеллект</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://python.ivan-shamaev.ru/python-3-functions-value-arguments-call-variables-arrays/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Интерактивная визуализация данных в Python 3</title>
		<link>https://python.ivan-shamaev.ru/interactive-data-visualization-in-python-3/</link>
					<comments>https://python.ivan-shamaev.ru/interactive-data-visualization-in-python-3/#respond</comments>
		
		<dc:creator><![CDATA[Шамаев Иван]]></dc:creator>
		<pubDate>Wed, 18 Mar 2020 21:22:37 +0000</pubDate>
				<category><![CDATA[Введение в Python 3]]></category>
		<category><![CDATA[python 3]]></category>
		<category><![CDATA[визуализация Python 3]]></category>
		<category><![CDATA[Визуализация данных]]></category>
		<category><![CDATA[визуализация данных в Python 3]]></category>
		<category><![CDATA[Интерактивная визуализация]]></category>
		<category><![CDATA[Интерактивная визуализация данных в Python 3]]></category>
		<guid isPermaLink="false">https://python.ivan-shamaev.ru/?p=752</guid>

					<description><![CDATA[<p>В этой статье будет рассмотрено &#171;Как создавать Интерактивные визуализации данных в Python 3 с помощью одной строки&#187; Заблуждение об утраченной стоимости является одним из многих вредных когнитивных предубеждений, жертвами которых становятся люди. Это относится к нашей тенденции продолжать тратить время и ресурсы на безнадежное дело, потому что мы уже потратили столько времени в поисках. Заблуждение о непомерных затратах относится [&#8230;]</p>
<p>Сообщение <a href="https://python.ivan-shamaev.ru/interactive-data-visualization-in-python-3/">Интерактивная визуализация данных в Python 3</a> появились сначала на <a href="https://python.ivan-shamaev.ru">Python 3 | Data Science | Нейронные сети | AI - Искусственный Интеллект</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><a class="a2a_button_telegram" href="https://www.addtoany.com/add_to/telegram?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Finteractive-data-visualization-in-python-3%2F&amp;linkname=%D0%98%D0%BD%D1%82%D0%B5%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%B2%D0%BD%D0%B0%D1%8F%20%D0%B2%D0%B8%D0%B7%D1%83%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%20%D0%B2%20Python%203" title="Telegram" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_whatsapp" href="https://www.addtoany.com/add_to/whatsapp?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Finteractive-data-visualization-in-python-3%2F&amp;linkname=%D0%98%D0%BD%D1%82%D0%B5%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%B2%D0%BD%D0%B0%D1%8F%20%D0%B2%D0%B8%D0%B7%D1%83%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%20%D0%B2%20Python%203" title="WhatsApp" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Finteractive-data-visualization-in-python-3%2F&amp;linkname=%D0%98%D0%BD%D1%82%D0%B5%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%B2%D0%BD%D0%B0%D1%8F%20%D0%B2%D0%B8%D0%B7%D1%83%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%20%D0%B2%20Python%203" title="Facebook" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_linkedin" href="https://www.addtoany.com/add_to/linkedin?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Finteractive-data-visualization-in-python-3%2F&amp;linkname=%D0%98%D0%BD%D1%82%D0%B5%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%B2%D0%BD%D0%B0%D1%8F%20%D0%B2%D0%B8%D0%B7%D1%83%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%20%D0%B2%20Python%203" title="LinkedIn" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_vk" href="https://www.addtoany.com/add_to/vk?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Finteractive-data-visualization-in-python-3%2F&amp;linkname=%D0%98%D0%BD%D1%82%D0%B5%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%B2%D0%BD%D0%B0%D1%8F%20%D0%B2%D0%B8%D0%B7%D1%83%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%20%D0%B2%20Python%203" title="VK" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_twitter" href="https://www.addtoany.com/add_to/twitter?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Finteractive-data-visualization-in-python-3%2F&amp;linkname=%D0%98%D0%BD%D1%82%D0%B5%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%B2%D0%BD%D0%B0%D1%8F%20%D0%B2%D0%B8%D0%B7%D1%83%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%20%D0%B2%20Python%203" title="Twitter" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_email" href="https://www.addtoany.com/add_to/email?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Finteractive-data-visualization-in-python-3%2F&amp;linkname=%D0%98%D0%BD%D1%82%D0%B5%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%B2%D0%BD%D0%B0%D1%8F%20%D0%B2%D0%B8%D0%B7%D1%83%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%20%D0%B2%20Python%203" title="Email" rel="nofollow noopener" target="_blank"></a><a class="a2a_dd addtoany_share_save addtoany_share" href="https://www.addtoany.com/share#url=https%3A%2F%2Fpython.ivan-shamaev.ru%2Finteractive-data-visualization-in-python-3%2F&#038;title=%D0%98%D0%BD%D1%82%D0%B5%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%B2%D0%BD%D0%B0%D1%8F%20%D0%B2%D0%B8%D0%B7%D1%83%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%20%D0%B2%20Python%203" data-a2a-url="https://python.ivan-shamaev.ru/interactive-data-visualization-in-python-3/" data-a2a-title="Интерактивная визуализация данных в Python 3"></a></p><blockquote>
<p><em><strong>В этой статье будет рассмотрено &#171;Как создавать Интерактивные визуализации данных в Python 3 с помощью одной строки&#187;</strong></em></p>
</blockquote>
<p id="b074" class="jp jq cm ap jr b hp js hr jt ju jv jw jx jy jz ka fb" data-selectable-paragraph=""><span>Заблуждение об утраченной стоимости является одним из многих </span><a href="https://en.wikipedia.org/wiki/Thinking,_Fast_and_Slow#Heuristics_and_biases" class="bm dc gq gr gs gt" target="_blank" rel="noopener nofollow noreferrer"><span>вредных когнитивных предубеждений,</span></a><span> жертвами которых становятся люди. Это </span><a href="https://youarenotsosmart.com/2011/03/25/the-sunk-cost-fallacy/" class="bm dc gq gr gs gt" target="_blank" rel="noopener nofollow noreferrer"><span>относится к нашей тенденции</span></a><span> продолжать тратить время и ресурсы на безнадежное дело, потому что мы уже потратили столько времени в поисках. Заблуждение о непомерных затратах относится к тому, чтобы оставаться на плохой работе дольше, чем мы должны, упорно трудиться над проектом, даже когда ясно, что он не будет работать, и да, продолжая использовать утомительную, устаревшую библиотеку построения графиков &#8212; matplotlib &#8212; когда существуют более эффективные, интерактивные и более привлекательные альтернативы.</span></p>
<p id="c069" class="jp jq cm ap jr b hp js hr jt ju jv jw jx jy jz ka fb" data-selectable-paragraph=""><span>За последние несколько месяцев я понял, что единственная причина, по которой я использую </span><code class="gf kb kc kd ke b">matplotlib</code> &#8212; <span>это сотни часов, которые я потратил на изучение </span><a href="https://matplotlib.org/api/api_overview.html" class="bm dc gq gr gs gt" target="_blank" rel="noopener nofollow noreferrer"><span>сложного синтаксиса</span></a><span>. Это осложнение приводит к часам разочарования на StackOverflow, выясняя, как </span><a href="https://stackoverflow.com/questions/14946371/editing-the-date-formatting-of-x-axis-tick-labels-in-matplotlib" class="bm dc gq gr gs gt" target="_blank" rel="noopener nofollow noreferrer"><span>отформатировать дату</span></a><span> или </span><a href="https://stackoverflow.com/questions/14762181/adding-a-y-axis-label-to-secondary-y-axis-in-matplotlib" class="bm dc gq gr gs gt" target="_blank" rel="noopener nofollow noreferrer"><span>добавить вторую ось Y</span></a><span>. К счастью, сейчас отличное время для построения графиков в Python, и после изучения </span><a href="https://www.fusioncharts.com/blog/best-python-data-visualization-libraries/" class="bm dc gq gr gs gt" target="_blank" rel="noopener nofollow noreferrer"><span>разных вариантов графических библиотек</span></a><span> явным победителем &#8212; с точки зрения простоты использования, документирования и функциональности &#8212; является </span><a href="https://plot.ly/python/" class="bm dc gq gr gs gt" target="_blank" rel="noopener nofollow noreferrer"><span>библиотека Python. </span></a><span>В этой статье мы подробно рассмотрим </span><code class="gf kb kc kd ke b">plotly</code><span>, как создавать лучшие графики за меньшее время &#8212; часто с помощью одной строки кода.</span></p>
<p id="90e7" class="jp jq cm ap jr b hp js hr jt ju jv jw jx jy jz ka fb" data-selectable-paragraph=""><span>Весь код этой статьи </span><a href="https://github.com/WillKoehrsen/Data-Analysis/blob/master/plotly/Plotly%20Whirlwind%20Introduction.ipynb" class="bm dc gq gr gs gt" target="_blank" rel="noopener nofollow noreferrer"><span>доступен на GitHub</span></a><span>. Все графики являются интерактивными и могут быть просмотрены на </span><a href="https://nbviewer.jupyter.org/github/WillKoehrsen/Data-Analysis/blob/master/plotly/Plotly%20Whirlwind%20Introduction.ipynb" class="bm dc gq gr gs gt" target="_blank" rel="noopener nofollow noreferrer"><span>NBViewer здесь</span></a><span>.</span></p>
<p data-selectable-paragraph=""><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/1_interactive_data_visualization_in_python_3.png"><img decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/1_interactive_data_visualization_in_python_3.png" alt="" width="660" height="525" class="aligncenter size-full wp-image-762" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/1_interactive_data_visualization_in_python_3.png 660w, https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/1_interactive_data_visualization_in_python_3-300x239.png 300w" sizes="(max-width: 660px) 100vw, 660px" /></a></p>
<h2 id="3caa" class="km kn cm ap ao ko kp kq kr ks kt ku kv kw kx ky kz" data-selectable-paragraph=""><strong>Краткий обзор Plotly &amp; Cufflinks</strong></h2>
<p id="c3b0" class="jp jq cm ap jr b hp la hr lb ju lc jw ld jy le ka fb" data-selectable-paragraph=""><mark class="tb tc pc"><span></span></mark><mark class="tb tc pc"><code class="gf kb kc kd ke b"></code><a href="https://plot.ly/python/" class="bm dc gq gr gs gt" target="_blank" rel="noopener nofollow noreferrer"><strong>plotly</strong></a></mark><strong><mark class="tb tc pc"><a href="https://plot.ly/python/" class="bm dc gq gr gs gt" target="_blank" rel="noopener nofollow noreferrer"> </a></mark></strong><mark class="tb tc pc"><span><strong>Пакет Python</strong> &#8212; это библиотека с открытым исходным кодом, построенная на </span></mark><mark class="tb tc pc"><code class="gf kb kc kd ke b"></code><a href="https://plot.ly/javascript/" class="bm dc gq gr gs gt" target="_blank" rel="noopener nofollow noreferrer">plotly.js</a>,</mark><mark class="tb tc pc"><a href="https://plot.ly/javascript/" class="bm dc gq gr gs gt" target="_blank" rel="noopener nofollow noreferrer"><span> который</span></a></mark><mark class="tb tc pc"><span> в свою очередь построен на </span></mark><mark class="tb tc pc"><code class="gf kb kc kd ke b"></code><a href="https://d3js.org/" class="bm dc gq gr gs gt" target="_blank" rel="noopener nofollow noreferrer">d3.js</a></mark><mark class="tb tc pc"><a href="https://d3js.org/" class="bm dc gq gr gs gt" target="_blank" rel="noopener nofollow noreferrer"><span>,</span></a></mark><span>Мы будем использовать wrapper на plotly, которые называются </span><a href="https://github.com/santosjorge/cufflinks" class="bm dc gq gr gs gt" target="_blank" rel="noopener nofollow noreferrer">cufflinks</a>, <span>предназначенные для работы с Pandas DataFrames. Итак, весь наш стек это <strong>cufflinks &gt; plotly &gt; plotly.js &gt; d3.js</strong>, что означает, что мы получаем эффективность кодирования в Python с невероятными </span><a href="https://github.com/d3/d3/wiki/Gallery" class="bm dc gq gr gs gt" target="_blank" rel="noopener nofollow noreferrer"><span>интерактивными графическими возможностями d3.js.</span></a></p>
<p id="3f5e" class="jp jq cm ap jr b hp js hr jt ju jv jw jx jy jz ka fb" data-selectable-paragraph=""><span>(</span><a href="https://plot.ly/" class="bm dc gq gr gs gt" target="_blank" rel="noopener nofollow noreferrer"><span>Сама Plotly</span></a><span> &#8212; это графическая компания с несколькими продуктами и инструментами с открытым исходным кодом. Библиотека Python бесплатна, и мы можем создавать неограниченное количество диаграмм в автономном режиме и до 25 диаграмм в онлайн-режиме, чтобы </span><a href="http://help.plot.ly/how-sharing-works-in-plotly/" class="bm dc gq gr gs gt" target="_blank" rel="noopener nofollow noreferrer"><span>поделиться ими со всем миром</span></a><span>).</span></p>
<p id="fcfe" class="jp jq cm ap jr b hp js hr jt ju jv jw jx jy jz ka fb" data-selectable-paragraph=""><span>Вся работа в этой статье была выполнена в <strong>блокноте Jupyter</strong> с plotly + cufflinks, работающими в автономном режиме. После установки plotly и cufflinks с помощью инструкции </span><code class="gf kb kc kd ke b">pip install cufflinks plotly</code>, необходимо <span>импортировать следующие компоненты в Jupyter:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python"># Standard plotly imports
import plotly.plotly as py
import plotly.graph_objs as go
from plotly.offline import iplot, init_notebook_mode

# Using plotly + cufflinks in offline mode
import cufflinks
cufflinks.go_offline(connected=True)
init_notebook_mode(connected=True)</pre>
<h2 id="439d" class="lx kn cm ap ao ko gy ly ha lz ma mb mc md me mf mg"><strong>Распределения по одной переменной: Histograms и Boxplots</strong></h2>
<p id="202d" class="jp jq cm ap jr b hp la hr lb ju lc jw ld jy le ka fb" data-selectable-paragraph=""><span><strong>Одиночная переменная (single variable)</strong> &#8212; одномерный график &#8212; это стандартный способ начать анализ данных, а гистограмма &#8212; это график перехода ( </span><a href="https://www.andata.at/en/software-blog-reader/why-we-love-the-cdf-and-do-not-like-histograms-that-much.html" class="bm dc gq gr gs gt" target="_blank" rel="noopener nofollow noreferrer"><span>хотя он имеет некоторые проблемы</span></a><span> ) для построения графика распределения. Используя некоторую статистику (</span><span>Скачать </span><a href="https://github.com/WillKoehrsen/Data-Analysis/tree/master/medium" class="bm dc gq gr gs gt" target="_blank" rel="noopener nofollow noreferrer"><span>статистику &gt;&gt;&gt;</span></a><span> ), давайте создадим интерактивную гистограмму количества likes для статей (</span><code class="gf kb kc kd ke b">df</code><span>это стандартный dataframe Pandas):</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">df['claps'].iplot(kind='hist', xTitle='claps',
                  yTitle='count', title='Claps Distribution')</pre>
<p><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/2_interactive_data_visualization_in_python_3.gif"><img decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/2_interactive_data_visualization_in_python_3.gif" alt="" width="800" height="427" class="aligncenter size-full wp-image-766" /></a></p>
<p id="a9a4" class="jp jq cm ap jr b hp js hr jt ju jv jw jx jy jz ka fb" data-selectable-paragraph=""><span>Для тех, кто привык к </span><code class="gf kb kc kd ke b">matplotlib</code><span>, все, что нам нужно сделать, это добавить еще одну букву ( </span><code class="gf kb kc kd ke b">iplot</code><span>вместо </span><code class="gf kb kc kd ke b">plot</code><span>), и мы получим намного более привлекательный и интерактивный график! Мы можем щелкнуть на колонке, чтобы получить более подробную информацию, увеличить масштаб участков и, как мы увидим позже, выбрать различные категории для выделения.</span></p>
<p id="02d3" class="jp jq cm ap jr b hp js hr jt ju jv jw jx jy jz ka fb" data-selectable-paragraph=""><span>Если мы хотим построить наложенные гистограммы, это так же просто:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">df[['time_started', 'time_published']].iplot(
    kind='hist',
    histnorm='percent',
    barmode='overlay',
    xTitle='Time of Day',
    yTitle='(%) of Articles',
    title='Time Started and Time Published')</pre>
<p><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/3_interactive_data_visualization_in_python_3.png"><img decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/3_interactive_data_visualization_in_python_3.png" alt="" width="1122" height="604" class="aligncenter size-full wp-image-767" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/3_interactive_data_visualization_in_python_3.png 1122w, https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/3_interactive_data_visualization_in_python_3-300x161.png 300w, https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/3_interactive_data_visualization_in_python_3-1024x551.png 1024w, https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/3_interactive_data_visualization_in_python_3-768x413.png 768w" sizes="(max-width: 1122px) 100vw, 1122px" /></a></p>
<p><span>С небольшим количеством манипуляций над </span><code class="gf kb kc kd ke b">pandas</code><span> мы можем сделать barplot:</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python"># Resample to monthly frequency and plot 
df2 = df[['view','reads','published_date']].\
         set_index('published_date').\
         resample('M').mean()
df2.iplot(kind='bar', xTitle='Date', yTitle='Average',
    title='Monthly Average Views and Reads')</pre>
<p><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/4_interactive_data_visualization_in_python_3.png"><img decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/4_interactive_data_visualization_in_python_3.png" alt="" width="1142" height="690" class="aligncenter size-full wp-image-768" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/4_interactive_data_visualization_in_python_3.png 1142w, https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/4_interactive_data_visualization_in_python_3-300x181.png 300w, https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/4_interactive_data_visualization_in_python_3-1024x619.png 1024w, https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/4_interactive_data_visualization_in_python_3-768x464.png 768w" sizes="(max-width: 1142px) 100vw, 1142px" /></a></p>
<p><span>Мы можем объединить </span><a href="https://pandas.pydata.org/pandas-docs/stable/10min.html" class="bm dc gq gr gs gt" target="_blank" rel="noopener nofollow noreferrer"><span>возможности Pandas</span></a><span> с plotly + cufflinks. Для boxplot по подписчикам по всей истории публикаций мы используем </span><code class="gf kb kc kd ke b">pivot</code>, <span>а затем plot (точнее iplot):</span></p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">df.pivot(columns='publication', values='fans').iplot(
        kind='box',
        yTitle='fans',
        title='Fans Distribution by Publication')</pre>
<p><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/5_interactive_data_visualization_in_python_3.gif"><img decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/5_interactive_data_visualization_in_python_3.gif" alt="" width="800" height="452" class="aligncenter size-full wp-image-769" /></a></p>
<p><span>Преимущества интерактивности заключаются в том, что мы можем исследовать и размещать данные по своему усмотрению. </span><span>В boxplot много информации, и без возможности видеть цифры мы пропустим большую ее часть!</span></p>
<h2><strong>Диаграммы рассеяния &#8212; Scatterplots</strong></h2>
<p><strong>Диаграмма рассеяния (Scatterplots)</strong> &#8212; используется очень часто для анализа данных. Scatterplots позволяет видеть эволюцию переменной во времени или связь между двумя (или более) переменными.</p>
<h3><strong>Временные ряды (Time-Series)</strong></h3>
<p>Значительная часть данных реального мира содержит в себе временной параметр. К счастью, plotly + cufflinks были разработаны с учетом визуализации временных рядов. Давайте создадим базу данных по статьям и посмотрим, как изменились тенденции.</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python"># Create a dataframe of Towards Data Science Articles
tds = df[df['publication'] == 'Towards Data Science'].\
         set_index('published_date')

# Plot read time as a time series
tds[['claps', 'fans', 'title']].iplot(
    y='claps', mode='lines+markers', secondary_y = 'fans',
    secondary_y_title='Fans', xTitle='Date', yTitle='Claps',
    text='title', title='Fans and Claps over Time')</pre>
<p><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/6_interactive_data_visualization_in_python_3.gif"><img decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/6_interactive_data_visualization_in_python_3.gif" alt="" width="712" height="396" class="aligncenter size-full wp-image-773" /></a></p>
<p>Здесь мы выполняем много разных действий в одной строке:</p>
<ul>
<li>Автоматическое получение красиво отформатированного временного ряда по оси X</li>
<li>Добавление вторичной оси Y, потому что наши переменные имеют разные диапазоны</li>
<li>Добавление заголовка статей в качестве всплывающей информации</li>
</ul>
<p>Для получения дополнительной информации мы также можем легко добавить текстовые аннотации:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">tds_monthly_totals.iplot(
    mode='lines+markers+text',
    text=text,
    y='word_count',
    opacity=0.8,
    xTitle='Date',
    yTitle='Word Count',
    title='Total Word Count by Month')</pre>
<p><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/7_interactive_data_visualization_in_python_3.png"><img decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/7_interactive_data_visualization_in_python_3.png" alt="" width="1132" height="654" class="aligncenter size-full wp-image-774" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/7_interactive_data_visualization_in_python_3.png 1132w, https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/7_interactive_data_visualization_in_python_3-300x173.png 300w, https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/7_interactive_data_visualization_in_python_3-1024x592.png 1024w, https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/7_interactive_data_visualization_in_python_3-768x444.png 768w" sizes="(max-width: 1132px) 100vw, 1132px" /></a></p>
<p>Для диаграммы рассеяния с двумя переменными, окрашенной третьей категориальной переменной, мы используем:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">df.iplot(
    x='read_time',
    y='read_ratio',
    # Specify the category
    categories='publication',
    xTitle='Read Time',
    yTitle='Reading Percent',
    title='Reading Percent vs Read Ratio by Publication')</pre>
<p><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/8_interactive_data_visualization_in_python_3.png"><img decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/8_interactive_data_visualization_in_python_3.png" alt="" width="1131" height="656" class="aligncenter size-full wp-image-776" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/8_interactive_data_visualization_in_python_3.png 1131w, https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/8_interactive_data_visualization_in_python_3-300x174.png 300w, https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/8_interactive_data_visualization_in_python_3-1024x594.png 1024w, https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/8_interactive_data_visualization_in_python_3-768x445.png 768w" sizes="(max-width: 1131px) 100vw, 1131px" /></a></p>
<p>Давайте немного усложним, используя ось журнала &#8212; указанную в виде графического макета &#8212; (см. <a href="https://plot.ly/python/reference/" target="_blank" rel="noopener noreferrer">Документацию Plotly для деталей макета</a>) и определяя размеры пузырьков с помощью числовой переменной:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">tds.iplot(
    x='word_count',
    y='reads',
    size='read_ratio',
    text=text,
    mode='markers',
    # Log xaxis
    layout=dict(
        xaxis=dict(type='log', title='Word Count'),
        yaxis=dict(title='Reads'),
        title='Reads vs Log Word Count Sized by Read Ratio'))</pre>
<p><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/9_interactive_data_visualization_in_python_3.png"><img decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/9_interactive_data_visualization_in_python_3.png" alt="" width="1110" height="647" class="aligncenter size-full wp-image-777" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/9_interactive_data_visualization_in_python_3.png 1110w, https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/9_interactive_data_visualization_in_python_3-300x175.png 300w, https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/9_interactive_data_visualization_in_python_3-1024x597.png 1024w, https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/9_interactive_data_visualization_in_python_3-768x448.png 768w" sizes="(max-width: 1110px) 100vw, 1110px" /></a></p>
<p>Приложив немного больше усилий ( <a href="https://nbviewer.jupyter.org/github/WillKoehrsen/Data-Analysis/blob/master/plotly/Plotly%20Whirlwind%20Introduction.ipynb#">подробности см. В блокноте</a> ), мы даже можем поместить четыре переменных ( <a href="https://serialmentor.com/dataviz/aesthetic-mapping.html" target="_blank" rel="noopener noreferrer">это не рекомендуется</a> ) на один график!</p>
<p><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/10_interactive_data_visualization_in_python_3.png"><img decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/10_interactive_data_visualization_in_python_3.png" alt="" width="962" height="517" class="aligncenter size-full wp-image-778" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/10_interactive_data_visualization_in_python_3.png 962w, https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/10_interactive_data_visualization_in_python_3-300x161.png 300w, https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/10_interactive_data_visualization_in_python_3-768x413.png 768w" sizes="(max-width: 962px) 100vw, 962px" /></a></p>
<p>Как и прежде, мы можем комбинировать pandas с plotly+cufflinks для полезных графических представлений:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">df.pivot_table(
    values='views', index='published_date',
    columns='publication').cumsum().iplot(
        mode='markers+lines',
        size=8,
        symbol=[1, 2, 3, 4, 5],
        layout=dict(
            xaxis=dict(title='Date'),
            yaxis=dict(type='log', title='Total Views'),
            title='Total Views over Time by Publication'))</pre>
<p><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/11_interactive_data_visualization_in_python_3.png"><img decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/11_interactive_data_visualization_in_python_3.png" alt="" width="1139" height="678" class="aligncenter size-full wp-image-779" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/11_interactive_data_visualization_in_python_3.png 1139w, https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/11_interactive_data_visualization_in_python_3-300x179.png 300w, https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/11_interactive_data_visualization_in_python_3-1024x610.png 1024w, https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/11_interactive_data_visualization_in_python_3-768x457.png 768w" sizes="(max-width: 1139px) 100vw, 1139px" /></a></p>
<p>См. Блокнот <a href="https://plot.ly/python/" target="_blank" rel="noopener noreferrer">или документацию</a> для получения дополнительных примеров дополнительных функций. Мы можем добавлять текстовые аннотации, опорные линии и линии, которые лучше всего подходят для наших графиков, с помощью одной строки кода и при этом со всеми взаимодействиями.</p>
<h2><strong>Advanced Plots &#8212; Расширенные графические представления</strong></h2>
<p>Теперь мы разберемся с несколькими графиками, которые вы, вероятно, не будете использовать так часто, но которые могут быть весьма впечатляющими. Мы будем использовать график <code class="EnlighterJSRAW" data-enlighter-language="null">figure_factory</code>, чтобы держать эти графики на одной линии.</p>
<h3><strong>Scatter Matrix</strong></h3>
<p>Когда мы хотим исследовать отношения между многими переменными, отличной опцией является точная матрица &#8212; scattermatrix (также называемая спломом или splom):</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">import plotly.figure_factory as ff
figure = ff.create_scatterplotmatrix(
    df[['claps', 'publication', 'views',      
        'read_ratio','word_count']],
    diag='histogram',
    index='publication')</pre>
<p><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/12_interactive_data_visualization_in_python_3.png"><img decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/12_interactive_data_visualization_in_python_3.png" alt="" width="1000" height="1000" class="aligncenter size-full wp-image-782" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/12_interactive_data_visualization_in_python_3.png 1000w, https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/12_interactive_data_visualization_in_python_3-300x300.png 300w, https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/12_interactive_data_visualization_in_python_3-150x150.png 150w, https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/12_interactive_data_visualization_in_python_3-768x768.png 768w" sizes="(max-width: 1000px) 100vw, 1000px" /></a></p>
<p>Даже этот график полностью интерактивен, что позволяет нам исследовать данные.</p>
<h3><strong>Тепловая карта корреляции &#8212; Correlation Heatmap</strong></h3>
<p>Чтобы визуализировать корреляции между числовыми переменными, мы вычисляем корреляции и затем создаем аннотированную тепловую карту:</p>
<pre class="EnlighterJSRAW" data-enlighter-language="python">corrs = df.corr()
figure = ff.create_annotated_heatmap(
    z=corrs.values,
    x=list(corrs.columns),
    y=list(corrs.index),
    annotation_text=corrs.round(2).values,
    showscale=True)</pre>
<p><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/13_interactive_data_visualization_in_python_3.png"><img decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/13_interactive_data_visualization_in_python_3.png" alt="" width="1000" height="800" class="aligncenter size-full wp-image-783" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/13_interactive_data_visualization_in_python_3.png 1000w, https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/13_interactive_data_visualization_in_python_3-300x240.png 300w, https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/13_interactive_data_visualization_in_python_3-768x614.png 768w" sizes="(max-width: 1000px) 100vw, 1000px" /></a></p>
<p>Список графиков можно продолжать и продолжать. Cufflinks также имеют несколько тем, которые мы можем использовать, чтобы получить совершенно другой стиль без каких-либо усилий. Например, ниже у нас есть график отношения (ratio plot) в теме «space»:</p>
<p><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/14_interactive_data_visualization_in_python_3.png"><img decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/14_interactive_data_visualization_in_python_3.png" alt="" width="700" height="450" class="aligncenter size-full wp-image-784" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/14_interactive_data_visualization_in_python_3.png 700w, https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/14_interactive_data_visualization_in_python_3-300x193.png 300w" sizes="(max-width: 700px) 100vw, 700px" /></a></p>
<p>и график распространения (spread plot) в «ggplot»:</p>
<p><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/15_interactive_data_visualization_in_python_3.png"><img decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/15_interactive_data_visualization_in_python_3.png" alt="" width="972" height="460" class="aligncenter size-full wp-image-785" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/15_interactive_data_visualization_in_python_3.png 972w, https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/15_interactive_data_visualization_in_python_3-300x142.png 300w, https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/15_interactive_data_visualization_in_python_3-768x363.png 768w" sizes="(max-width: 972px) 100vw, 972px" /></a></p>
<p>Мы также можем получить 3D-графики (поверхность surface и пузырь bubble).</p>
<p><strong>surface plot:</strong></p>
<p><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/16_interactive_data_visualization_in_python_3.png"><img decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/16_interactive_data_visualization_in_python_3.png" alt="" width="766" height="473" class="aligncenter size-full wp-image-786" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/16_interactive_data_visualization_in_python_3.png 766w, https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/16_interactive_data_visualization_in_python_3-300x185.png 300w" sizes="(max-width: 766px) 100vw, 766px" /></a></p>
<p><strong>bubble plot:</strong></p>
<p><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/17_interactive_data_visualization_in_python_3.png"><img decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/17_interactive_data_visualization_in_python_3.png" alt="" width="746" height="478" class="aligncenter size-full wp-image-787" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/17_interactive_data_visualization_in_python_3.png 746w, https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/17_interactive_data_visualization_in_python_3-300x192.png 300w" sizes="(max-width: 746px) 100vw, 746px" /></a></p>
<p>Для тех, <a href="https://interworks.com/blog/rcurtis/2018/01/19/friends-dont-let-friends-make-pie-charts/" target="_blank" rel="noopener noreferrer">кто так склонен</a> , вы можете даже сделать круговую диаграмму:</p>
<p><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/18_interactive_data_visualization_in_python_3.png"><img decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/18_interactive_data_visualization_in_python_3.png" alt="" width="700" height="450" class="aligncenter size-full wp-image-788" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/18_interactive_data_visualization_in_python_3.png 700w, https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/18_interactive_data_visualization_in_python_3-300x193.png 300w" sizes="(max-width: 700px) 100vw, 700px" /></a></p>
<h2><strong>Редактирование в Plotly Chart Studio</strong></h2>
<p>Создавая эти графики в блокноте, вы увидите небольшую ссылку в правом нижнем углу на графике с надписью «Экспорт в plot.ly». Если вы щелкнете по этой ссылке, вы попадете в <a href="https://plot.ly/create/" target="_blank" rel="noopener noreferrer">диаграммную студию</a>, где сможете подправить свой график для окончательной презентации. Вы можете добавлять аннотации, указывать цвета и, в общем, убирать все для получения отличной фигуры. Затем вы можете опубликовать свою фигуру в Интернете, чтобы любой мог найти ее по ссылке.</p>
<p>Ниже приведены два графика, которые были скорректированы в Chart Studio:</p>
<p><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/19_interactive_data_visualization_in_python_3.png"><img decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/19_interactive_data_visualization_in_python_3.png" alt="" width="700" height="450" class="aligncenter size-full wp-image-789" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/19_interactive_data_visualization_in_python_3.png 700w, https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/19_interactive_data_visualization_in_python_3-300x193.png 300w" sizes="(max-width: 700px) 100vw, 700px" /></a></p>
<p><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/20_interactive_data_visualization_in_python_3.png"><img decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/20_interactive_data_visualization_in_python_3.png" alt="" width="700" height="450" class="aligncenter size-full wp-image-790" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/20_interactive_data_visualization_in_python_3.png 700w, https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/20_interactive_data_visualization_in_python_3-300x193.png 300w" sizes="(max-width: 700px) 100vw, 700px" /></a></p>
<p>Со всем, что упомянуто здесь, мы все еще не изучаем все возможности библиотеки! Я бы посоветовал вам проверить документацию по plotly &amp; cufflinks, для более невероятной графики.</p>
<p><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/21_interactive_data_visualization_in_python_3.png"><img decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/21_interactive_data_visualization_in_python_3.png" alt="" width="1040" height="800" class="aligncenter size-full wp-image-791" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/21_interactive_data_visualization_in_python_3.png 1040w, https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/21_interactive_data_visualization_in_python_3-300x231.png 300w, https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/21_interactive_data_visualization_in_python_3-1024x788.png 1024w, https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/21_interactive_data_visualization_in_python_3-768x591.png 768w" sizes="(max-width: 1040px) 100vw, 1040px" /></a></p>
<p>Выводы<br />Хуже всего в заблуждении о затонувших затратах является то, что вы понимаете, сколько времени вы потратили впустую после того, как бросили работу. К счастью, теперь, когда я допустил ошибку, придерживаясь matploblibслишком долго, вам не нужно!</p>
<p>Когда мы думаем о построении библиотек, есть несколько вещей, которые мы хотим:</p>
<ul>
<li>Графики с одной переменной для быстрого исследования</li>
<li>Интерактивные элементы для подбора / исследования данных</li>
<li>Возможность копаться в деталях по мере необходимости</li>
<li>Простая настройка для финальной презентации</li>
</ul>
<p>На данный момент, лучший вариант для всего этого в Python &#8212; это plotly.</p>
<p>Plotly позволяет нам быстро создавать визуализации и помогает нам лучше понять наши данные с помощью интерактивности. Кроме того, давайте признаем, что построение графиков должно быть одной из самых приятных частей науки о данных! С другими библиотеками построение графиков превратилось в утомительное занятие, но с plotly снова есть радость в создании великой фигуры!</p>
<p><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/22_interactive_data_visualization_in_python_3.png"><img decoding="async" src="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/22_interactive_data_visualization_in_python_3.png" alt="" width="1448" height="625" class="aligncenter size-full wp-image-792" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/22_interactive_data_visualization_in_python_3.png 1448w, https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/22_interactive_data_visualization_in_python_3-300x129.png 300w, https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/22_interactive_data_visualization_in_python_3-1024x442.png 1024w, https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/22_interactive_data_visualization_in_python_3-768x331.png 768w" sizes="(max-width: 1448px) 100vw, 1448px" /></a></p>


<p></p>
<p><a class="a2a_button_telegram" href="https://www.addtoany.com/add_to/telegram?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Finteractive-data-visualization-in-python-3%2F&amp;linkname=%D0%98%D0%BD%D1%82%D0%B5%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%B2%D0%BD%D0%B0%D1%8F%20%D0%B2%D0%B8%D0%B7%D1%83%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%20%D0%B2%20Python%203" title="Telegram" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_whatsapp" href="https://www.addtoany.com/add_to/whatsapp?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Finteractive-data-visualization-in-python-3%2F&amp;linkname=%D0%98%D0%BD%D1%82%D0%B5%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%B2%D0%BD%D0%B0%D1%8F%20%D0%B2%D0%B8%D0%B7%D1%83%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%20%D0%B2%20Python%203" title="WhatsApp" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Finteractive-data-visualization-in-python-3%2F&amp;linkname=%D0%98%D0%BD%D1%82%D0%B5%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%B2%D0%BD%D0%B0%D1%8F%20%D0%B2%D0%B8%D0%B7%D1%83%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%20%D0%B2%20Python%203" title="Facebook" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_linkedin" href="https://www.addtoany.com/add_to/linkedin?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Finteractive-data-visualization-in-python-3%2F&amp;linkname=%D0%98%D0%BD%D1%82%D0%B5%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%B2%D0%BD%D0%B0%D1%8F%20%D0%B2%D0%B8%D0%B7%D1%83%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%20%D0%B2%20Python%203" title="LinkedIn" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_vk" href="https://www.addtoany.com/add_to/vk?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Finteractive-data-visualization-in-python-3%2F&amp;linkname=%D0%98%D0%BD%D1%82%D0%B5%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%B2%D0%BD%D0%B0%D1%8F%20%D0%B2%D0%B8%D0%B7%D1%83%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%20%D0%B2%20Python%203" title="VK" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_twitter" href="https://www.addtoany.com/add_to/twitter?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Finteractive-data-visualization-in-python-3%2F&amp;linkname=%D0%98%D0%BD%D1%82%D0%B5%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%B2%D0%BD%D0%B0%D1%8F%20%D0%B2%D0%B8%D0%B7%D1%83%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%20%D0%B2%20Python%203" title="Twitter" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_email" href="https://www.addtoany.com/add_to/email?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Finteractive-data-visualization-in-python-3%2F&amp;linkname=%D0%98%D0%BD%D1%82%D0%B5%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%B2%D0%BD%D0%B0%D1%8F%20%D0%B2%D0%B8%D0%B7%D1%83%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%20%D0%B2%20Python%203" title="Email" rel="nofollow noopener" target="_blank"></a><a class="a2a_dd addtoany_share_save addtoany_share" href="https://www.addtoany.com/share#url=https%3A%2F%2Fpython.ivan-shamaev.ru%2Finteractive-data-visualization-in-python-3%2F&#038;title=%D0%98%D0%BD%D1%82%D0%B5%D1%80%D0%B0%D0%BA%D1%82%D0%B8%D0%B2%D0%BD%D0%B0%D1%8F%20%D0%B2%D0%B8%D0%B7%D1%83%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F%20%D0%B4%D0%B0%D0%BD%D0%BD%D1%8B%D1%85%20%D0%B2%20Python%203" data-a2a-url="https://python.ivan-shamaev.ru/interactive-data-visualization-in-python-3/" data-a2a-title="Интерактивная визуализация данных в Python 3"></a></p><p>Сообщение <a href="https://python.ivan-shamaev.ru/interactive-data-visualization-in-python-3/">Интерактивная визуализация данных в Python 3</a> появились сначала на <a href="https://python.ivan-shamaev.ru">Python 3 | Data Science | Нейронные сети | AI - Искусственный Интеллект</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://python.ivan-shamaev.ru/interactive-data-visualization-in-python-3/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Сравнение Flask vs Django. Когда стоит выбрать Python Flask?</title>
		<link>https://python.ivan-shamaev.ru/comparison-of-flask-vs-django-most-popular-python-platforms/</link>
					<comments>https://python.ivan-shamaev.ru/comparison-of-flask-vs-django-most-popular-python-platforms/#respond</comments>
		
		<dc:creator><![CDATA[Шамаев Иван]]></dc:creator>
		<pubDate>Thu, 05 Mar 2020 21:26:55 +0000</pubDate>
				<category><![CDATA[Введение в Python 3]]></category>
		<category><![CDATA[Django]]></category>
		<category><![CDATA[Django Python]]></category>
		<category><![CDATA[Flask]]></category>
		<category><![CDATA[Flask Python]]></category>
		<category><![CDATA[Flask vs Django]]></category>
		<category><![CDATA[python 3]]></category>
		<guid isPermaLink="false">https://python.ivan-shamaev.ru/?p=652</guid>

					<description><![CDATA[<p>Flask vs Django: как понять, нужен ли вам молоток или ящик для инструментов Если вам интересно, следует ли использовать Flask или Django для своего проекта, эта статья для вас. Обе платформы написаны на Python, поэтому опыт работы с этим языком программирования является ключевым. Согласно исследованию Python для разработчиков 2018 года JetBrains, два самых популярных фрейворка Python &#8212; это Flask и Django. [&#8230;]</p>
<p>Сообщение <a href="https://python.ivan-shamaev.ru/comparison-of-flask-vs-django-most-popular-python-platforms/">Сравнение Flask vs Django. Когда стоит выбрать Python Flask?</a> появились сначала на <a href="https://python.ivan-shamaev.ru">Python 3 | Data Science | Нейронные сети | AI - Искусственный Интеллект</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><a class="a2a_button_telegram" href="https://www.addtoany.com/add_to/telegram?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fcomparison-of-flask-vs-django-most-popular-python-platforms%2F&amp;linkname=%D0%A1%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5%20Flask%20vs%20Django.%20%D0%9A%D0%BE%D0%B3%D0%B4%D0%B0%20%D1%81%D1%82%D0%BE%D0%B8%D1%82%20%D0%B2%D1%8B%D0%B1%D1%80%D0%B0%D1%82%D1%8C%20Python%20Flask%3F" title="Telegram" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_whatsapp" href="https://www.addtoany.com/add_to/whatsapp?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fcomparison-of-flask-vs-django-most-popular-python-platforms%2F&amp;linkname=%D0%A1%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5%20Flask%20vs%20Django.%20%D0%9A%D0%BE%D0%B3%D0%B4%D0%B0%20%D1%81%D1%82%D0%BE%D0%B8%D1%82%20%D0%B2%D1%8B%D0%B1%D1%80%D0%B0%D1%82%D1%8C%20Python%20Flask%3F" title="WhatsApp" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fcomparison-of-flask-vs-django-most-popular-python-platforms%2F&amp;linkname=%D0%A1%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5%20Flask%20vs%20Django.%20%D0%9A%D0%BE%D0%B3%D0%B4%D0%B0%20%D1%81%D1%82%D0%BE%D0%B8%D1%82%20%D0%B2%D1%8B%D0%B1%D1%80%D0%B0%D1%82%D1%8C%20Python%20Flask%3F" title="Facebook" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_linkedin" href="https://www.addtoany.com/add_to/linkedin?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fcomparison-of-flask-vs-django-most-popular-python-platforms%2F&amp;linkname=%D0%A1%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5%20Flask%20vs%20Django.%20%D0%9A%D0%BE%D0%B3%D0%B4%D0%B0%20%D1%81%D1%82%D0%BE%D0%B8%D1%82%20%D0%B2%D1%8B%D0%B1%D1%80%D0%B0%D1%82%D1%8C%20Python%20Flask%3F" title="LinkedIn" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_vk" href="https://www.addtoany.com/add_to/vk?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fcomparison-of-flask-vs-django-most-popular-python-platforms%2F&amp;linkname=%D0%A1%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5%20Flask%20vs%20Django.%20%D0%9A%D0%BE%D0%B3%D0%B4%D0%B0%20%D1%81%D1%82%D0%BE%D0%B8%D1%82%20%D0%B2%D1%8B%D0%B1%D1%80%D0%B0%D1%82%D1%8C%20Python%20Flask%3F" title="VK" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_twitter" href="https://www.addtoany.com/add_to/twitter?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fcomparison-of-flask-vs-django-most-popular-python-platforms%2F&amp;linkname=%D0%A1%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5%20Flask%20vs%20Django.%20%D0%9A%D0%BE%D0%B3%D0%B4%D0%B0%20%D1%81%D1%82%D0%BE%D0%B8%D1%82%20%D0%B2%D1%8B%D0%B1%D1%80%D0%B0%D1%82%D1%8C%20Python%20Flask%3F" title="Twitter" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_email" href="https://www.addtoany.com/add_to/email?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fcomparison-of-flask-vs-django-most-popular-python-platforms%2F&amp;linkname=%D0%A1%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5%20Flask%20vs%20Django.%20%D0%9A%D0%BE%D0%B3%D0%B4%D0%B0%20%D1%81%D1%82%D0%BE%D0%B8%D1%82%20%D0%B2%D1%8B%D0%B1%D1%80%D0%B0%D1%82%D1%8C%20Python%20Flask%3F" title="Email" rel="nofollow noopener" target="_blank"></a><a class="a2a_dd addtoany_share_save addtoany_share" href="https://www.addtoany.com/share#url=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fcomparison-of-flask-vs-django-most-popular-python-platforms%2F&#038;title=%D0%A1%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5%20Flask%20vs%20Django.%20%D0%9A%D0%BE%D0%B3%D0%B4%D0%B0%20%D1%81%D1%82%D0%BE%D0%B8%D1%82%20%D0%B2%D1%8B%D0%B1%D1%80%D0%B0%D1%82%D1%8C%20Python%20Flask%3F" data-a2a-url="https://python.ivan-shamaev.ru/comparison-of-flask-vs-django-most-popular-python-platforms/" data-a2a-title="Сравнение Flask vs Django. Когда стоит выбрать Python Flask?"></a></p><blockquote><p><em><strong>Flask vs Django:</strong> как понять, нужен ли вам молоток или ящик для инструментов</em></p></blockquote>
<p id="820c" class="gr gs dm bk gt b gu gv gw gx gy gz ha hb hc hd he cl" data-selectable-paragraph="">Если вам интересно, следует ли использовать Flask или Django для своего проекта, эта статья для вас. Обе платформы написаны на Python, поэтому опыт работы с этим языком программирования является ключевым. Согласно исследованию <a class="at fw hf hg hh hi" href="https://www.jetbrains.com/research/python-developers-survey-2018/#general-python-usage" target="_blank" rel="noopener nofollow noreferrer">Python для разработчиков 2018</a> года JetBrains, <strong>два самых популярных фрейворка</strong><strong> Python</strong><strong> &#8212; это Flask и Django.</strong> Чтобы помочь Вам сделать осознанный выбор между этими фреймворками, мы обсудим, что такое <strong>Flask</strong> и <strong>Django</strong>, опишем их преимущества и недостатки, а также рассмотрим истории успеха.</p>
<h1 id="67ae" class="hj hk dm bk bj hl do hm dq hn ho hp hq hr hs ht hu" data-selectable-paragraph="">Что такое Django и Flask?</h1>
<p id="2211" class="gr gs dm bk gt b gu hv gw hw gy hx ha hy hc hz he cl" data-selectable-paragraph=""><strong class="gt ia">Django</strong> &#8212; это бесплатная среда разработки веб-приложений Python с открытым исходным кодом, которая следует шаблону <strong>Model-Template-View (MTV)</strong>. Он был создан осенью 2003 года Адрианом Головатым и Саймоном Уиллисоном.</p>
<p class="gr gs dm bk gt b gu hv gw hw gy hx ha hy hc hz he cl" data-selectable-paragraph=""><strong>Django</strong> был создан для упрощения процесса разработки сайта. Основное внимание уделяется повторно используемым компонентам, меньшему количеству кода и быстрой разработке. На него повлияли несколько более ранних фреймворков, в том числе Zope и Plone, и, в свою очередь, они вдохновили множество других фреймворков, которые последовали за ним, включая Pyramid, CherryPy, Bottle и Web2py.</p>
<p id="0543" class="gr gs dm bk gt b gu gv gw gx gy gz ha hb hc hd he cl" data-selectable-paragraph=""><b>Flask </b>&#8212; это микрофреймворк с удивительным началом. Фактически он зародился как первоапрельская шутка. Перед разработкой <strong>Flask</strong> Армин Роначер, создатель Flask, написал два других решения:</p>
<ul>
<li class="gr gs dm bk gt b gu gv gw gx gy gz ha hb hc hd he cl"><strong>Werkzeug (серверная среда)</strong> и</li>
<li class="gr gs dm bk gt b gu gv gw gx gy gz ha hb hc hd he cl"><strong>Jinja2 (библиотека шаблонов)</strong>.</li>
</ul>
<p class="gr gs dm bk gt b gu gv gw gx gy gz ha hb hc hd he cl" data-selectable-paragraph="">Армин подумал, что было бы интересно взять эти два решения и собрать их в zip-файл, поэтому он написал <strong>Denied Framework</strong> (как он называл его прежде, и назвал его Flask). Когда разработчик устанавливает этот Denied Framework, программа установки автоматически разархивирует файл и запускает эти два решения одновременно. Хотите верьте, хотите нет, но Flask получил положительную реакцию.</p>
<h1 id="3955" class="hj hk dm bk bj hl do hm dq hn ho hp hq hr hs ht hu" data-selectable-paragraph="">Основные различия между Django и Flask</h1>
<p id="97b2" class="gr gs dm bk gt b gu hv gw hw gy hx ha hy hc hz he cl" data-selectable-paragraph="">Чтобы лучше понять, какая инфраструктура лучше всего подходит для вашего проекта, давайте рассмотрим основные различия между Django и Flask.</p>
<p id="c9e8" class="gr gs dm bk gt b gu gv gw gx gy gz ha hb hc hd he cl" data-selectable-paragraph=""><strong>Django</strong> предоставляет свой собственный <strong>Django ORM</strong> (объектно-реляционное отображение) и использует модели данных, в то время как <strong>Flask</strong> вообще не имеет моделей данных. Модели данных позволяют разработчикам связывать таблицы базы данных с классами на языке программирования, чтобы они могли работать с моделями так же, как ссылки на базы данных. Почему у Flask нет модели данных? Потому что философия Flask отличается от философии Django.</p>
<blockquote>
<p class="gr gs dm bk gt b gu gv gw gx gy gz ha hb hc hd he cl" data-selectable-paragraph=""><strong>Django связывает все вместе, а Flask более модульный.</strong></p>
</blockquote>
<p id="8e28" class="gr gs dm bk gt b gu gv gw gx gy gz ha hb hc hd he cl" data-selectable-paragraph="">Основное различие между Django и Flask в том, что <strong>Django предоставляет полнофункциональную среду Model-View-Controller.</strong></p>
<p class="gr gs dm bk gt b gu gv gw gx gy gz ha hb hc hd he cl" data-selectable-paragraph=""><strong>Цель Django</strong> &#8212; упростить процесс разработки сайта. Он основан на меньшем количестве кода, повторно используемых компонентах и ​​быстрой разработке.</p>
<p class="gr gs dm bk gt b gu gv gw gx gy gz ha hb hc hd he cl" data-selectable-paragraph=""><strong>Flask</strong>, с другой стороны, представляет собой <strong>микрофреймворк, основанный на концепции &#171;хорошо выполнять одну вещь&#187;</strong>. Он не предоставляет ORM и поставляется только с базовым набором инструментов для веб-разработки.</p>
<p id="7a48" class="gr gs dm bk gt b gu gv gw gx gy gz ha hb hc hd he cl" data-selectable-paragraph="">Приложения для <strong>Flask</strong> в основном представляют собой одностраничные приложения (SPA). Это хороший выбор для небольших и средних сайтов, таких как форумы и личные блоги. <strong>Django</strong> идеально подходит для крупных проектов, таких как сайты электронной коммерции и CMS.</p>
<h1 id="b994" class="hj hk dm bk bj hl do hm dq hn ho hp hq hr hs ht hu" data-selectable-paragraph="">Преимущества и недостатки этих фреймворков</h1>
<p id="c658" class="gr gs dm bk gt b gu hv gw hw gy hx ha hy hc hz he cl" data-selectable-paragraph="">Мы сравним <strong>Django</strong> и <strong>Flask</strong> на основе производительности, пакетов, сообщества, безопасности и вариантов использования, чтобы выяснить, какая платформа лучше всего подходит для вашего проекта.</p>
<h2 id="0f36" class="hj hk dm bk bj hl do hm dq hn ho hp hq hr hs ht hu">Производительность</h2>
<p id="eb09" class="gr gs dm bk gt b gu hv gw hw gy hx ha hy hc hz he cl" data-selectable-paragraph=""><strong>Производительность Flask vs Django</strong> является важным показателем функциональности системы. Если инфраструктура обладает высокой производительностью, это приведет к созданию масштабируемого, быстрого и безопасного приложения. Слабая производительность может привести к масштабным проблемам и архитектурным проблемам.</p>
<p id="68f5" class="gr gs dm bk gt b gu gv gw gx gy gz ha hb hc hd he cl" data-selectable-paragraph="">Если учесть, что производительность <strong>Django vs Flask</strong> имеет хорошие результаты и используется на сайтах с большим трафиком, что является отличным показателем их эффективности.</p>
<h2 id="900d" class="hj hk dm bk bj hl do hm dq hn ho hp hq hr hs ht hu">Пакеты</h2>
<p id="886e" class="gr gs dm bk gt b gu hv gw hw gy hx ha hy hc hz he cl" data-selectable-paragraph=""><strong>Flask</strong> минималистичен и не имеет ограничений, то есть разработчики могут реализовать именно то, что они хотят, используя внешние библиотеки. Это делает <strong>Flask</strong> гибким и расширяемым.</p>
<p id="73ea" class="gr gs dm bk gt b gu gv gw gx gy gz ha hb hc hd he cl" data-selectable-paragraph=""><strong>Django</strong>, с другой стороны, имеет огромное количество встроенных пакетов. Если быть точным, то на сентябрь 2019 года было 4046 пакетов Django. Это означает, что вы, скорее всего, найдете пакет для сборки и запуска своего приложения с меньшими усилиями.</p>
<h2 id="54ee" class="hj hk dm bk bj hl do hm dq hn ho hp hq hr hs ht hu">Сообщество</h2>
<p id="716a" class="gr gs dm bk gt b gu hv gw hw gy hx ha hy hc hz he cl" data-selectable-paragraph="">В случае сравнения <strong>Python Django с Flask</strong>, Django имеет огромное и активное сообщество разработчиков. Если у вас есть какие-либо вопросы, вы можете задать их на различных веб-порталах и форумах, таких как <strong>Stack Overflow</strong>, и, скорее всего, получите ответ. Кроме того, не трудно найти работу Django.</p>
<p id="749c" class="gr gs dm bk gt b gu gv gw gx gy gz ha hb hc hd he cl" data-selectable-paragraph="">Сообщество Flask не такое большое, как сообщество Django. Поэтому, если вам сложно писать на Flask или у вас есть вопросы по Flask, поиск ответов может занять некоторое время.</p>
<h2 id="f89f" class="hj hk dm bk bj hl do hm dq hn ho hp hq hr hs ht hu">Безопасность</h2>
<p id="c9aa" class="gr gs dm bk gt b gu hv gw hw gy hx ha hy hc hz he cl" data-selectable-paragraph="">У Django есть варианты защиты вашего приложения от следующих проблем:</p>
<ul class="">
<li id="def1" class="gr gs dm bk gt b gu gv gw gx gy gz ha hb hc hd he ib ic id" data-selectable-paragraph=""><strong class="gt ia">Межсайтовый скриптинг (XSS). </strong>Атаки XSS позволяют злоумышленнику внедрить клиентские сценарии в браузеры. Шаблоны Django защищают ваш проект от большинства XSS-атак.</li>
<li id="9c49" class="gr gs dm bk gt b gu ie gw if gy ig ha ih hc ii he ib ic id" data-selectable-paragraph=""><strong class="gt ia">Подделка межсайтовых запросов (CSRF). </strong>CSRF-атаки позволяют злоумышленнику выполнять действия, используя учетные данные другого пользователя. Django имеет встроенную защиту от большинства типов CSRF-атак.</li>
<li id="d80f" class="gr gs dm bk gt b gu ie gw if gy ig ha ih hc ii he ib ic id" data-selectable-paragraph=""><strong class="gt ia">SQL-инъекция. </strong>SQL-инъекция &#8212; это атака, при которой злонамеренный пользователь может выполнить произвольный код SQL в базе данных. Наборы запросов Django защищены от внедрения SQL, поскольку запросы строятся с использованием параметризации.</li>
</ul>
<p id="a70f" class="gr gs dm bk gt b gu gv gw gx gy gz ha hb hc hd he cl" data-selectable-paragraph=""><strong>Библиотека Flask-Security</strong> предоставляет почти те же механизмы, что и Django, для предотвращения утечек данных и других веб-атак.</p>
<h1 id="3732" class="hj hk dm bk bj hl do hm dq hn ho hp hq hr hs ht hu">Случаи использования</h1>
<p id="fce3" class="gr gs dm bk gt b gu hv gw hw gy hx ha hy hc hz he cl" data-selectable-paragraph=""><strong>Django</strong> был разработан для быстрой разработки сложных веб-приложений. Он предоставляет разработчикам необходимые инструменты для реализации масштабируемой и поддерживаемой функциональности. С другой стороны, простота Flask позволяет разработчикам быстрее создавать небольшие приложения.</p>
<p id="2ba9" class="gr gs dm bk gt b gu gv gw gx gy gz ha hb hc hd he cl" data-selectable-paragraph="">Давайте рассмотрим лучшие примеры сайтов Django и Flask.</p>
<h2 id="adfe" class="hj hk dm bk bj hl do hm dq hn ho hp hq hr hs ht hu">Какие проекты строятся с Django?</h2>
<p id="053f" class="gr gs dm bk gt b gu hv gw hw gy hx ha hy hc hz he cl" data-selectable-paragraph="">Многие сайты используют Django. Поскольку этот фреймворк легко масштабируется и предоставляет возможность обрабатывать огромное количество данных в режиме реального времени, многие сайты с большим трафиком используют его. Ниже вы можете увидеть <strong>самые популярные проекты Django</strong>:</p>
<p data-selectable-paragraph=""><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/most_popular_Django_projects.png"><img decoding="async" class="aligncenter size-full wp-image-656" src="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/most_popular_Django_projects.png" alt="" width="900" height="680" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/most_popular_Django_projects.png 900w, https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/most_popular_Django_projects-300x227.png 300w, https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/most_popular_Django_projects-768x580.png 768w" sizes="(max-width: 900px) 100vw, 900px" /></a></p>
<h2 id="9774" class="hj hk dm bk bj hl do hm dq hn ho hp hq hr hs ht hu">Какие проекты можно разработать на Django</h2>
<p id="7fa6" class="gr gs dm bk gt b gu hv gw hw gy hx ha hy hc hz he cl" data-selectable-paragraph="">Примеры приложений Django:</p>
<ul class="">
<li id="07f8" class="gr gs dm bk gt b gu gv gw gx gy gz ha hb hc hd he ib ic id" data-selectable-paragraph=""><strong class="gt ia">Population Explorer</strong>, проект SaaS, который предоставляет пользователям доступ к демографическим данным и инструментам анализа на карте. Пользователи могут выбрать целевую область и получить демографические данные о ней, такие как распределение по полу, возрасту, численности населения, плотности населения и росту населения. Мы внедрили платежную систему, чтобы пользователи могли приобретать планы подписки прямо на сайте. Population Explorer содержит огромное количество данных и множество функций, и Django &#8212; это то, что делает все это возможным.</li>
<li id="dfbe" class="gr gs dm bk gt b gu ie gw if gy ig ha ih hc ii he ib ic id" data-selectable-paragraph=""><strong class="gt ia">Possio</strong>, SaaS-платформа, где пользователи могут отслеживать местоположение транспортных средств, а также данные о резком торможении, быстром ускорении, агрессивном вождении и превышении скорости. Поскольку Possio обрабатывает огромные объемы данных в режиме реального времени, Django является отличным решением.</li>
</ul>
<h2 id="f095" class="hj hk dm bk bj hl do hm dq hn ho hp hq hr hs ht hu">Какие типы проектов создаются с помощью Flask?</h2>
<p id="e3ca" class="gr gs dm bk gt b gu hv gw hw gy hx ha hy hc hz he cl" data-selectable-paragraph=""><strong>Flask</strong> &#8212; одна из ведущих платформ Python для веб-разработки. Согласно <a class="at fw hf hg hh hi" href="https://www.jetbrains.com/research/python-developers-survey-2018/" target="_blank" rel="noopener nofollow noreferrer">опросам разработчиков Python от JetBrains</a>, использование Flask среди разработчиков увеличилось с 41% в 2017 году до 47% в 2018 году. Причины, по которым всемирно известные компании, такие как Airbnb и Reddit, используют Flask, многочисленны. Flask дает вам больше контроля над вашим проектом, поскольку вы можете выбирать, какие компоненты использовать и как вы взаимодействуете с ними. Кроме того, вы можете подключить любое расширение, которое вам нужно.</p>
<p id="e00b" class="gr gs dm bk gt b gu gv gw gx gy gz ha hb hc hd he cl" data-selectable-paragraph="">Сайты этих всемирно известных компаний создаются с помощью Flask:</p>
<p data-selectable-paragraph=""><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/world_famous_companies_are_built_with_Flask.png"><img decoding="async" class="aligncenter size-full wp-image-658" src="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/world_famous_companies_are_built_with_Flask.png" alt="" width="900" height="680" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/world_famous_companies_are_built_with_Flask.png 900w, https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/world_famous_companies_are_built_with_Flask-300x227.png 300w, https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/world_famous_companies_are_built_with_Flask-768x580.png 768w" sizes="(max-width: 900px) 100vw, 900px" /></a></p>
<h2 id="e487" class="hj hk dm bk bj hl do hm dq hn ho hp hq hr hs ht hu">Какие проекты можно реализовывать на Flask</h2>
<p id="cdd7" class="gr gs dm bk gt b gu hv gw hw gy hx ha hy hc hz he cl" data-selectable-paragraph="">Один из практических проектов Flask &#8212; <strong class="gt ia">Cybertunity</strong>. Это приложение позволяет коллегам поделиться своими знаниями о кибербезопасности. Cybertunity делит сотрудников на две группы и дает всем сотрудникам опрос, состоящий из 60 вопросов, разделенных по темам. Затем приложение генерирует PDF-файл, показывающий результаты опроса и сводку того, насколько хорошо сотрудники знают темы, термины и концепции кибербезопасности. Это небольшой проект с минимальной функциональностью, поэтому мы использовали Flask.</p>
<h2 id="5281" class="hj hk dm bk bj hl do hm dq hn ho hp hq hr hs ht hu">Что есть что? Hammer vs toolbox или какой фреймворк выбрать</h2>
<p id="73a6" class="gr gs dm bk gt b gu hv gw hw gy hx ha hy hc hz he cl" data-selectable-paragraph="">Давайте подытожим особенности и сильные стороны Django и Flask, чтобы вы могли решить, какие рамки выбрать.</p>
<p data-selectable-paragraph=""><a href="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/particularities_and_strengths_of_Django_and_Flask.png"><img decoding="async" class="aligncenter size-full wp-image-659" src="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/particularities_and_strengths_of_Django_and_Flask.png" alt="" width="1722" height="912" srcset="https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/particularities_and_strengths_of_Django_and_Flask.png 1722w, https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/particularities_and_strengths_of_Django_and_Flask-300x159.png 300w, https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/particularities_and_strengths_of_Django_and_Flask-1024x542.png 1024w, https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/particularities_and_strengths_of_Django_and_Flask-768x407.png 768w, https://python.ivan-shamaev.ru/wp-content/uploads/2020/03/particularities_and_strengths_of_Django_and_Flask-1536x813.png 1536w" sizes="(max-width: 1722px) 100vw, 1722px" /></a></p>
<p id="9019" class="gr gs dm bk gt b gu gv gw gx gy gz ha hb hc hd he cl" data-selectable-paragraph=""><strong class="gt ia">Выберите Django,</strong> если у вас мало времени или у вас ограниченный бюджет. Django &#8212; это идеальное решение для MVP, платформ электронной коммерции, приложений mHealth и правительственных веб-сайтов.</p>
<p id="6a08" class="gr gs dm bk gt b gu gv gw gx gy gz ha hb hc hd he cl" data-selectable-paragraph=""><strong class="gt ia">Выберите Flask,</strong> если у вас небольшой или средний проект, который имеет уникальные требования и требует пользовательских компонентов. Flask особенно хорош для прототипирования.</p>
<p id="cde4" class="gr gs dm bk gt b gu gv gw gx gy gz ha hb hc hd he cl" data-selectable-paragraph="">Учитывая, что Django имеет огромное количество встроенных решений, и Flask часто выбирается для использования соответствующего пакета для решения определенной проблемы, наш вердикт <strong class="gt ia">таков</strong>: <strong class="gt ia">Django &#8212; это набор инструментов, а Flask &#8212; молот.</strong></p>
<p id="024b" class="gr gs dm bk gt b gu gv gw gx gy gz ha hb hc hd he cl" data-selectable-paragraph="">Мы надеемся, что наше руководство по Python Flask vs Django позволило вам лучше понять преимущества и недостатки этих платформ, различия и варианты использования.</p>
<h1>6 причин, по которым Flask — лучший фреймворк для разработки веб-приложений</h1>
<p>Что делает Flask лучше других фреймворков? И каковы причины использования Flask для разработки веб-приложений? Давайте проанализируем этот аспект и углубимся в причины, по которым Flask занимает лидирующие позиции среди фреймворков для веб-приложений.</p>
<h2>Причина 1: Высокая масштабируемость</h2>
<p>В сегодняшней быстро меняющейся среде большинство людей начинают с идеи небольшого веб-приложения, а затем масштабируют ее в соответствии с требованиями. Если вы связаны со стартапом или малым бизнесом, вы хотите разработать свое веб-приложение с помощью хорошо масштабируемой среды. Flask — одна из таких платформ, которая соответствует вашим требованиям. Он может обрабатывать большое количество запросов по мере того, как ваш бизнес расширяется со временем. Например, Pinterest перешел с Django на Flask и обрабатывает миллиарды запросов в день. Причиной масштабируемости Flask является его способность модульности кодовой базы по мере ее роста в течение определенного периода времени.</p>
<h2>Причина 2: Простота использования и гибкость</h2>
<p>Когда вы выбираете среду разработки веб-приложений, вы будете искать ту, которая позволяет настраивать код в соответствии с вашими требованиями. Flask — одна из таких веб-платформ, поэтому она имеет огромную базу пользователей среди технического сообщества. Есть очень мало частей Flask, которые вы не можете изменить или заменить. По сравнению с Django, Flask открыт для изменений и добавляет уровень гибкости в процесс разработки веб-приложений. Кроме того, фреймворк прост в использовании и понимании даже для новичка. Основной причиной простоты Flask является его простая документация.</p>
<h2>Причина 3: больший контроль над кодом</h2>
<p>Flask — одна из наиболее признанных платформ веб-приложений, позволяющая разработчикам полностью контролировать небольшую кодовую базу. Платформа позволяет разработчикам выбирать компоненты, которые они хотят для конкретного приложения. Более того, Flask позволяет разработчикам принимать решения при выборе компонентов для разработки. Он также обеспечивает контроль над различными расширениями, которые вы получаете с фреймворком. Например, предположим, что вы разрабатываете веб-приложение, которое не использует доступ к базе данных или проверку формы. В этом случае разработчики могут исключить это и использовать только соответствующие модули для разработки.</p>
<h2>Причина 4: Поддержка тестирования</h2>
<p>Следующим этапом жизненного цикла разработки программного обеспечения после разработки является тестирование. К сожалению, в большинстве фреймворков веб-приложений вы не найдете опцию тестирования. Итак, вам нужно найти тестовый фреймворк отдельно и выполнить требуемую процедуру. В случае с Flask вы получаете встроенное средство модульного тестирования, которое позволяет протестировать ваше приложение, прежде чем выпускать его в производство. Кроме того, инфраструктура предоставляет такие функции, как встроенный сервер разработки, быстрый отладчик и диспетчеризация запросов. Это помогает упростить процесс тестирования для команды разработчиков. Кроме того, фреймворк очень легкий.</p>
<h2>Причина 5: Облегчает эксперименты</h2>
<p>В современную эпоху вы хотите, чтобы среда веб-приложений экспериментировала с подходом к разработке. Вот где Flask может быть вашим лучшим выбором. Это позволит вам адаптироваться к новым технологиям и использовать гибкие методологии разработки. Более быстрая реализация — одно из уникальных преимуществ фреймворка Flask, и именно поэтому он сделал себе имя в сообществе Python. Если разработчик хочет добавлять в свой продукт все больше и больше функций по мере того, как он становится известным, Flask может стать отличным вариантом. Это позволит разработчикам постоянно улучшать свои продукты с помощью систем быстрой интеграции и поддержки.</p>
<h2>Причина 6: медленная кривая обучения</h2>
<p>Когда разработчики веб-приложений выбирают платформу для своего проекта, они будут думать о кривой обучения, будь она крутой или плоской. Естественно, вы хотите выбрать фреймворк с небольшой кривой обучения, и именно здесь Flask превосходит все другие фреймворки Python. Понимание концепции Flask не является сложной задачей, и именно поэтому разработчики любят его. Даже новичок может выучить Flask за несколько недель, если у него есть базовые знания языка программирования Python. Вот почему этот фреймворк становится все более популярным и популярным, и в ближайшие годы он займет центральное место в разработке веб-приложений.</p>
<h2>Подведение итогов по преимуществам Flask</h2>
<p><strong>Flask</strong> — один из самых популярных микрофреймворков для разработки веб-приложений в последнее время. Фреймворк зарекомендовал себя среди сообщества разработчиков Python и разработчиков веб-приложений по всему миру.</p>
<p><a class="a2a_button_telegram" href="https://www.addtoany.com/add_to/telegram?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fcomparison-of-flask-vs-django-most-popular-python-platforms%2F&amp;linkname=%D0%A1%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5%20Flask%20vs%20Django.%20%D0%9A%D0%BE%D0%B3%D0%B4%D0%B0%20%D1%81%D1%82%D0%BE%D0%B8%D1%82%20%D0%B2%D1%8B%D0%B1%D1%80%D0%B0%D1%82%D1%8C%20Python%20Flask%3F" title="Telegram" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_whatsapp" href="https://www.addtoany.com/add_to/whatsapp?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fcomparison-of-flask-vs-django-most-popular-python-platforms%2F&amp;linkname=%D0%A1%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5%20Flask%20vs%20Django.%20%D0%9A%D0%BE%D0%B3%D0%B4%D0%B0%20%D1%81%D1%82%D0%BE%D0%B8%D1%82%20%D0%B2%D1%8B%D0%B1%D1%80%D0%B0%D1%82%D1%8C%20Python%20Flask%3F" title="WhatsApp" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_facebook" href="https://www.addtoany.com/add_to/facebook?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fcomparison-of-flask-vs-django-most-popular-python-platforms%2F&amp;linkname=%D0%A1%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5%20Flask%20vs%20Django.%20%D0%9A%D0%BE%D0%B3%D0%B4%D0%B0%20%D1%81%D1%82%D0%BE%D0%B8%D1%82%20%D0%B2%D1%8B%D0%B1%D1%80%D0%B0%D1%82%D1%8C%20Python%20Flask%3F" title="Facebook" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_linkedin" href="https://www.addtoany.com/add_to/linkedin?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fcomparison-of-flask-vs-django-most-popular-python-platforms%2F&amp;linkname=%D0%A1%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5%20Flask%20vs%20Django.%20%D0%9A%D0%BE%D0%B3%D0%B4%D0%B0%20%D1%81%D1%82%D0%BE%D0%B8%D1%82%20%D0%B2%D1%8B%D0%B1%D1%80%D0%B0%D1%82%D1%8C%20Python%20Flask%3F" title="LinkedIn" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_vk" href="https://www.addtoany.com/add_to/vk?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fcomparison-of-flask-vs-django-most-popular-python-platforms%2F&amp;linkname=%D0%A1%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5%20Flask%20vs%20Django.%20%D0%9A%D0%BE%D0%B3%D0%B4%D0%B0%20%D1%81%D1%82%D0%BE%D0%B8%D1%82%20%D0%B2%D1%8B%D0%B1%D1%80%D0%B0%D1%82%D1%8C%20Python%20Flask%3F" title="VK" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_twitter" href="https://www.addtoany.com/add_to/twitter?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fcomparison-of-flask-vs-django-most-popular-python-platforms%2F&amp;linkname=%D0%A1%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5%20Flask%20vs%20Django.%20%D0%9A%D0%BE%D0%B3%D0%B4%D0%B0%20%D1%81%D1%82%D0%BE%D0%B8%D1%82%20%D0%B2%D1%8B%D0%B1%D1%80%D0%B0%D1%82%D1%8C%20Python%20Flask%3F" title="Twitter" rel="nofollow noopener" target="_blank"></a><a class="a2a_button_email" href="https://www.addtoany.com/add_to/email?linkurl=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fcomparison-of-flask-vs-django-most-popular-python-platforms%2F&amp;linkname=%D0%A1%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5%20Flask%20vs%20Django.%20%D0%9A%D0%BE%D0%B3%D0%B4%D0%B0%20%D1%81%D1%82%D0%BE%D0%B8%D1%82%20%D0%B2%D1%8B%D0%B1%D1%80%D0%B0%D1%82%D1%8C%20Python%20Flask%3F" title="Email" rel="nofollow noopener" target="_blank"></a><a class="a2a_dd addtoany_share_save addtoany_share" href="https://www.addtoany.com/share#url=https%3A%2F%2Fpython.ivan-shamaev.ru%2Fcomparison-of-flask-vs-django-most-popular-python-platforms%2F&#038;title=%D0%A1%D1%80%D0%B0%D0%B2%D0%BD%D0%B5%D0%BD%D0%B8%D0%B5%20Flask%20vs%20Django.%20%D0%9A%D0%BE%D0%B3%D0%B4%D0%B0%20%D1%81%D1%82%D0%BE%D0%B8%D1%82%20%D0%B2%D1%8B%D0%B1%D1%80%D0%B0%D1%82%D1%8C%20Python%20Flask%3F" data-a2a-url="https://python.ivan-shamaev.ru/comparison-of-flask-vs-django-most-popular-python-platforms/" data-a2a-title="Сравнение Flask vs Django. Когда стоит выбрать Python Flask?"></a></p><p>Сообщение <a href="https://python.ivan-shamaev.ru/comparison-of-flask-vs-django-most-popular-python-platforms/">Сравнение Flask vs Django. Когда стоит выбрать Python Flask?</a> появились сначала на <a href="https://python.ivan-shamaev.ru">Python 3 | Data Science | Нейронные сети | AI - Искусственный Интеллект</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://python.ivan-shamaev.ru/comparison-of-flask-vs-django-most-popular-python-platforms/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
