<?xml version="1.0" encoding="utf-8" ?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:tt="http://teletype.in/" xmlns:opensearch="http://a9.com/-/spec/opensearch/1.1/"><title>aboutpython</title><author><name>aboutpython</name></author><id>https://teletype.in/atom/aboutpython</id><link rel="self" type="application/atom+xml" href="https://teletype.in/atom/aboutpython?offset=0"></link><link rel="alternate" type="text/html" href="https://teletype.in/@aboutpython?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=aboutpython"></link><link rel="next" type="application/rss+xml" href="https://teletype.in/atom/aboutpython?offset=10"></link><link rel="search" type="application/opensearchdescription+xml" title="Teletype" href="https://teletype.in/opensearch.xml"></link><updated>2026-04-08T06:57:13.225Z</updated><entry><id>aboutpython:Uv-xrvIw</id><link rel="alternate" type="text/html" href="https://teletype.in/@aboutpython/Uv-xrvIw?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=aboutpython"></link><title>datetime - даты и время</title><published>2020-02-05T12:45:23.574Z</published><updated>2020-02-05T12:45:23.574Z</updated><summary type="html">&lt;img src=&quot;https://teletype.in/files/a8/ca/a8ca8555-f241-4be1-a756-af1a3f02f32e.png&quot;&gt;К данному моменту мы изучили основные типы данных представленные в языке Python. Однако есть еще один тип данных, который довольно часто используется - это тип datetime, который представляет собой дату и время. У нас есть тип datetime, который представляет дату и время, как объединенные, есть тип date, который представляет дату, и есть тип time, который представляет время и тип timedelta, который представляет разницу между двумя датами. Давайте в кратце глянем, как представлен их программный интерфейс, и как ими пользоваться:</summary><content type="html">
  &lt;p&gt;К данному моменту мы изучили основные типы данных представленные в языке &lt;strong&gt;Python&lt;/strong&gt;. Однако есть еще один тип данных, который довольно часто используется - это тип &lt;strong&gt;datetime&lt;/strong&gt;, который представляет собой дату и время. У нас есть тип &lt;strong&gt;datetime&lt;/strong&gt;, который представляет дату и время, как объединенные, есть тип &lt;strong&gt;date&lt;/strong&gt;, который представляет дату, и есть тип &lt;strong&gt;time&lt;/strong&gt;, который представляет время и тип &lt;strong&gt;timedelta&lt;/strong&gt;, который представляет разницу между двумя датами. Давайте в кратце глянем, как представлен их программный интерфейс, и как ими пользоваться:&lt;/p&gt;
  &lt;figure class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/a8/ca/a8ca8555-f241-4be1-a756-af1a3f02f32e.png&quot; width=&quot;547&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Так же полезная вещь - взять сегодняшнюю дату, чтобы это сделать нужно написать:&lt;/p&gt;
  &lt;pre&gt;print(date.today())&lt;/pre&gt;
  &lt;p&gt;Тип &lt;strong&gt;datetime &lt;/strong&gt;объединяет типы &lt;strong&gt;date &lt;/strong&gt;и &lt;strong&gt;time&lt;/strong&gt;. То есть в конструктор &lt;strong&gt;datetime &lt;/strong&gt;мы можем прописать год, месяц, день и так же время:&lt;/p&gt;
  &lt;figure class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/8b/91/8b91904d-612d-477b-b2fb-cd2b86970dea.png&quot; width=&quot;307&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Чтобы выдернуть из &lt;strong&gt;datetime&lt;/strong&gt;, например месяц и час, то мы используем такой код:&lt;/p&gt;
  &lt;pre&gt;print(dt.date().month)
print(dt.time().hour)&lt;/pre&gt;
  &lt;p&gt;Чтобы вывести текущий &lt;strong&gt;datetime&lt;/strong&gt;:&lt;/p&gt;
  &lt;pre&gt;now = datetime.now()
print(now)&lt;/pre&gt;
  &lt;p&gt;&lt;/p&gt;
  &lt;p&gt;Посмотрим на &lt;strong&gt;timedelta&lt;/strong&gt;, с помощью которой мы можем смотреть разницу между датами:&lt;/p&gt;
  &lt;figure class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/88/53/88533ee4-de61-4a65-9cb5-0804bab83e42.png&quot; width=&quot;374&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;В первом сравнении у нас разница 1 день, 1 час и 5 минут. Во втором случае -2 дня, 22 часа и 55 минут.&lt;/p&gt;
  &lt;p&gt;Так же мы можем вычислить разницу во времени между, допустим, днем нашего рождения и сегодняшним днем:&lt;/p&gt;
  &lt;figure class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/14/cc/14cc9ae0-de49-4573-805b-2018e69531e5.png&quot; width=&quot;250&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Соответственно, вот вывод о том, что &lt;strong&gt;delta &lt;/strong&gt;это класс &lt;strong&gt;datetime.timedelta&lt;/strong&gt;, и нам 120 лет.&lt;/p&gt;
  &lt;p&gt;Чтобы ознакомиться более подробно с датами и временем советую перейти &lt;a href=&quot;https://all-python.ru/osnovy/modul-datetime.html#datetime&quot; target=&quot;_blank&quot;&gt;сюда&lt;/a&gt;.&lt;/p&gt;

