Виртуальные среды, интерполяция строк, ленивое вычисление и понимание
Выучить новый язык программирования непросто, особенно если у вас нет опыта программирования. Однако изучение Python, возможно, проще, чем изучение нескольких других языков, поскольку оно поддерживает подход обучения REPL (Read-Eval-Print-Loop) для начинающих. Проще говоря, чтобы изучить Python, мы можем просто использовать командную консоль. Вы пишете свой код Python (например, print(“Hello, World!”)
), а консоль оценивает код и распечатывает вывод, если это применимо. Такой подход REPL обеспечивает обратную связь в реальном времени по различным темам в Python, что упрощает изучение Python.
Несмотря на такой удобный подход к обучению, есть некоторые концепции, которые могут сбить с толку новичков в Python. В этой статье я хотел бы сосредоточиться на разъяснении четырех концепций.
1. Виртуальная среда
Новички не сочтут концепцию виртуальных сред актуальной, пока они не начнут работать над некоторыми реальными проектами. Рассмотрим следующий сценарий: в одном проекте вы используете определенный пакет (A), который зависит от версии 1.0 пакета X. Однако в другом проекте вы используете пакет B, который зависит от версии 1.5 пакета X.
Вот дилемма, с которой вы столкнулись: если вы установите X v1.0, ваш второй проект не сможет работать. Однако если вы установите X v1.5, ваш первый проект не сможет работать. Должны ли мы использовать для этих проектов два разных компьютера? Конечно, этот дорогостоящий подход сработает, но что, если у вас несколько проектов? Совершенно непрактично иметь отдельные компьютеры для разных проектов.
Для устранения возможных конфликтов между различными проектами существует умное решение, которое предыдущие программисты Python уже разработали для нас - виртуальная среда. Общая идея состоит в том, что мы создаем изолированные рабочие среды для каждого из наших проектов, чтобы версии пакетов в одном проекте не конфликтовали с другими несовместимыми версиями тех же пакетов в других проектах.
Существует несколько подходов к управлению виртуальными средами, например venv и conda. Чтобы предоставить вам подтверждение концепции, следующий код показывает вам общие манипуляции с виртуальными средами с использованием модуля venv, который является частью стандартной библиотеки Python.
- После того, как вы перейдете в желаемый каталог, чтобы создать виртуальную среду, запустите в инструменте командной строки (например, Терминал для Mac) следующее:
python3 -m venv medium-env
. Обратите внимание, чтоmedium-env
определяет среду, которую вы создаете. Также предполагается, что вы уже установили Python 3 на свой компьютер. - После создания виртуальной среды вы можете активировать среду, запустив следующий код на вашем Mac (обратите внимание, что Windows использует другую команду):
source medium-env/bin/activate
. - С этого момента вы увидите, что ваше приглашение терминала имеет префикс
(medium-env)
, который указывает на то, что вы работаете в виртуальной среде, как и предполагалось. Вы можете делать все, что вам нужно, например, устанавливать новые пакеты. - Закончив работу, вы можете покинуть виртуальную среду, просто запустив
deactivate
.
Если вы новичок в виртуальных средах, их проще настроить, установив Anaconda, который позаботится о вашем интерпретаторе Python, управлении пакетами и виртуальной среде. Для более подробной информации посетите Сайт Анаконды.
2. Строковая интерполяция (F-струны)
Необходимость подготовить строки в подходящем формате, чтобы мы могли их представить, - обычная задача. Обычно существует несколько способов форматирования строк - один с использованием функции format
, а другой с использованием форматирования на основе% в стиле C. Ниже приведены некоторые тривиальные примеры:
Как показано в приведенном выше фрагменте кода, эти два подхода отделяют тексты строк от желаемых форматов. Например, если мы хотим отформатировать три числа, как показано ниже, мы сделаем следующее, используя функцию format
. Как вы могли заметить, нам придется сопоставить каждую переменную с каждым форматом, что может сбивать с толку, если мы пропустим число или переменную.
Напротив, строковая интерполяция или буквальная строковая интерполяция, которая была введена в Python 3.6, сделала форматирование строк намного проще и, что более важно, более читабельным. Чтобы отформатировать числа, как показано в фрагменте кода, мы можем сделать то же самое, используя метод интерполяции строк.
- Мы используем букву
f
, чтобы обозначить, что мы создаем f-строку. - Подобно функции
format
, f-строки используют фигурные скобки для обозначения переменных, которые должны быть интерполированы. - В отличие от функции
format
, каждая интерполяция имеет переменную и желаемое форматирование, которое устраняет физическое расстояние между ними и делает строку более читаемой.
3. Ленивая оценка
Ленивая оценка - это жаргон компьютерного программирования, который относится к данным (например, переменным), которые не извлекаются / не обрабатываются до тех пор, пока они не будут запрошены. Например, в Swift мы можем использовать ключевое слово lazy
для обозначения переменной, чтобы она не вычислялась, пока мы ее не вызовем. Хотя в Python нет lazy
в качестве ключевого слова, такая же отложенная оценка все еще доступна в Python.
Например, у нас могут быть ленивые атрибуты для наших экземпляров настраиваемых классов. В следующем коде показано, как мы можем использовать декоратор property
для реализации этой функции (не стесняйтесь исследовать декоратор @cached_property
в модуле functools
для получения аналогичного эффекта):
- В методе инициализации (т.е.
__init__
) мы устанавливаем защищенный атрибут (_profile_data
) равнымNone
, который просто служит заполнителем. Во многих случаях нам действительно не нужны данные профиля. - Однако, если нам действительно нужно получить данные профиля, мы можем обернуть их
property
декоратором. Он проверит, является ли_profile_data
None
или нет, и запустит дорогостоящий веб-запрос только тогда, когда у нас нет данных для атрибута_profile_data
.
Другой пример: генераторы в Python также используют технику ленивого вычисления. Как вы, возможно, знаете, генераторы - это особый вид итератора, который отображает элементы по запросу. В отличие от некоторых распространенных итераторов, созданных из списков и словарей, у генераторов не все элементы загружены в память, и поэтому они очень эффективны с точки зрения памяти. Это все потому, что они хранят состояние итерации и «лениво» визуализируют следующий применимый элемент. В следующем коде показано связанное использование генераторов:
- Мы используем так называемое выражение генератора, чтобы создать простой генератор, который отображает квадраты.
- По сравнению с аналогом списка, генератор имеет лишь крошечную долю размера, занимаемого списком (96 байт против 9000 байт). Однако оба достигают одинакового эффекта - суммы обоих равны.
4. Понимания
Одна из замечательных особенностей Python - это техника понимания. Даже для новичков понимание списка, вероятно, является одним из продвинутых методов, о которых они слышали. Целью использования понимания списка является создание объекта списка с использованием итеративного очень кратким образом. Фактически, я использовал понимание списка в предыдущем разделе, чтобы создать этот список квадратов:
- Понимание списка имеет следующий синтаксис:
[expression for x in iterable]
. В приведенном выше примере мы используем объектrange
. - Если мы не используем понимание списка, мы можем использовать цикл
for
для итерации объектаrange
и добавления квадрата к объекту списка. В конце концов, в обоих списках одинаковые позиции. Однако понимание списка, по-видимому, является более кратким способом создания объектов списка и должно быть предпочтительным способом создания объекта списка, если мы начнем с итерируемого.
Помимо понимания списков, Python также имеет методы понимания для создания словарей и наборов. Следующий фрагмент кода показывает использование:
- Понимание словаря имеет следующий синтаксис:
{key_expr: valu_expr for x in iterable}
. - Установленное понимание имеет следующий синтаксис:
{expr for x in iterable}
.
Заключение
В этой статье мы рассмотрели четыре концепции, которые могут запутать новичков. Вот краткое изложение этих концепций:
- Виртуальные среды - это способ, с помощью которого мы можем создавать изолированные рабочие пространства для наших проектов, чтобы они могли иметь разные версии Python и разные требования к зависимостям.
- Строковая интерполяция известна как f-строка в Python, которая является более читаемым способом создания форматированных строк, имея соответствующую переменную / выражение рядом с применимыми настройками форматирования.
- Ленивая оценка - это метод программирования, который позволяет нашей программе максимально откладывать дорогостоящие операции (например, веб-запрос, тяжелые вычисления).
- Понимания - это метод, который позволяет нам создавать списки, словари и наборы в гораздо более сжатой форме, что устраняет необходимость использования цикла
for
.