Виртуальные среды, интерполяция строк, ленивое вычисление и понимание

Выучить новый язык программирования непросто, особенно если у вас нет опыта программирования. Однако изучение 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.