</content></entry><entry><id>aboutpython:HJ_nexmG8</id><link rel="alternate" type="text/html" href="https://teletype.in/@aboutpython/HJ_nexmG8?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=aboutpython"></link><title>Реализуем Stack</title><published>2020-02-01T12:36:00.401Z</published><updated>2020-02-01T12:36:00.401Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://teletype.in/files/14/06/14064f5e-2624-4ee3-9015-13cd81780922.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://teletype.in/files/14/06/14064f5e-2624-4ee3-9015-13cd81780922.png&quot;&gt;Давайте сегодня разберемся, как можно строить итерируемые объекты. Задевали раньше тему Stack и очереди, попробуем сами сделать Stack. Будем использовать в качестве структуры данных обычный list, то есть список.</summary><content type="html">
  &lt;p&gt;Давайте сегодня разберемся, как можно строить итерируемые объекты. Задевали раньше тему &lt;strong&gt;Stack &lt;/strong&gt;и очереди, попробуем сами сделать &lt;strong&gt;Stack&lt;/strong&gt;. Будем использовать в качестве структуры данных обычный &lt;strong&gt;list&lt;/strong&gt;, то есть список.&lt;/p&gt;
  &lt;p&gt;Поехали:&lt;/p&gt;
  &lt;figure class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/14/06/14064f5e-2624-4ee3-9015-13cd81780922.png&quot; width=&quot;996&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Теперь проверим наш &lt;strong&gt;stack&lt;/strong&gt;:&lt;/p&gt;
  &lt;figure class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/ee/83/ee8344a1-59d1-4016-b828-083b447e6412.png&quot; width=&quot;350&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Если вчитаться в комментарии, то станет понятно, что в итоге у нас произошло. А произошло то, что мы создали некий список из 3 чисел, вызвали &lt;strong&gt;pop&lt;/strong&gt;, который вернулнам 3 и стер его из списка. Затем мы проверили, какое число у нас последнее с помощью &lt;strong&gt;peek&lt;/strong&gt;, оказалось 2 - все верно. Дальше  проверили, сколько в листе осталось объектов - тоже 2. Добавили в конец списка 4,5,6 и прошлись циклом по &lt;strong&gt;stack&lt;/strong&gt;, который вывел нам все объекты начиная с конца. И именно с конца &lt;strong&gt;stack &lt;/strong&gt;выводит объекты.&lt;/p&gt;
  &lt;p&gt;Вот простой пример, как можно реализовывать свои классы, по инстанциям которых внешнйи код может может идти в цикле. Для этого нужно реализовать два метода - &lt;em&gt;__iter__&lt;/em&gt; &amp;amp; &lt;em&gt;__next__&lt;/em&gt;. Из &lt;em&gt;__iter__&lt;/em&gt; возвращаем &lt;strong&gt;self &lt;/strong&gt;и в нем устанавливаем, как правило счетчик в нужную нам позицию, в нашем случае мы указываем на последний элемент. А в &lt;em&gt;__next__&lt;/em&gt; уже декрементеруем или инкрементируем счетчик, как нам надо, вбрасываем исключение, которое обрабатывается особым образом - оно просто останавливает итерацию, оно не убивает программу. А дальше один ща одним возвращаем элементы подправляя индекс как надо.&lt;/p&gt;

