One place for hosting & domains

      программирования

      SOLID: 5 принципов объектно-ориентированного программирования


      Введение

      SOLID — это аббревиатура, обозначающая первые пять принципов объектно-ориентированного программирования, сформулированные Робертом С. Мартином (также известным как дядя Боб).

      Примечание. Хотя эти принципы применимы к разным языкам программирования, в этой статье мы приведем примеры для языка PHP.

      Эти принципы устанавливают практики, помогающие создавать программное обеспечение, которое можно обслуживать и расширять по мере развития проекта. Применение этих практик также поможет избавиться от плохого кода, оптимизировать код и создавать гибкое или адаптивное программное обеспечение.

      SOLID включает следующие принципы:

      В этой статье мы расскажем о каждом из принципов SOLID, которые помогут вам стать лучшим программистом и избавиться от плохого кода.

      Принцип единственной ответственности

      Принцип единственной ответственности (SRP) гласит:

      У класса должна быть одна и только одна причина для изменения, то есть у класса должна быть только одна работа.

      Рассмотрим в качестве примера приложение, которое берет набор фигур, состоящий из кругов и квадратов, и рассчитывает сумму площадей всех фигур в наборе.

      Для начала мы создадим классы фигур и используем конструкторы для настройки требуемых параметров.

      В случае квадратов необходимо знать длину стороны:

      class Square
      {
          public $length;
      
          public function construct($length)
          {
              $this->length = $length;
          }
      }
      

      В случае кругов необходимо знать радиус:

      class Circle
      {
          public $radius;
      
          public function construct($radius)
          {
              $this->radius = $radius;
          }
      }
      

      Далее следует создать класс AreaCalculator и написать логику для суммирования площадей всех заданных фигур. Площадь квадрата равна значению длины в квадрате. Площадь круга равняется значению радиуса в квадрате, умноженному на число пи.

      class AreaCalculator
      {
          protected $shapes;
      
          public function __construct($shapes = [])
          {
              $this->shapes = $shapes;
          }
      
          public function sum()
          {
              foreach ($this->shapes as $shape) {
                  if (is_a($shape, 'Square')) {
                      $area[] = pow($shape->length, 2);
                  } elseif (is_a($shape, 'Circle')) {
                      $area[] = pi() * pow($shape->radius, 2);
                  }
              }
      
              return array_sum($area);
          }
      
          public function output()
          {
              return implode('', [
                '',
                    'Sum of the areas of provided shapes: ',
                    $this->sum(),
                '',
            ]);
          }
      }
      

      Чтобы использовать класс AreaCalculator, нужно создать экземпляр класса, передать в него массив фигур и вывести результат внизу страницы.

      Вот пример с набором из трех фигур:

      • круг радиусом 2
      • квадрат с длиной стороны 5
      • второй квадрат с длиной стороны 6
      $shapes = [
        new Circle(2),
        new Square(5),
        new Square(6),
      ];
      
      $areas = new AreaCalculator($shapes);
      
      echo $areas->output();
      

      Проблема с методом вывода заключается в том, что класс AreaCalculator использует логику для вывода данных.

      Давайте рассмотрим сценарий, в котором вывод необходимо конвертировать в другой формат, например, JSON.

      Вся логика будет обрабатываться классом AreaCalculator. Это нарушит принцип единственной ответственности. Класс AreaCalculator должен отвечать только за вычисление суммы площадей заданных фигур. Он не должен учитывать, что пользователь хочет получить результат в формате JSON или HTML.

      Для решения этой проблемы вы можете создать отдельный класс SumCalculatorOutputter и использовать этот новый класс для обработки логики, необходимой для вывода данных пользователю:

      class SumCalculatorOutputter
      {
          protected $calculator;
      
          public function __constructor(AreaCalculator $calculator)
          {
              $this->calculator = $calculator;
          }
      
          public function JSON()
          {
              $data = [
                'sum' => $this->calculator->sum(),
            ];
      
              return json_encode($data);
          }
      
          public function HTML()
          {
              return implode('', [
                '',
                    'Sum of the areas of provided shapes: ',
                    $this->calculator->sum(),
                '',
            ]);
          }
      }
      

      Класс SumCalculatorOutputter должен работать следующим образом:

      $shapes = [
        new Circle(2),
        new Square(5),
        new Square(6),
      ];
      
      $areas = new AreaCalculator($shapes);
      $output = new SumCalculatorOutputter($areas);
      
      echo $output->JSON();
      echo $output->HTML();
      

      Логика, необходимая для вывода данных пользователю, обрабатывается классом SumCalculatorOutputter.

      Это соответствует принципу единственной ответственности.

      Принцип открытости/закрытости

      Принцип открытости/закрытости гласит:

      Объекты или сущности должны быть открыты для расширения, но закрыты для изменения.

      Это означает, что у нас должна быть возможность расширять класс без изменения самого класса.

      Давайте вернемся к классу AreaCalculator и посмотрим на метод sum:

      class AreaCalculator
      {
          protected $shapes;
      
          public function __construct($shapes = [])
          {
              $this->shapes = $shapes;
          }
      
          public function sum()
          {
              foreach ($this->shapes as $shape) {
                  if (is_a($shape, 'Square')) {
                      $area[] = pow($shape->length, 2);
                  } elseif (is_a($shape, 'Circle')) {
                      $area[] = pi() * pow($shape->radius, 2);
                  }
              }
      
              return array_sum($area);
          }
      }
      

      Рассмотрим сценарий, когда пользователю нужно получать сумму площадей дополнительных фигур, таких как треугольники, пятигранники, шестигранники и т. д. В этом случае нам бы пришлось постоянно редактировать этот файл и добавлять в него дополнительные блоки if/else. Это нарушит принцип открытости/закрытости.

      Однако мы можем улучшить метод sum, убрав логику расчета площади каждой фигуры из метода класса AreaCalculator и прикрепив ее к классу каждой фигуры.

      Вот метод area, определенный в классе Square:

      class Square
      {
          public $length;
      
          public function __construct($length)
          {
              $this->length = $length;
          }
      
          public function area()
          {
              return pow($this->length, 2);
          }
      }
      

      Вот метод area, определенный в классе Circle:

      class Circle
      {
          public $radius;
      
          public function construct($radius)
          {
              $this->radius = $radius;
          }
      
          public function area()
          {
              return pi() * pow($shape->radius, 2);
          }
      }
      

      В этом случае метод sum класса AreaCalculator можно переписать так:

      class AreaCalculator
      {
          // ...
      
          public function sum()
          {
              foreach ($this->shapes as $shape) {
                  $area[] = $shape->area();
              }
      
              return array_sum($area);
          }
      }
      

      Теперь вы можете создавать новые классы фигур и передавать их для расчета суммы без нарушения кода.

      Однако при этом возникает другая проблема. Как определить, что передаваемый в класс AreaCalculator объект действительно является фигурой, или что для этой фигуры задан метод area?

      Кодирование в интерфейс является неотъемлемой частью принципов SOLID.

      Создайте ShapeInterface, поддерживающий метод area:

      interface ShapeInterface
      {
          public function area();
      }
      

      Измените классы фигур, чтобы реализовать интерфейс ShapeInterface.

      Вот обновление класса Square:

      class Square implements ShapeInterface
      {
          // ...
      }
      

      А вот обновление класса Circle:

      class Circle implements ShapeInterface
      {
          // ...
      }
      

      В методе sum класса AreaCalculator вы можете проверить, являются ли фигуры экземплярами ShapeInterface; а если это не так, программа выдаст исключение:

       class AreaCalculator
      {
          // ...
      
          public function sum()
          {
              foreach ($this->shapes as $shape) {
                  if (is_a($shape, 'ShapeInterface')) {
                      $area[] = $shape->area();
                      continue;
                  }
      
                  throw new AreaCalculatorInvalidShapeException();
              }
      
              return array_sum($area);
          }
      }
      

      Это соответствует принципу открытости/закрытости.

      Принцип подстановки Лисков

      Принцип подстановки Лисков гласит:

      Пусть q(x) будет доказанным свойством объектов x типа T. Тогда q(y) будет доказанным свойством объектов y типа S, где S является подтипом T.

      Это означает, что каждый подкласс или производный класс должен быть заменяемым на базовый класс или родительский класс.

      Возьмем класс AreaCalculator из нашего примера и рассмотрим новый класс VolumeCalculator, расширяющий класс AreaCalculator:

      class VolumeCalculator extends AreaCalculator
      {
          public function construct($shapes = [])
          {
              parent::construct($shapes);
          }
      
          public function sum()
          {
              // logic to calculate the volumes and then return an array of output
              return [$summedData];
          }
      }
      

      Помните, что класс SumCalculatorOutputter выглядит примерно так:

      class SumCalculatorOutputter {
          protected $calculator;
      
          public function __constructor(AreaCalculator $calculator) {
              $this->calculator = $calculator;
          }
      
          public function JSON() {
              $data = array(
                  'sum' => $this->calculator->sum();
              );
      
              return json_encode($data);
          }
      
          public function HTML() {
              return implode('', array(
                  '',
                      'Sum of the areas of provided shapes: ',
                      $this->calculator->sum(),
                  ''
              ));
          }
      }
      

      Если мы попробуем выполнить такой пример:

      $areas = new AreaCalculator($shapes);
      $volumes = new VolumeCalculator($solidShapes);
      
      $output = new SumCalculatorOutputter($areas);
      $output2 = new SumCalculatorOutputter($volumes);
      

      Когда мы вызовем метод HTML для объекта $output2, мы получим сообщение об ошибке E_NOTICE, информирующее нас о преобразовании массива в строку.

      Чтобы исправить это, вместо вывода массива из метода sum класса VolumeCalculator мы будем возвращать $summedData:

      class VolumeCalculator extends AreaCalculator
      {
          public function construct($shapes = [])
          {
              parent::construct($shapes);
          }
      
          public function sum()
          {
              // logic to calculate the volumes and then return a value of output
              return $summedData;
          }
      }
      

      Значение $summedData может быть дробным числом, двойным числом или целым числом.

      Это соответствует принципу подстановки Лисков.

      Принцип разделения интерфейса

      Принцип разделения интерфейса гласит:

      Клиент никогда не должен быть вынужден реализовывать интерфейс, который он не использует, или клиенты не должны вынужденно зависеть от методов, которые они не используют.

      Возьмем предыдущий пример с ShapeInterface. Допустим, нам нужно добавить поддержку новых трехмерных фигур Cuboid и Spheroid, и для этих фигур также требуется рассчитывать объем.

      Давайте посмотрим, что произойдет, если мы изменим ShapeInterface, чтобы добавить новый контракт:

      interface ShapeInterface
      {
          public function area();
      
          public function volume();
      }
      

      Теперь все создаваемые фигуры должны иметь метод volume, но мы знаем, что квадраты — двухмерные фигуры, и у них нет объема. В результате этот интерфейс принуждает класс Square реализовывать метод, который он не может использовать.

      Это нарушает принцип разделения интерфейса. Вместо этого мы можем создать новый интерфейс ThreeDimensionalShapeInterface, в котором имеется контракт volume, и трехмерные фигуры смогут реализовывать этот интерфейс:

      interface ShapeInterface
      {
          public function area();
      }
      
      interface ThreeDimensionalShapeInterface
      {
          public function volume();
      }
      
      class Cuboid implements ShapeInterface, ThreeDimensionalShapeInterface
      {
          public function area()
          {
              // calculate the surface area of the cuboid
          }
      
          public function volume()
          {
              // calculate the volume of the cuboid
          }
      }
      

      Этот подход намного лучше, но здесь нужно следить за правильностью выбора интерфейса. Вместо использования интерфейса ShapeInterface или ThreeDimensionalShapeInterface мы можем создать еще один интерфейс, например ManageShapeInterface, и реализовать его и для двухмерных, и для трехмерных фигур.

      Так мы получим единый API для управления фигурами:

      interface ManageShapeInterface
      {
          public function calculate();
      }
      
      class Square implements ShapeInterface, ManageShapeInterface
      {
          public function area()
          {
              // calculate the area of the square
          }
      
          public function calculate()
          {
              return $this->area();
          }
      }
      
      class Cuboid implements ShapeInterface, ThreeDimensionalShapeInterface, ManageShapeInterface
      {
          public function area()
          {
              // calculate the surface area of the cuboid
          }
      
          public function volume()
          {
              // calculate the volume of the cuboid
          }
      
          public function calculate()
          {
              return $this->area();
          }
      }
      

      Теперь в классе AreaCalculator мы можем заменить вызов метода area вызовом метода calculate и проверить, является ли объект экземпляром класса ManageShapeInterface, а не ShapeInterface.

      Это соответствует принципу разделения интерфейса.

      Принцип инверсии зависимостей

      Принцип инверсии зависимостей гласит:

      Сущности должны зависеть от абстракций, а не от чего-то конкретного. Это означает, что модуль высокого уровня не должен зависеть от модуля низкого уровня, но они оба должны зависеть от абстракций.

      Этот принцип открывает возможности разъединения.

      Вот пример модуля PasswordReminder, подключаемого к базе данных MySQL:

      class MySQLConnection
      {
          public function connect()
          {
              // handle the database connection
              return 'Database connection';
          }
      }
      
      class PasswordReminder
      {
          private $dbConnection;
      
          public function __construct(MySQLConnection $dbConnection)
          {
              $this->dbConnection = $dbConnection;
          }
      }
      

      Во-первых, MySQLConnection — это модуль низкого уровня, а PasswordReminder — модуль высокого уровня, однако определение D в принципах SOLID гласит: зависимость от абстракций, а не от чего-то конкретного. В приведенном выше фрагменте этот принцип нарушен, потому что класс PasswordReminder вынужденно зависит от класса MySQLConnection.

      Если впоследствии вам потребуется изменить систему базы данных, вам также будет нужно изменить класс PasswordReminder, а это нарушит принцип открытости/закрытости.

      Класс PasswordReminder не должен зависеть от того, какую базу данных использует ваше приложение. Чтобы решить эти проблемы, вы можете запрограммировать интерфейс, поскольку модули высокого уровня и низкого уровня должны зависеть от абстракции:

      interface DBConnectionInterface
      {
          public function connect();
      }
      

      Интерфейс содержит метод connect, и класс MySQLConnection реализует этот интерфейс. Вместо того, чтобы прямо указывать тип класса MySQLConnection в конструкторе PasswordReminder, мы указываем тип класса DBConnectionInterface, и в этом случае, какую бы базу данных ни использовало ваше приложение, класс PasswordReminder сможет подключиться к этой базе данных без каких-либо проблем, и принцип открытости/закрытости не будет нарушен.

      class MySQLConnection implements DBConnectionInterface
      {
          public function connect()
          {
              // handle the database connection
              return 'Database connection';
          }
      }
      
      class PasswordReminder
      {
          private $dbConnection;
      
          public function __construct(DBConnectionInterface $dbConnection)
          {
              $this->dbConnection = $dbConnection;
          }
      }
      

      В этом коде модули высокого уровня и модули низкого уровня зависят от абстракции.

      Заключение

      В этой статье мы рассказали о пяти принципах SOLID, применяемых в объектно-ориентированном программировании. Проекты, соответствующие принципам SOLID, можно передавать коллегам, расширять, модифицировать, тестировать и перерабатывать с меньшим количеством сложностей.

      Чтобы продолжить обучение, прочитайте о других практиках Agile и разработки адаптивного программного обеспечения.



      Source link

      Установка Python 3 и настройка среды программирования на сервере Ubuntu 20.04


      Введение

      Язык программирования Python приобретает все большую популярность как среди новичков, так и среди опытных разработчиков. Гибкий и универсальный Python отлично подходит для создания скриптов, автоматизации, анализа данных, машинного обучения и разработки серверных компонентов приложений. Разработчики выпустили первую версию языка Python в 1991 году с целью создать интересный язык программирования и назвали его в честь британской комедийной группы Monty Python.

      В этом обучающем руководстве вы научитесь настраивать на сервере Ubuntu 20.04 среду программирования Python 3. Программирование на сревере дает много преимуществ и обеспечивает поддержку совместной работы над проектами разработки. Общие принципы этого обучающего модуля относятся к любым дистрибутивам Debian Linux.

      Предварительные требования

      Для выполнения этого обучающего руководства вам необходим пользователь non-root user с привилегиями sudo на сервере Ubuntu 20.04. Чтобы выполнить необходимую настройку, воспользуйтесь нашим руководством по первоначальной настройке сервера.

      Если вы еще не знакомы со средой терминалой, вам будет полезна статья «Введение в терминалы Linux».

      После настройки сервера и пользователя вы можете продолжить.

      Шаг 1 — Настройка Python 3

      Ubuntu 20.04 и другие версии Debian Linux поставляются с предустановленным Python 3. Чтобы убедиться в обновлении версий, мы выполним обновление системы с помощью команды apt для работы с инструментом Ubuntu Advanced Packaging Tool:

      • sudo apt update
      • sudo apt -y upgrade

      Флаг -y показывает, что мы соглашаемся установить все элементы. В зависимости от вашей версии Linux вам может понадобиться подтвердить выбор в дополнительныхх диалогах по мере установки обновлений.

      После завершения этой процедуры мы можем проверить установленную в системе версию Python 3 с помощью следующей команды:

      На экране терминала будет выведена страница результатов, где вы сможете увидеть номер версии. Хотя номер версии может различаться, результат будет выглядеть примерно так:

      Output

      Python 3.8.2

      Для управления программными пакетами Python мы установим инструмент pip, предназначенный для установки и управления пакетами программирования, которые мы можем захотеть использовать в наших проектах разработки. Дополнительную информацию о модулях и пакетах, которые можно установить с помощью pip, можно найти в документе «Импортирование модулей в Python 3».

      • sudo apt install -y python3-pip

      Пакеты Python можно установить с помощью следующей команды:

      • pip3 install package_name

      Здесь package_name может относиться к любому пакету или любой библиотеке Python, в том числе Django для веб-разработки или NumPy для научных вычислений. Если вы захотите установить NumPy, вы можете использовать команду pip3 install numpy.

      Можно установить несколько дополнительных пакетов и средств разработки, чтобы получить надежную основу для нашей среды программирования:

      • sudo apt install -y build-essential libssl-dev libffi-dev python3-dev

      После настройки Python и установки pip и других инструментов мы можем настроить виртуальную среду для наших проектов разработки.

      Шаг 2 — Настройка виртуальной среды

      Виртуальные среды позволяют выделять на сервере изолированную область для проектов Python. Благодаря этому каждый из ваших проектов может иметь собственный набор зависимостей, которые не помешают функционированию других ваших проектов.

      Настройка среды программирования обеспечивает нам лучший контроль над проектами Python и над обработкой разных версий пакетов. Это особенно важно при работе с пакетами сторонних разработчиков.

      Вы можете настроить любое желаемое количество сред программирования Python. Каждая среда представляет собой каталог или папку на сервере, содержащую несколько скриптов, обеспечивающих ее работу.

      Хотя существует несколько способов создания среды программирования в Python, мы используем модуль venv, входящий в состав стандартной библиотеки Python 3. Для установки venv введите следующую команду:

      • sudo apt install -y python3-venv

      С этим модулем мы готовым приступить к созданию сред. Вначале выберем каталог, где мы хотим разместить наши среды программирования Python, или создадим такой каталог с помощью команды mkdir:

      • mkdir environments
      • cd environments

      Для создания среды перейдите в каталог, где вы хотите разместить среды, и введите следующую команду:

      Команда pyvenv настраивает новый каталог, содержащий несколько элементов, которые мы можем просмотреть с помощью команды ls:

      Output

      bin include lib lib64 pyvenv.cfg share

      Совместная работа этих файлов обеспечивает изоляцию ваших проектов в более широком контексте вашего сервера, так что системные файлы и файлы проекта не смешиваются. Будет очень полезно использовать контроль версий и обеспечить каждому из ваших проектов доступ к конкретным пакетам, которые ему необходимы. Python Wheels — это формат готовых пакетов для Python, который помогает ускорить разработку программного обеспечения за счет сокращения количества операций компиляции. Он находится в каталоге share в Ubuntu 20.04.

      Чтобы использовать эту среду, ее нужно активировать. Для этого введите следующую команду, вызывающую скрипт activate:

      • source my_env/bin/activate

      В командной строке теперь будет отображаться имя вашей среды, в данном случае my_env. В зависимости от используемой версии Debian Linux префикс может выглядеть несколько иначе, однако называние вашей среды в скобках — это первое, что вы увидите в строке:

      Префикс сообщает нам, что среда my_env активна, и что при создании программ они будут использовать настройки и пакеты этой конкретной среды.

      Примечание. В виртуальной среде вы можете при желании использовать команду python вместо python3 и команду pip вместо pip3. Если вы используете Python 3 на компьютере вне виртуальной среды, вы можете использовать только команды python3 и pip3.

      После выполнения этих шагов ваша виртуальная среда готова к использованию.

      Шаг 3 — Создание программы «Hello, World»

      Теперь мы настроили нашу виртуальную среду и готовы создать традиционную программу «Hello, World!» Это позволит нам протестировать нашу среду и познакомиться с Python поближе, если мы еще не сделали этого.

      Для этого мы откроем текстовый редактор командной строки (например, nano) и создадим новый файл:

      Когда текстовый файл откроется в окне терминала, мы введем нашу программу:

      print("Hello, World!")
      

      Для выхода из nano нажмите клавиши CTRL и X, а когда система предложит вам сохранить файл, нажмите клавишу y.

      После выхода из nano и возврата в оболочку мы запустим программу:

      Программа hello.py, которую вы только что создали, выведет на вашем терминале следующее:

      Output

      Hello, World!

      Для выхода из среды введите команду deactivate, и вы вернетесь в исходный каталог.

      Заключение

      Поздравляем! Вы настроили среду программирования Python 3 на своем сервере Ubuntu Linux и теперь можете начинать проект по программированию!

      Если вы используете локальный компьютер, а не сервер, воспользуйтесь обучающем модулем «Установка и настройка локальной среды программирования для Python 3» для вашей операционной системы.

      Теперь ваш сервер готов к разработке программного обеспечения. А дополнительную информацию о программировании на Python вы можете узнать из нашей бесплатной электронной книги «Программирование на Python 3» или в обучающих руководствах по Python.



      Source link

      Установка Python 3 и создание среды программирования в Ubuntu 20.04 [Краткое руководство]


      Введение

      Python — гибкий и универсальный язык программирования, хорошо подходящий для создания скриптов, автоматизации, анализа данных, машинного обучения и разработки серверной части приложений.

      В этом обучающем руководстве вы научитесь устанавливать Python и создавать среду программирования на сервере Ubuntu 20.04. Более подробную версию настоящего обучающего руководства с детальными разъяснениями каждого шага можно найти в обучающем руководстве Установка Python 3 и настройка среды программирования на сервере Ubuntu 20.04.

      Шаг 1 — Обновление и модернизация

      Выполните вход на сервер Ubuntu 20.04 как non-root user с привилегиями sudo, затем выполните обновление системы и убедитесь, что предустановленная версия Python 3 актуальна.

      • sudo apt update
      • sudo apt -y upgrade

      Подтвердите установку, если система предложит вам это.

      Шаг 2 — Проверьте версию Python

      Проверьте установленную версию Python 3 с помощью следующей команды:

      Вы получите примерно следующий результат, в зависимости от времени обновления вашей системы.

      Output

      Python 3.8.2

      Шаг 3 — Установка pip

      Для управления программными пакетами Python необходимо выполнить установку инструмента pip, который будет управлять библиотеками и модулями ваших проектов.

      • sudo apt install -y python3-pip

      Пакеты Python можно установить с помощью следующей команды:

      • pip3 install package_name

      Здесь package_name может относиться к любому пакету или любой библиотеке Python, в том числе Django для веб-разработки или NumPy для научных вычислений. Если вы захотите установить NumPy, вы можете использовать команду pip3 install numpy.

      Шаг 4 — Установка дополнительных инструментов

      Можжно установить несколько дополнительных пакетов и средств разработки, чтобы получить надежную основу для нашей среды программирования:

      • sudo apt install build-essential libssl-dev libffi-dev python3-dev

      Шаг 5 — Установка venv

      Виртуальные среды позволяют выделить на сервере изолированное пространство для проектов Python. Мы будем использовать venv, часть стандартной библиотеки Python 3. Для ее установки нужно ввести:

      • sudo apt install -y python3-venv

      Шаг 6 — Создание виртуальной среды

      Вы можете создать новую среду с помощью команды pyvenv. Здесь для примера мы назовем нашу новую среду my_env, но вы должны выбрать для своей среды имя, значимое для вашего проекта.

      Шаг 7 — Активизация виртуальной среды

      Активируйте среду с помощью следующей команды. где my_env — имя вашей среды программирования.

      • source my_env/bin/activate

      Командная строка теперь будет иметь префикс с именем вашей среды:

      Шаг 8 — Тестирование виртуальной среды

      Откройте интерпретатор Python:

      Обратите внимание, что в виртуальной среде Python 3 вы можете использовать команду python вместо python3 и pip вместо pip3.

      Вы поймете, что интерпретатор открыт, когда увидите следующее:

      Python 3.8.2 (default, Mar 13 2020, 10:14:16)
      [GCC 9.3.0] on linux
      Type "help", "copyright", "credits" or "license" for more information.
      >>>
      

      Теперь используйте функцию print() для создания традиционной программы Hello, World:

      Output

      Hello, World!

      Шаг 9 — Отключение виртуальной среды

      Закройте интерпретатор Python:

      Закройте виртуальную среду:

      Дополнительное чтение

      Узнать больше о Python можно, изучив информацию по следующим ссылкам:



      Source link