Находим соответствия в строках
В стандартной библиотеке Python существует модуль
Данный метод ищет "наилучшие" возможные совпадения. Первый аргумент задаёт искомую строку, второй аргумент – список, в котором выполняется поиск.
Также в метод можно передать необязательный аргумент
#difflib #строки
В стандартной библиотеке Python существует модуль
difflib
, в котором есть интересный метод get_close_matches
. Он позволяет найти в списке строки, похожие на некую исходную.Данный метод ищет "наилучшие" возможные совпадения. Первый аргумент задаёт искомую строку, второй аргумент – список, в котором выполняется поиск.
Также в метод можно передать необязательный аргумент
n
, который задаёт максимальное число возвращаемых совпадений.#difflib #строки
Функция itertools.cycle
В пайтон есть классный модуль
Сегодня мы бы хотели показать вам функцию
К примеру, функция
Мы также можем воспользоваться
#генераторы #itertools
В пайтон есть классный модуль
itertools
для создания собственных итераторов. Функции данного модуля довольно эффективны в работе, поэтому их часто используют в реальных проектах. Сегодня мы бы хотели показать вам функцию
cycle()
из itertools
. Данная функция принимает на вход итерируемый объект и создает бесконечный итератор, циклически возвращающий элементы данного объекта. Фишка заключается в том, что когда элементы последовательности заканчиваются, итерация начинается вновь с первого элементы.К примеру, функция
cycle()
из последовательности ['red', 'white', 'blue']
генерирует повторяющуюся бесконечную. Но важно при проходе при итерации по такому итератору предусмотреть выход из цикла (а не как у нас в первом случае с colors:). Так как это итератор, то мы можем использовать его для получения значений через функцию next(colors)
.Мы также можем воспользоваться
islice()
, который вернет итератор по подмножеству переданного объекта.#генераторы #itertools
Модуль subprocess
Всем доброго вечера, сегодня мы поговорим немного о модуле
Данный модуль предоставляет унифицированный интерфейс для создания дополнительных процессов с вызовом программ, а также может подключать к стандартным потокам ввода, вывода и вывода об ошибках. Модуль был добавлен в стандартную библиотеку
Для создания процессов в
Сегодня мы расскажем о функциях
Для захвата вывода процесса нам нужно передать
Иногда программа ожидает от нас ввода из стандартного потока
Для того, чтобы породить исключение в случае получения кода возврата об ошибке мы можем передать флаг
И как бонус у этой функции есть аргумент
#процессы #subprocess
Всем доброго вечера, сегодня мы поговорим немного о модуле
subprocess
:)Данный модуль предоставляет унифицированный интерфейс для создания дополнительных процессов с вызовом программ, а также может подключать к стандартным потокам ввода, вывода и вывода об ошибках. Модуль был добавлен в стандартную библиотеку
python
на замену os.system()
и os.popen()
.Для создания процессов в
subprocess
используются функции run()
, call()
, check_call()
, check_output()
, а также класс Popen
.Сегодня мы расскажем о функциях
call
, check_call
, check_output
и run
, а завтра поговорим о Popen. Они используются, когда требуется запустить программу и дождаться ее выполнения.call
- вызывается для создания процесса, ожидает выполнения и возвращает код выполнения (если программа отработала корректно, вернется 0).check_call
- делает тоже самое только еще и проверяет возвращаемое значение, если код выхода указывает, что произошла ошибка, то функция выбросит исключение CalledProcessError
. check_output
- использовалась, когда нужно было захватить вывод запущенного процесса. Эта функция была нужна, так как потоки ввода и вывода запущенного процесса через call
привязывались именно к вводу и выводу данного процесса, поэтому вывод таким образом захватить не получится.run
- это функция пришла в python версии 3.5 на замену трем предыдущим и умеет все, что и они и немножко больше (данные три функции были оставлены для обратной совместимости). run()
возвращает объект CompletedProcess
, который привязан к результату. Для захвата вывода процесса нам нужно передать
capture_output=True
, после чего в аргументах объекта stdout
и stderr
будут записаны соответствующие выводы, запущенной программы. Но по умолчанию вывод будет вывод будет в байтах, чтобы получить читабельный текст мы также передаем флаг text=True
. Иногда программа ожидает от нас ввода из стандартного потока
stdin
, в этом случае мы можем передать ввод через аргумент input
.Для того, чтобы породить исключение в случае получения кода возврата об ошибке мы можем передать флаг
check=True
. И как бонус у этой функции есть аргумент
timeout
позволяющий передать время, через которое процесс должен быть принудительно завершен. В случае принудительного завершения будет выброшено исключение TimeoutExpired
.#процессы #subprocess
Нижнее подчеркивание
В Python имя переменной может состоять из одного подчеркивания:
Во-первых,
Во-вторых, интерактивный режим использует
В-третьих, руководство модуля
#тонкости
В Python имя переменной может состоять из одного подчеркивания:
_
. Хотя обычно такие имена не достаточно описательны и не должны использоваться, есть по крайней мере три случая, когда _
имеет общепринятый смысл.Во-первых,
_
используется, когда вам нужно придумать имена для значений, которые вам не нужны – например, в циклах for
.Во-вторых, интерактивный режим использует
_
для хранения результата последнего выполненного выражения.В-третьих, руководство модуля
gettext
рекомендует псевдоним его функции gettext()
для _()
, чтобы минимизировать загромождение вашего кода.#тонкости
Оператор pass
В ходе исполнения данного оператора ничего не происходит, поэтому он может использоваться в качестве некой заглушки в тех местах, где это синтаксически необходимо.
Например, вам надо сделать несколько функций, вы написали
Или в конструкции
#pass
В ходе исполнения данного оператора ничего не происходит, поэтому он может использоваться в качестве некой заглушки в тех местах, где это синтаксически необходимо.
Например, вам надо сделать несколько функций, вы написали
def
'ы и названия, но сам код еще не успели, однако программу надо запустить и проверить что-то другое. Вот тут и понадобится pass
.Или в конструкции
try-except
, чтобы просто проигнорировать и никак не обрабатывать ошибку в программе.#pass
Генераторы
В этом посте освежим знания про генераторы, чтобы далее разобрать такую интересную тему, как корутины.
Функции-генераторы выглядят как и обычные, но содержат выражения с ключевым словом
Вызов подобной функции вернёт не значение, а объект генератора. Далее из этого объекта можно получать значения, например, с помощью функции
Если генератору больше нечего возвращать, то будет вызвано исключение
#генераторы
В этом посте освежим знания про генераторы, чтобы далее разобрать такую интересную тему, как корутины.
Функции-генераторы выглядят как и обычные, но содержат выражения с ключевым словом
yield
для последовательного генерирования значений. В целом, генератор – это особый, более изящный случай итератора.Вызов подобной функции вернёт не значение, а объект генератора. Далее из этого объекта можно получать значения, например, с помощью функции
next
или циклом for
.Если генератору больше нечего возвращать, то будет вызвано исключение
StopIteration
.#генераторы
Корутины (Coroutines)
В PEP 342 были представлены корутины, которые стали некой противоположностью генераторов. Для примера напишем функцию, которая будет в бесконечном цикле подставлять значение и выводить строку.
Обратите внимание на то, как было использовано ключевое слово
Функция работает так: при отправке значения через метод
#генераторы #корутины
В PEP 342 были представлены корутины, которые стали некой противоположностью генераторов. Для примера напишем функцию, которая будет в бесконечном цикле подставлять значение и выводить строку.
Обратите внимание на то, как было использовано ключевое слово
yield
. При таком написании создаётся корутина, а не генератор, что позволяет не просто генерировать значения, но и принимать их.Функция работает так: при отправке значения через метод
send
локальная переменная name
принимает его, а далее значение подставляется в строку и выводится на экран.#генераторы #корутины
Priming
В предыдущем примере была строчка кода, в которой мы отправили значение
Такое действие называется priming корутины (на русский сложно адекватно перевести). В случае, если не выполнить эту операцию, возникнет исключение
Priming корутины может быть выполнен либо путем передачи
#корутины #priming
В предыдущем примере была строчка кода, в которой мы отправили значение
None
в только что созданную корутину перед её использованием. Такое действие называется priming корутины (на русский сложно адекватно перевести). В случае, если не выполнить эту операцию, возникнет исключение
TypeError
.Priming корутины может быть выполнен либо путем передачи
None
(на что и намекает сообщение ошибки), либо просто вызовом функции next
с передачей корутины. И эта операция должна быть выполнена обязательно ровно один раз в самом начале.#корутины #priming
Tornado
На удивление, Tornado – достаточно старый фреймворк. Самый первый релиз был выпущен в далёком 2009 году, и сейчас его основное внимание направлено на обеспечении надежного асинхронного программирования с высоким параллелизмом.
Tornado изначально не являлся веб-фреймворком. На самом деле это просто набор асинхронных модулей, которые используются для построения модулей веб-фреймворка. Если более конкретно, то вот эти модули:
– Корутины и другие примитивы (
– Сетевые модули (
– Асинхронные сервера и клиенты (
Они были совмещены для получения финальный модулей фреймворка:
#фреймворки #web
На удивление, Tornado – достаточно старый фреймворк. Самый первый релиз был выпущен в далёком 2009 году, и сейчас его основное внимание направлено на обеспечении надежного асинхронного программирования с высоким параллелизмом.
Tornado изначально не являлся веб-фреймворком. На самом деле это просто набор асинхронных модулей, которые используются для построения модулей веб-фреймворка. Если более конкретно, то вот эти модули:
– Корутины и другие примитивы (
tornado.gen
, tornado.locks
, tornado.queues
и т. д.)– Сетевые модули (
tornado.ioloop
, tornado.iostream
и т. д.)– Асинхронные сервера и клиенты (
tornado.httpserver
, tornado.httpclient
и т. д.)Они были совмещены для получения финальный модулей фреймворка:
tornado.web
, tornado.routing
, tornado.template
и тому подобные.#фреймворки #web
FastAPI
FastAPI – фреймворк, про который однозначно стоит рассказать. Честно, синтаксис мне кажется намного приятнее, чем у других фреймворков.
Интересно, что автор фреймворка глубоко изучил несколько других фреймворков, от классических, таких как Django, до более современных, таких как Sanic, а также изучил различные технологии в NestJS (веб-фреймворк Node.js, Typescript).
Фреймворк имеет важную особенность – автоматическая генерация документации: как только ваши конечные точки будут реализованы, вы сможете поиграться с API, используя соответствующий стандартам пользовательский интерфейс. Поддерживаются SwaggerUI, ReDoc и другие.
FastAPI построен на удивительной библиотеке Starlette, в результате чего производительность сравнима с Node.js, а в некоторых случаях даже Go! В целом, складывается стойкое предчувствие, что FastAPI будет мчаться вперёд как лучший асинхронный фреймворк для Python.
#фреймворки #web
FastAPI – фреймворк, про который однозначно стоит рассказать. Честно, синтаксис мне кажется намного приятнее, чем у других фреймворков.
Интересно, что автор фреймворка глубоко изучил несколько других фреймворков, от классических, таких как Django, до более современных, таких как Sanic, а также изучил различные технологии в NestJS (веб-фреймворк Node.js, Typescript).
Фреймворк имеет важную особенность – автоматическая генерация документации: как только ваши конечные точки будут реализованы, вы сможете поиграться с API, используя соответствующий стандартам пользовательский интерфейс. Поддерживаются SwaggerUI, ReDoc и другие.
FastAPI построен на удивительной библиотеке Starlette, в результате чего производительность сравнима с Node.js, а в некоторых случаях даже Go! В целом, складывается стойкое предчувствие, что FastAPI будет мчаться вперёд как лучший асинхронный фреймворк для Python.
#фреймворки #web
Анонимные функции
Анонимные функции являются крайне полезным аспектом, которым либо пренебрегают, либо чрезмерно пользуются. Новичкам они могут показаться сложными, но это совсем не так.
В целом, структура очень простая –
Такие функции чаще всего используются, когда они больше нигде не понадобятся, то есть определять полноценную функцию нет смысла. Типичные примеры использования –
#функции #lambda
Анонимные функции являются крайне полезным аспектом, которым либо пренебрегают, либо чрезмерно пользуются. Новичкам они могут показаться сложными, но это совсем не так.
В целом, структура очень простая –
lambda <arguments>: <expression>
. Сначала пишете ключевое слово lambda
, далее аргументы, двоеточие и какое-то выражение, результат которого автоматически вернется.Такие функции чаще всего используются, когда они больше нигде не понадобятся, то есть определять полноценную функцию нет смысла. Типичные примеры использования –
map
и filter
.#функции #lambda
Композиция классов
Один из способов организации взаимодействия между классами – это композиция, или же ассоциация, классов.
В этом случае один из классов (в примере выше это
Ассоциированные объекты зачастую могут циклически ссылаться друг на друга, что ломает стандартный механизм сборки мусора. В таком случае необходимо использовать слабые ссылки из модуля
#классы #ооп
Один из способов организации взаимодействия между классами – это композиция, или же ассоциация, классов.
В этом случае один из классов (в примере выше это
Salary
) является полем другого (Employee
). Сложного здесь, как вы видите, ничего нет.Ассоциированные объекты зачастую могут циклически ссылаться друг на друга, что ломает стандартный механизм сборки мусора. В таком случае необходимо использовать слабые ссылки из модуля
weakref
, о котором поговорим позже.#классы #ооп
Assert
Если выполнить инструкцию
Исключения
Не нужно, например, обрабатывать пользовательский ввод и пытаться обработать исключение AssertionError блоком try except. Если таких мест будет очень много, то это затронет и производительность программы.
#исключения #assert
Если выполнить инструкцию
assert
с логическим выражением, результат которого равен True
, ничего не произойдет. Но если попробовать выполнить инструкцию assert
с логическим выражением, которое равно False
, то будет сгенерировано исключение AssertionError
.Исключения
AssertionError
предназначены скорее для программистов. При написании программ на этапе разработки мы должны видеть, что делаем что-то не так (к примеру, передали в функцию некорректное значение). Не нужно, например, обрабатывать пользовательский ввод и пытаться обработать исключение AssertionError блоком try except. Если таких мест будет очень много, то это затронет и производительность программы.
#исключения #assert
Влейся в ряды единомышленников
Кстати, если вы не знали, то у нас также есть чат, в котором уже 500+ участников — @python_academy_chat.
Присоединяйтесь, задавайте свои вопросы и не забывайте помогать другим :)
Кстати, если вы не знали, то у нас также есть чат, в котором уже 500+ участников — @python_academy_chat.
Присоединяйтесь, задавайте свои вопросы и не забывайте помогать другим :)
Статические методы
Отличие статического метода от обычного метода класса в том, что первый привязан к классу, а не объекту.
Такой тип методов по умолчанию не принимает ни объект, ни класс – прописывать
Обычную функцию стоит вносить в класс в качестве статического метода в том случае, когда эта функция логически относится к классу и имеет смысл там быть.
#классы
Отличие статического метода от обычного метода класса в том, что первый привязан к классу, а не объекту.
Такой тип методов по умолчанию не принимает ни объект, ни класс – прописывать
self
или cls
в аргументах не нужно. То есть статические методы не могут модифицировать ни объект, ни сам класс. Обычную функцию стоит вносить в класс в качестве статического метода в том случае, когда эта функция логически относится к классу и имеет смысл там быть.
#классы
Наследование
Наследование позволяет создавать новый класс на основе уже существующего. Таким образом, можно создать новый класс, взяв за основу все методы и атрибуты другого.
В данном случае класс
Наследование классов нужно для изменения поведения конкретного класса, а также для расширения его функционала.
#классы #ооп
Наследование позволяет создавать новый класс на основе уже существующего. Таким образом, можно создать новый класс, взяв за основу все методы и атрибуты другого.
В данном случае класс
Person
является родительским классом, также его называют базовым классом или суперклассом. А класс Employee
называется дочерним классом или подклассом.Наследование классов нужно для изменения поведения конкретного класса, а также для расширения его функционала.
#классы #ооп
Геттеры и сеттеры
В объектно-ориентированных языках распространено использование геттеров и сеттеров для безопасной работы с приватными полями. Например, в C# для этого есть удобная конструкция
В Python геттер реализуется через декоратор
Оба метода должны иметь одинаковое название, по которому можно будет обращаться как к обычному атрибуту.
#классы #property
В объектно-ориентированных языках распространено использование геттеров и сеттеров для безопасной работы с приватными полями. Например, в C# для этого есть удобная конструкция
{ get; set; }
.В Python геттер реализуется через декоратор
@property
, а сеттер в виде @свойство.setter
. В примере метод геттера называется age
, поэтому декоратор сеттера – @age.setter
.Оба метода должны иметь одинаковое название, по которому можно будет обращаться как к обычному атрибуту.
#классы #property
Дополнение про property
Важно отметить, что
Конструктор
Простыми словами, в примере
Кстати, можете посмотреть простейшую реализацию такого свойства в официальной документации.
#классы #property
Важно отметить, что
property
– это класс, реализованный через протокол дескриптора. Его методы setter
, getter
, deleter
и их использование в качестве декораторов – синтаксический сахар.Конструктор
property
принимает на вход аргументы fget
, fset
, fdel
, которые должны быть функциями. Они отвечают за получение, установку нового значения и удаление атрибута соответственно. Простыми словами, в примере
property
прикрепляет функции get_age
и set_age
к атрибуту age
. Также можно было реализовать условный delete_age
, который отвечал бы за удаление атрибута.Кстати, можете посмотреть простейшую реализацию такого свойства в официальной документации.
#классы #property
Дзен Python
Тим Петерс ещё в далёком 1999 году предложил PEP 20, который должен был содержать в себе 20 правил по написанию кода. Но в итоге их оказалось всего 19.
Последний пункт он предложил написать Гвидо Ван Россуму, однако он не написал ничего. В коммьюнити Python пришли к выводу, что разработчик языка хотел этим сказать, что никакие правила не являются абсолютными и везде есть исключения.
Посмотреть Дзен, или же философию Python, можно с помощью импорта модуля
#python #дзен
Тим Петерс ещё в далёком 1999 году предложил PEP 20, который должен был содержать в себе 20 правил по написанию кода. Но в итоге их оказалось всего 19.
Последний пункт он предложил написать Гвидо Ван Россуму, однако он не написал ничего. В коммьюнити Python пришли к выводу, что разработчик языка хотел этим сказать, что никакие правила не являются абсолютными и везде есть исключения.
Посмотреть Дзен, или же философию Python, можно с помощью импорта модуля
this
, а вариант перевода Дзена на русском языке здесь.#python #дзен