</content></entry><entry><id>aboutpython:rJBmWwpZL</id><link rel="alternate" type="text/html" href="https://teletype.in/@aboutpython/rJBmWwpZL?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=aboutpython"></link><title>Отладка</title><published>2020-01-28T07:22:04.702Z</published><updated>2020-01-28T07:22:04.702Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://teletype.in/files/af/d9/afd94994-012a-40f0-aa06-fc2f7273fa27.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://teletype.in/files/af/d9/afd94994-012a-40f0-aa06-fc2f7273fa27.png&quot;&gt;Программистам не всегда удается написать программу с первого раза таким образом, чтобы в ней не было ошибок. Программисты постоянно борятся с ошибками. Чтобы отловить эти ошибки в больших программах мы используем процесс, который называется отладка. В наших маленьких скриптах для того, чтобы посмотреть на значения переменных мы просто вызывали функцию print, передавали ей значение и смотрели, что они выводят на консоль. И если у нас были бы ошибки, мы бы вызывали функцию print таким же образом, для того чтобы найти где у нас ошибка, какие переменные находятся не в том состоянии в котором нам нужно. И уже исходя из этого, из результатов вывода принимать какие-то решения и исправлять код. Продемонстрирую элементы отладки и отладочный...</summary><content type="html">
  &lt;p&gt;Программистам не всегда удается написать программу с первого раза таким образом, чтобы в ней не было ошибок. Программисты постоянно борятся с ошибками. Чтобы отловить эти ошибки в больших программах мы используем процесс, который называется отладка. В наших маленьких скриптах для того, чтобы посмотреть на значения переменных мы просто вызывали функцию print, передавали ей значение и смотрели, что они выводят на консоль. И если у нас были бы ошибки, мы бы вызывали функцию print таким же образом, для того чтобы найти где у нас ошибка, какие переменные находятся не в том состоянии в котором нам нужно. И уже исходя из этого, из результатов вывода принимать какие-то решения и исправлять код. Продемонстрирую элементы отладки и отладочный процесс в Jupyter Notebook.&lt;/p&gt;
  &lt;p&gt;Отладочный модуль у нас находится в модуле, который называется pdb.&lt;/p&gt;
  &lt;figure class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/af/d9/afd94994-012a-40f0-aa06-fc2f7273fa27.png&quot; width=&quot;664&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Тут мы дошли до точки остановы, и теперь мы можем опрашивать состояние нашей программы. Если мы введем Х, то получим 1, то есть отладчик может отвечать нам на запросы.&lt;/p&gt;
  &lt;figure class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/30/43/30439a3e-0127-461f-ad77-38c5c7aa22be.png&quot; width=&quot;649&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Основные команды, которые стоит выделить это команда &amp;quot;&lt;strong&gt;c&lt;/strong&gt;&amp;quot; (continue), дает возможность выполнить скрипт от одной точки остановы до другой. Команда &amp;quot;&lt;strong&gt;n&lt;/strong&gt;&amp;quot; (next) исполнит инструкцию всего лишь одну, но если есть подвызовы, то есть вызов функции какой-нибудь, то с помощью этой команды мы зайдем внутрь этой функции. Команда &amp;quot;&lt;strong&gt;s&lt;/strong&gt;&amp;quot; (step) переходит так же на следующую инструкцию, однако эта команда если попадает на вызов функции, то она не попадет внутрь этой функции, функция просто будет исполнена. И команда &amp;quot;&lt;strong&gt;q&lt;/strong&gt;&amp;quot; (quit) просто останавливает отладчик.&lt;/p&gt;
  &lt;figure class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/9b/cc/9bcc0d16-58aa-4a70-a241-783542cde9d1.png&quot; width=&quot;708&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Сейчас мы переместились к следующей точке остановы, где определен &lt;strong&gt;z &lt;/strong&gt;и к &lt;strong&gt;x&lt;/strong&gt; прибавляется 1. А чтобы оставновить дебагер мы вводим &lt;strong&gt;q&lt;/strong&gt;.&lt;/p&gt;
  &lt;figure class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/fd/df/fddfbecf-8b8a-4d90-a075-6a87241bcae4.png&quot; width=&quot;635&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;На самом деле команд гораздо больше, и про них можно почитать в документации.&lt;/p&gt;

</content></entry><entry><id>aboutpython:H1lLALHbI</id><link rel="alternate" type="text/html" href="https://teletype.in/@aboutpython/H1lLALHbI?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=aboutpython"></link><title>Еще раз о __name__ и __main__</title><published>2020-01-22T05:31:51.961Z</published><updated>2020-01-22T05:39:18.976Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://teletype.in/files/9f/8a/9f8a6ee3-9ef0-4790-b3de-3e32d442b859.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://teletype.in/files/51/bb/51bbe8b9-084d-4b69-bb4f-e37631c4878d.png&quot;&gt;Хотелось бы еще раз обратить внимание на использование специальных символов с двумя подчеркиваниями __name__ и __main__.</summary><content type="html">
  &lt;p&gt;Хотелось бы еще раз обратить внимание на использование специальных символов с двумя подчеркиваниями &lt;strong&gt;__name__&lt;/strong&gt; и &lt;strong&gt;__main__&lt;/strong&gt;.&lt;/p&gt;
  &lt;p&gt;Давайте напишем два простых скрипта.&lt;/p&gt;
  &lt;figure class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/51/bb/51bbe8b9-084d-4b69-bb4f-e37631c4878d.png&quot; width=&quot;488&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Что вообще с этим скриптом? Если этот скрипт будет выполнен через сам Python, то есть через CMD, то интерпритатор посмотрит на &lt;strong&gt;__name__&lt;/strong&gt; и он будет равен &lt;strong&gt;__main__&lt;/strong&gt;. И вывод будет &lt;em&gt;&amp;#x27;call a converting func that you want&amp;#x27;&lt;/em&gt; вот такой. else ветка будет работать тогда, когда наш скрипт был не выполнен через Python напрямую, а был заимпортирован через ключевое слово &lt;strong&gt;import&lt;/strong&gt;.&lt;/p&gt;
  &lt;p&gt;Создадим еще один файлик, он будет вызывать наш конвертер:&lt;/p&gt;
  &lt;pre&gt;import converter

print(converter.to_miles(10))&lt;/pre&gt;
  &lt;p&gt;Теперь находясь в Anaconda Prompt мы можем проверить, что будет, если мы напрямую запустим наш конвертер и через скрипт выше:&lt;/p&gt;
  &lt;figure class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/9f/8a/9f8a6ee3-9ef0-4790-b3de-3e32d442b859.png&quot; width=&quot;975&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Короче говоря &lt;em&gt;if __name__ == &amp;#x27;__main__&amp;#x27;&lt;/em&gt; обрабатывает два случая, когда скрипт был запущен напрямую и когда скрипт был импортирован. В обоих случаях мы можем хотеть делать что-то разное и как раз это те блоки кода, которые потребуются нам, чтобы предпринять что-то в том или ином случае.&lt;/p&gt;

</content></entry><entry><id>aboutpython:BJLJA6AxL</id><link rel="alternate" type="text/html" href="https://teletype.in/@aboutpython/BJLJA6AxL?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=aboutpython"></link><title>Модули и пакеты</title><published>2020-01-17T06:02:05.521Z</published><updated>2020-01-17T06:05:43.260Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://teletype.in/files/f7/78/f778c1ed-575f-4066-b500-5fb6666a8856.jpeg"></media:thumbnail><summary type="html">&lt;img src=&quot;https://teletype.in/files/f7/78/f778c1ed-575f-4066-b500-5fb6666a8856.jpeg&quot;&gt;В Python можно создавать не только модули, но и пакеты.</summary><content type="html">
  &lt;figure class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/f7/78/f778c1ed-575f-4066-b500-5fb6666a8856.jpeg&quot; width=&quot;1280&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;В Python можно создавать не только &lt;strong&gt;модули&lt;/strong&gt;, но и &lt;strong&gt;пакеты&lt;/strong&gt;.&lt;/p&gt;
  &lt;p&gt;Что такое &lt;strong&gt;модуль &lt;/strong&gt;- по сути дела модуль это скрипт с расширением &lt;strong&gt;&lt;em&gt;.py&lt;/em&gt;&lt;/strong&gt;, который может быть использован другими скриптами с расширением &lt;strong&gt;&lt;em&gt;.py&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;
  &lt;p&gt;А &lt;strong&gt;пакет &lt;/strong&gt;- это объединенный набор модулей.&lt;/p&gt;
  &lt;p&gt;По большому счету это вся разница между модулем и пакетами. То есть пакеты существуют для того, чтобы логически объединять модули.&lt;/p&gt;
  &lt;p&gt;На самом деле с пакетами мы очень много уже работали, например, fizz_buzz и fizz_buzz_tests. Они у нас лежали в одном каталоге, и это два модуля, которые взаимодействуют между собой.&lt;/p&gt;
  &lt;p&gt;Давайте попробуем создать пакет со структурой каталогов.&lt;/p&gt;
  &lt;p&gt;Мы создали два скрипта:&lt;/p&gt;
  &lt;figure class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/1f/d4/1fd445c7-154f-443f-97c6-474d36589288.png&quot; width=&quot;424&quot; /&gt;
  &lt;/figure&gt;
  &lt;figure class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/a0/21/a02172ba-8e2f-4e15-a8e0-6d24c016fc8b.png&quot; width=&quot;418&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Чтобы пакеты воспринимались, как пакеты нужно так же создать файлы, которые называются &lt;strong&gt;&lt;em&gt;__init__.py &lt;/em&gt;&lt;/strong&gt;в каждом подкаталоге. Просто создаем текстовый файл и меняем ему название и расширение на это. Теперь импортируем пакет, назовем его &lt;strong&gt;&lt;em&gt;package_test&lt;/em&gt;&lt;/strong&gt; и сохраним рядом с папкой MainPackage.&lt;/p&gt;
  &lt;figure class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/bc/e9/bce96982-e13e-461f-8ac9-a38ae876ca86.png&quot; width=&quot;443&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Теперь вызовем &lt;strong&gt;&lt;em&gt;package_test&lt;/em&gt;&lt;/strong&gt;:&lt;/p&gt;
  &lt;figure class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/fd/36/fd36160b-e369-488b-91b6-0b0a4d788c36.png&quot; width=&quot;978&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Как видим - все отлично отработало.&lt;/p&gt;
  &lt;p&gt;Мы можем сделать псевдоним, то есть, если мы импортируем какой то скрипт, но хотим обращаться к нему не по его имени, то можем придумть ему другое имя через оператор &lt;strong&gt;as&lt;/strong&gt;:&lt;/p&gt;
  &lt;figure class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/5f/fb/5ffb268b-aada-4f80-9ac1-e1dd17d24a8b.png&quot; width=&quot;431&quot; /&gt;
  &lt;/figure&gt;

</content></entry><entry><id>aboutpython:S1ArQ7jlI</id><link rel="alternate" type="text/html" href="https://teletype.in/@aboutpython/S1ArQ7jlI?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=aboutpython"></link><title>PyPi и PiP</title><published>2020-01-14T11:17:26.070Z</published><updated>2020-01-14T11:17:26.070Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://teletype.in/files/cf/7b/cf7b97cb-cfc8-4375-9ecf-f42a6fa3b888.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://teletype.in/files/cf/7b/cf7b97cb-cfc8-4375-9ecf-f42a6fa3b888.png&quot;&gt;До сего момента мы использовали встроенные в Python библиотеки, то есть библиотеки, которыми можно пользоваться сразу, при этом ничего ниоткуда не скачивая. Однако, существует огромное количество задач, с нашей точки зрения, с точки зрения человека - бесконечное количество задач, и под все эти задачи библиотеки не встраивают в Python.</summary><content type="html">
  &lt;p&gt;До сего момента мы использовали встроенные в &lt;strong&gt;Python &lt;/strong&gt;библиотеки, то есть библиотеки, которыми можно пользоваться сразу, при этом ничего ниоткуда не скачивая. Однако, существует огромное количество задач, с нашей точки зрения, с точки зрения человека - бесконечное количество задач, и под все эти задачи библиотеки не встраивают в &lt;strong&gt;Python&lt;/strong&gt;.&lt;/p&gt;
  &lt;ul&gt;
    &lt;li&gt;Если мы хотим поискать библиотеку вне встроенного пакета нашего дистрибутива, то для этого можно воспользоваться открытым открытым репозиторием библиотек или пакетов, который называется &lt;strong&gt;PyPi&lt;/strong&gt;.&lt;/li&gt;
    &lt;li&gt;Существует так же &lt;strong&gt;Pip &lt;/strong&gt;- инсталлятор , который позволяет устанавливать любую библиотеку или пакета из этого &lt;strong&gt;PyPi&lt;/strong&gt;. Все, что нам нужно - знать имя пакета, чтобы его установить.&lt;/li&gt;
  &lt;/ul&gt;
  &lt;p&gt;Давайте посмотрим, как это сделать.&lt;/p&gt;
  &lt;p&gt;Поискать пакеты можно напрямую на сайте &lt;a href=&quot;https://pypi.org/&quot; target=&quot;_blank&quot;&gt;&lt;strong&gt;PyPi.org&lt;/strong&gt;&lt;/a&gt;, здесь можно напрямую пробить какое либо наименование или описание пакета, через него будет происходить поиск:&lt;/p&gt;
  &lt;figure class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/cf/7b/cf7b97cb-cfc8-4375-9ecf-f42a6fa3b888.png&quot; width=&quot;1900&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Или можем пройти в&lt;strong&gt; &lt;a href=&quot;https://pypi.org/search/&quot; target=&quot;_blank&quot;&gt;browse projects&lt;/a&gt;&lt;/strong&gt; и использовать здесь фильтры ну и так далее. Короче говоря, все пакеты, что мы найдем на &lt;strong&gt;PyPi &lt;/strong&gt;мы можем установить с помощью &lt;strong&gt;PiP&lt;/strong&gt;.&lt;/p&gt;
  &lt;p&gt;&lt;/p&gt;
  &lt;p&gt;Попробуем установить пакет, который называется &lt;strong&gt;ProgressBar&lt;/strong&gt;, который позволяет пускать текстовый прогресс бар в командной строке. Для этого я выполню команду:&lt;/p&gt;
  &lt;pre&gt;pip install progressbar&lt;/pre&gt;
  &lt;figure class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/44/af/44af30bb-fb9a-4404-b516-88b7d1e92576.png&quot; width=&quot;978&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Как видно - у нас прошла загрузка данного пакета и он успешно установился.&lt;/p&gt;
  &lt;p&gt;Воспользуемся нашим новым пакетом:&lt;/p&gt;
  &lt;pre&gt;from progressbar import ProgressBar
import time

bar = ProgressBar(maxval=10)
bar.start()

for i in range(1, 11):
    bar.update(i)
    time.sleep(1)

bar.finish()&lt;/pre&gt;
  &lt;figure class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/c6/1b/c61b4cd6-aaea-40db-bb5d-8dbd601d5429.png&quot; width=&quot;976&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;У себя в консоли вы сможете увидеть исполнение.&lt;/p&gt;
  &lt;p&gt;Вот таким образом  с помощью инсталятора &lt;strong&gt;PiP &lt;/strong&gt;мы можем установить любой пакет, а затем его использовать так, как нам нужно.&lt;/p&gt;

</content></entry><entry><id>aboutpython:SyJv2KEeL</id><link rel="alternate" type="text/html" href="https://teletype.in/@aboutpython/SyJv2KEeL?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=aboutpython"></link><title>Магические методы</title><published>2020-01-09T11:19:51.374Z</published><updated>2020-01-09T11:25:01.829Z</updated><summary type="html">&lt;img src=&quot;https://teletype.in/files/ce/f3/cef3ebaf-510d-4e54-bf8b-becc48b157be.png&quot;&gt;В начале 2020 года начнем с темы магических методов или Dunder методы. С помощью этих магических методов мы можем переопределять кое-какое поведение.</summary><content type="html">
  &lt;figure class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/ce/f3/cef3ebaf-510d-4e54-bf8b-becc48b157be.png&quot; width=&quot;400&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;В начале 2020 года начнем с темы магических методов или &lt;strong&gt;Dunder &lt;/strong&gt;методы. С помощью этих магических методов мы можем переопределять кое-какое поведение.&lt;/p&gt;
  &lt;p&gt;Давайте сразу приступим к примерам:&lt;/p&gt;
  &lt;figure class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/7f/4f/7f4fc06f-67d6-40b7-910d-8cf228fbf514.png&quot; width=&quot;239&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;У нас есть некая точка (&lt;em&gt;Point&lt;/em&gt;), которая имеет координаты &lt;strong&gt;х &lt;/strong&gt;и &lt;strong&gt;у&lt;/strong&gt;. И вот в принципе &lt;em&gt;__init__&lt;/em&gt; это один из &lt;strong&gt;Dunder &lt;/strong&gt;методов. Но он специализированный и предназначается для конструирования класса. Если мы создадим сначала &lt;em&gt;Point&lt;/em&gt; и выведем его через &lt;strong&gt;print&lt;/strong&gt;, то получим вот такой вывод:&lt;/p&gt;
  &lt;figure class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/59/28/59280000-af66-4141-b608-2e7ee894920f.png&quot; width=&quot;358&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;А что, если мы хотим получить более красивый вывод, а не такую непонятную штуку? Мы можем переопределить &lt;strong&gt;Dunder &lt;/strong&gt;метод &lt;em&gt;__str__&lt;/em&gt;, который определяет строковое представление экземпляра класса:&lt;/p&gt;
  &lt;figure class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/83/0f/830f0c54-4baf-49ce-a4b8-6abfd61150cf.png&quot; width=&quot;365&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Вуаля, у нас получился осмысленный ответ благодаря переопределнию &lt;em&gt;__str__&lt;/em&gt;.&lt;/p&gt;
  &lt;p&gt;Попробуем создать новый класс:&lt;/p&gt;
  &lt;figure class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/01/a5/01a5fac1-9e0f-4ae3-95b5-f7f75995d948.png&quot; width=&quot;378&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Мы переназначили &lt;em&gt;__len__, __str__ и __del__&lt;/em&gt;, а теперь посмотрим, как они вызываются, и что нам в итоге выведут, то ли, что мы хотели?&lt;/p&gt;
  &lt;figure class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/23/f6/23f658a4-33ee-448b-8e05-155fe1b81b7f.png&quot; width=&quot;241&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Вот, мы получили то, что хотели.&lt;/p&gt;
  &lt;p&gt;В итоге, если мы хотим переопределить поведение определенных функций, то мы можем переопределить их с помощью такого синтаксиса. Просто используя знакомый нам синтаксис, который мы видели уже неоднократно :) На самом деле этих методов еще больше, и все их не охватить, поэтому можете изучить их в документакции по &lt;strong&gt;Python&lt;/strong&gt;.&lt;/p&gt;

</content></entry><entry><id>aboutpython:Sy-BvMz1U</id><link rel="alternate" type="text/html" href="https://teletype.in/@aboutpython/Sy-BvMz1U?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=aboutpython"></link><title>Абстрактный класс и модуль ABC</title><published>2019-12-26T11:19:20.809Z</published><updated>2019-12-26T11:21:14.245Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://teletype.in/files/de/84/de84856c-a553-4c59-8f13-b3c4ee1e503c.png"></media:thumbnail><summary type="html">&lt;img src=&quot;https://teletype.in/files/de/84/de84856c-a553-4c59-8f13-b3c4ee1e503c.png&quot;&gt;Сегодня мы еще раз затронем тему абстрактных классов. В прошлый раз, чтобы создать абстрактный класс от которого будут наследоваться другие классы и которые будут обязаны переопределять методы определенные в абстрактном классе мы использовали обычный класс и для того, чтобы запретить вызов методов в таком классе мы возбуждали ошибки с помощью ключевого слова raise. Но у нас есть и другая возможность объявлять абстрактные классы. Этот способ несколько более красивый и продвинутый, он операется на специальный модуль и декоратор, который предназначен для того, чтобы определять абстрактные классы. Этот модуль называется ABC, что означает - Abstract Base Class. Посмотрим, как мы можем им воспользоваться:</summary><content type="html">
  &lt;figure class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/de/84/de84856c-a553-4c59-8f13-b3c4ee1e503c.png&quot; width=&quot;1280&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Сегодня мы еще раз затронем тему абстрактных классов. В прошлый раз, чтобы создать абстрактный класс от которого будут наследоваться другие классы и которые будут обязаны переопределять методы определенные в абстрактном классе мы использовали обычный класс и для того, чтобы запретить вызов методов в таком классе мы возбуждали ошибки с помощью ключевого слова &lt;strong&gt;raise&lt;/strong&gt;. Но у нас есть и другая возможность объявлять абстрактные классы. Этот способ несколько более красивый и продвинутый, он операется на специальный модуль и декоратор, который предназначен для того, чтобы определять абстрактные классы. Этот модуль называется &lt;strong&gt;ABC&lt;/strong&gt;, что означает - &lt;strong&gt;Abstract Base Class&lt;/strong&gt;. Посмотрим, как мы можем им воспользоваться:&lt;/p&gt;
  &lt;figure class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/63/1b/631bfeac-5452-41a2-b7b6-ac2353b165c3.png&quot; width=&quot;584&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Создадим новый класс, который будет наследовать наш абстрактный класс:&lt;/p&gt;
  &lt;figure class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/34/a4/34a46e9b-c069-4994-9d80-9af7027b023f.png&quot; width=&quot;623&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Для того, чтобы продемонстрировать то, что мы не можем создать инстанцию класса Triangle, который наследуется от абстрактного класса не переопределяя абсолютно все абстрактные методы мы закомментируем периметр и вот, что сделаем дальше:&lt;/p&gt;
  &lt;figure class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/e1/49/e149b1ad-2bb5-44fc-9de2-1523c2e61f0d.png&quot; width=&quot;697&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Мы получили TypeError, потому что нельзя прописывать класс, который наследуется от абстрактного класса не переопределив все абстрактные методы. Соответственно, если мы вернем реализацию и пересоздадим, то получи&lt;/p&gt;
  &lt;figure class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/c4/8f/c48f1f3f-be4e-4608-bcd4-e9da32abd3e4.png&quot; width=&quot;605&quot; /&gt;
  &lt;/figure&gt;

</content></entry><entry><id>aboutpython:H1lLxNR0H</id><link rel="alternate" type="text/html" href="https://teletype.in/@aboutpython/H1lLxNR0H?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=aboutpython"></link><title>Миксины</title><published>2019-12-23T12:17:12.239Z</published><updated>2019-12-23T12:17:12.239Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://teletype.in/files/f7/78/f778c1ed-575f-4066-b500-5fb6666a8856.jpeg"></media:thumbnail><summary type="html">&lt;img src=&quot;https://teletype.in/files/f7/78/f778c1ed-575f-4066-b500-5fb6666a8856.jpeg&quot;&gt;Мы говорили уже о множественном наследовании, а теперь поговорим о миксинах.Миксины являются особым видом множественного наследования, но никакого особого синтаксиса не требуют. Миксины особенны только с точки зрения симантики, и самое главное в миксинах это то, что они не создаются как базовый класс предназначенный для конкретной иерархии, то есть их можно примешивать в любой класс. </summary><content type="html">
  &lt;figure class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/f7/78/f778c1ed-575f-4066-b500-5fb6666a8856.jpeg&quot; width=&quot;1280&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Мы говорили уже о множественном наследовании, а теперь поговорим о миксинах.Миксины являются особым видом множественного наследования, но никакого особого синтаксиса не требуют. Миксины особенны только с точки зрения симантики, и самое главное в миксинах это то, что они не создаются как базовый класс предназначенный для конкретной иерархии, то есть их можно примешивать в любой класс. &lt;/p&gt;
  &lt;p&gt;Например, создадим класс &lt;strong&gt;Machine&lt;/strong&gt;:&lt;/p&gt;
  &lt;figure class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/cf/7c/cf7cdd63-ed29-4bdd-b2f1-1a3113fc5f3f.png&quot; width=&quot;563&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Теперь вопрос, как подключить функционал радио к машине, именно к Car, таким образом, чтобы не добавлять его к самолету? Для этого можно использовать миксины. И вот как мы можем его сделать:&lt;/p&gt;
  &lt;figure class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/82/a9/82a9c5db-1aab-483f-b305-b98306965038.png&quot; width=&quot;786&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Вот таким образом мы примешали радио именно в Car и теперь може�� наслаждаться им в машине:&lt;/p&gt;
  &lt;figure class=&quot;m_custom&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/1a/fb/1afb05a5-b4d6-4b12-a2dc-d6b9f742acb5.png&quot; width=&quot;210&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;&lt;/p&gt;
  &lt;p&gt;Как правило миксины не содержат атрибутов и методов с теми же наименованиями которые содержатся в иерархии классов к которым они примешиваются. И сами по себе миксины, не смотря на то, что это множественное наследование не подразумевает, что мы вообще строим именно &lt;strong&gt;Deadly Diamond of Death &lt;/strong&gt;(ромб), про который я рассказывал в прошлом посте. Поэтому, как правило мы пользуемся множественным наследованием именно используя миксины, но миксины мы можем примешивать и к какой то иерархии классов, просто мы не выстариваем иерархии классов таким образом, чтобы возникали именно ромбы. Таким образом Python разрешает множественные наследования, но относиться следует к множественному наследованию с осторожностью, использовать классическое наследование можно, но ни в коем случае не создавать ромбы, ну и конечно же в любом количестве можно примешивать миксины, которые совершенно ничем не мешают ни наследникам, ни их базовым классам.&lt;/p&gt;

</content></entry><entry><id>aboutpython:SJGERQ00H</id><link rel="alternate" type="text/html" href="https://teletype.in/@aboutpython/SJGERQ00H?utm_source=teletype&amp;utm_medium=feed_atom&amp;utm_campaign=aboutpython"></link><title>Миксины</title><published>2019-12-23T12:08:09.957Z</published><updated>2019-12-23T12:13:03.427Z</updated><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://teletype.in/files/f7/78/f778c1ed-575f-4066-b500-5fb6666a8856.jpeg"></media:thumbnail><summary type="html">&lt;img src=&quot;https://teletype.in/files/f7/78/f778c1ed-575f-4066-b500-5fb6666a8856.jpeg&quot;&gt;Мы говорили уже о множественном наследовании, а теперь поговорим о миксинах.Миксины являются особым видом множественного наследования, но никакого особого синтаксиса не требуют. Миксины особенны только с точки зрения симантики, и самое главное в миксинах это то, что они не создаются как базовый класс предназначенный для конкретной иерархии, то есть их можно примешивать в любой класс. </summary><content type="html">
  &lt;figure class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/f7/78/f778c1ed-575f-4066-b500-5fb6666a8856.jpeg&quot; width=&quot;1280&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Мы говорили уже о множественном наследовании, а теперь поговорим о миксинах.Миксины являются особым видом множественного наследования, но никакого особого синтаксиса не требуют. Миксины особенны только с точки зрения симантики, и самое главное в миксинах это то, что они не создаются как базовый класс предназначенный для конкретной иерархии, то есть их можно примешивать в любой класс. &lt;/p&gt;
  &lt;p&gt;Например, создадим класс &lt;strong&gt;Machine&lt;/strong&gt;:&lt;/p&gt;
  &lt;figure class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/cf/7c/cf7cdd63-ed29-4bdd-b2f1-1a3113fc5f3f.png&quot; width=&quot;563&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Теперь вопрос, как подключить функционал радио к машине, именно к Car, таким образом, чтобы не добавлять его к самолету? Для этого можно использовать миксины. И вот как мы можем его сделать:&lt;/p&gt;
  &lt;figure class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/82/a9/82a9c5db-1aab-483f-b305-b98306965038.png&quot; width=&quot;786&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;Вот таким образом мы примешали радио именно в Car и теперь можем наслаждаться им в машине:&lt;/p&gt;
  &lt;figure class=&quot;m_original&quot;&gt;
    &lt;img src=&quot;https://teletype.in/files/1a/fb/1afb05a5-b4d6-4b12-a2dc-d6b9f742acb5.png&quot; width=&quot;210&quot; /&gt;
  &lt;/figure&gt;
  &lt;p&gt;&lt;/p&gt;
  &lt;p&gt;Как правило миксины не содержат атрибутов и методов с теми же наименованиями которые содержатся в иерархии классов  к которым они примешиваются. И сами по себе миксины, не смотря на то, что это множественное наследование не подразумевает, что мы вообще строим именно &lt;strong&gt;Deadly Diamond of Death &lt;/strong&gt;(ромб), про который я рассказывал в прошлом посте. Поэтому, как правило мы пользуемся множественным наследованием именно используя миксины, но миксины мы можем примешивать и к какой то иерархии классов, просто мы не выстариваем иерархии классов таким образом, чтобы возникали именно ромбы. Таким образом Python разрешает множественные наследования, но относиться следует к множественному наследованию с осторожностью, использовать классическое наследование можно, но ни в коем случае не создавать ромбы, ну и конечно же в любом количестве можно примешивать миксины, которые совершенно ничем не мешают ни наследникам, ни их базовым классам.&lt;/p&gt;

</content></entry></feed>