Добро пожаловать в этот учебник по Python! Это вторая часть учебника. В этой части вы изучите класс, модули и пакеты Python. Вы можете найти Часть I и Часть II здесь.

Введение в класс

Python — это универсальный язык программирования, который можно использовать для различных целей. Одной из ключевых особенностей Python является возможность использовать принципы объектно-ориентированного программирования (ООП) для создания сложных программ. В ООП разработчики используют классы для определения новых типов данных, которые затем можно использовать для создания объектов.

В этом руководстве мы познакомимся с основами классов в Python, в том числе с тем, как определить класс, как создать объекты из класса и как определить методы и атрибуты класса.

Что такое класс?

В Python класс — это план создания объектов. Он определяет набор атрибутов и методов, которые будут иметь объекты этого типа. Думайте о классе как о шаблоне для создания объектов в Python.

Чтобы определить класс в Python, мы используем ключевое слово class, за которым следует имя класса. Например, чтобы определить класс с именем Person, мы должны написать:

class Person:
    pass

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

Создание объектов из класса

Как только мы определили класс, мы можем создавать из него объекты. Объекты являются экземплярами класса, и каждый объект имеет собственный набор атрибутов и методов. Мы создаем объект из класса, вызывая имя класса, за которым следуют круглые скобки. Например:

class Person:
    pass
person1 = Person()

Здесь мы создаем новый объект person1 класса Person. Person() вызывает конструктор класса, который создает новый экземпляр объекта Person.

Атрибуты

Атрибуты — это переменные, которые содержат данные для каждого объекта класса. Мы можем определить атрибуты для класса, включив их в определение класса. Например, давайте добавим атрибут name в класс Person:

class Person:
    def __init__(self, name):
        self.name = name

person1 = Person("Alice")
print(person1.name)

Здесь мы определяем метод конструктора с именем init, который принимает аргумент name и присваивает его атрибуту self.name. Когда мы создаем новый объект person1, мы передаем аргумент «Алиса», который устанавливает для атрибута имени значение «Алиса». Наконец, мы печатаем атрибут имени человека1, который должен вывести «Алиса».

Методы

Методы — это функции, принадлежащие классу и работающие с экземплярами этого класса. Мы можем определить методы для класса, включив их в определение класса. Например, давайте добавим метод приветствия в класс Person:

class Person:
    def __init__(self, name):
        self.name = name

    def greet(self):
        print(f"Hello, my name is {self.name}")

person1 = Person("Alice")
person1.greet()

Здесь мы определяем метод приветствия, который печатает приветственное сообщение, включая имя человека. Мы можем вызвать этот метод для любого объекта Person, как показано выше.

себя

В Python self — это ссылка на экземпляр класса, которым манипулируют. Это способ экземпляра ссылаться на себя в своих собственных методах. По соглашению self является первым параметром любого метода в классе. Когда вы создаете объект класса, Python автоматически передает этот объект в качестве первого аргумента любому методу класса.

Например, предположим, что у нас есть класс с именем Person, который представляет человека с именем и возрастом. Мы хотим определить метод с именем Introduction, который печатает имя и возраст человека. Вот как может выглядеть код:

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age
  
    def introduce(self):
        print("Hi, my name is", self.name, "and I am", self.age, "years old.")

В методе введения мы используем self.name и self.age для обозначения имени и возраста объекта-человека, для которого вызывается метод. Когда мы создаем объект Person и вызываем для него метод Introduction, Python автоматически передает объект в качестве параметра self. Например:

person1 = Person("Alice", 30)
person2 = Person("Bob", 40)
person1.introduce()  # prints "Hi, my name is Alice and I am 30 years old."
person2.introduce()  # prints "Hi, my name is Bob and I am 40 years old."

Наследование

Наследование — это способ создания нового класса, являющегося модифицированной версией существующего класса. Новый класс (известный как подкласс) наследует все атрибуты и методы существующего класса (известного как суперкласс), а также может определять свои собственные атрибуты и методы.

Чтобы создать подкласс, мы определяем новый класс, который наследуется от существующего класса, помещая имя суперкласса в круглые скобки после имени нового класса. Например, давайте определим класс Student, который наследуется от класса Person:

class Student(Person):
    def __init__(self, name, age, student_id):
        super().__init__(name, age)
        self.student_id = student_id
     
    def student_info(self):
        print(f"Name: {self.name}, age: {self.age}, Student ID: {self.student_id}")

student1 = Student("Bob", 18, 12345)
student1.student_info()

Здесь мы определяем новый класс Student, который наследуется от Person. Мы определяем новый метод конструктора, который принимает аргумент имени и аргумент student_id. Мы вызываем метод super().init(name) для установки атрибута name, унаследованного от класса Person.

Мы также определяем новый метод student_info, который печатает атрибуты name и student_id объекта student. Мы создаем новый объект student1 класса Student и вызываем метод student_info.

Модуль и пакет

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

Модули

Модуль — это файл, содержащий определения и операторы Python. По сути, это способ организации кода в отдельные файлы. Чтобы использовать код из модуля, его необходимо импортировать. Например, предположим, что у нас есть модуль с именем my_module.py (в том же каталоге), который определяет функцию с именем my_function. Вот как мы его импортируем:

import my_module

my_module.my_function()

Здесь мы импортируем весь модуль my_module и вызываем его функцию my_function. Обратите внимание, что мы используем запись через точку для доступа к функции внутри модуля.

Вы также можете импортировать определенные функции или переменные из модуля, используя ключевое слово from. Например:

from my_module import my_function

my_function()

Здесь мы импортируем только функцию my_function из модуля my_module. Затем мы можем вызвать его напрямую, не используя запись через точку.

Упаковка

Пакет — это способ организации связанных модулей вместе в иерархии каталогов. Пакеты позволяют создавать пространство имен для вашего кода, поэтому вы можете избежать конфликтов имен с другим кодом. Чтобы создать пакет, вы просто создаете каталог с пустым __init__.py файлом в нем. Например, предположим, что у нас есть пакет с именем my_package, который содержит два модуля с именами module1.py и module2.py.

my_package/
├── __init__.py
├── module1.py
└── module2.py

Вот как мы будем их импортировать:

import my_package.module1
import my_package.module2

my_package.module1.my_function()
my_package.module2.my_other_function()

Здесь мы импортируем модули module1 и module2 из пакета my_package. Затем мы можем использовать запись через точку для доступа к функциям внутри каждого модуля.

Вы также можете использовать ключевое слово from для импорта определенных модулей или функций из пакета. Например:

from my_package import module1
module1.my_function()

Здесь мы импортируем только модуль module1 из пакета my_package. Затем мы можем напрямую вызвать его функцию my_function.

Псевдоним

Можно использовать псевдоним для импортированного модуля или функции, используя ключевое слово as. Это может быть полезно, когда вы хотите избежать конфликтов имен или когда вы хотите дать более короткое или более удобное имя модулю или функции. Вот пример:

import my_module as mm
mm.my_function()

В этом примере мы импортируем модуль my_module и даем ему псевдоним mm. Затем мы можем вызвать его функцию my_function, используя псевдоним mm вместо полного имени модуля.

Точно так же вы также можете использовать псевдоним при импорте определенной функции или переменной из модуля с помощью ключевого слова from. Вот пример:

from my_module import my_function as mf
mf()

В этом примере мы импортируем функцию my_function из модуля my_module и даем ей псевдоним mf. Затем мы можем вызвать его, используя псевдоним mf вместо исходного имени функции.

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

Импортировать все

Синтаксис from module import * позволяет вам импортировать все имена, определенные в модуле, в ваше текущее пространство имен. Хотя это может показаться удобным способом избежать ввода длинных имен модулей, обычно это не рекомендуется в программировании на Python. Одна из причин заключается в том, что это может затруднить чтение и понимание вашего кода, поскольку не сразу понятно, какие имена определены модулем, а какие — где-то еще. Это также может привести к конфликту имен, если модуль и текущее пространство имен определяют имена с одним и тем же именем. Кроме того, это может затруднить отладку, поскольку вы можете не знать источник определенного имени в своем коде. В качестве наилучшей практики рекомендуется импортировать из модуля только те имена, которые вам нужны, и избегать использования синтаксиса from module import *.

Стандартная библиотека

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

  • os: предоставляет способ взаимодействия с операционной системой, например, работу с файлами и каталогами.
  • datetime: предоставляет классы для работы с датами и временем.
  • math: предоставляет математические функции, такие как тригонометрия и логарифмы.
  • random: предоставляет функции для генерации случайных чисел
  • re: обеспечивает операции сопоставления регулярных выражений.
  • json: предоставляет функции для работы с данными JSON. Чтобы использовать модуль из стандартной библиотеки, вы просто импортируете его, как и любой другой модуль. Например:
import datetime
today = datetime.date.today()
print(today)

Здесь мы используем модуль datetime, чтобы получить сегодняшнюю дату и вывести ее на консоль.

os модуль

Модуль os в Python предоставляет способ взаимодействия с операционной системой. Он позволяет выполнять такие задачи, как навигация по файловой системе, создание и удаление файлов и каталогов, а также выполнение системных команд. Вот несколько примеров использования модуля os:

  1. Получение текущего рабочего каталога:
import os
current_dir = os.getcwd()
print(current_dir)

Этот код импортирует модуль os и вызывает функцию getcwd() для получения текущего рабочего каталога. Затем он выводит путь к каталогу на консоль.

2. Создание нового каталога:

import os
new_dir = "new_directory"
os.mkdir(new_dir)

Этот код создает новый каталог с именем «new_directory» в текущем рабочем каталоге с помощью функции mkdir().

3. Запуск системной команды:

import os
os.system("ls -l")

Этот код выполняет команду ls -l в системной оболочке с помощью функции system().

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

math модуль

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

import math

Вот некоторые из часто используемых математических функций и констант, предоставляемых математическим модулем в Python:

  1. Константы
  • math.pi: Математическая константа пи (3,141592...).
  • math.e: Математическая константа e (2,718281...).
  • math.inf: положительная бесконечность с плавающей запятой.

2. Основные математические функции

  • math.sqrt(x): возвращает квадратный корень из x.
  • math.pow(x, y): возвращает x, возведенный в степень y.
  • math.exp(x): возвращает экспоненту x.
  • math.log(x, [base]): возвращает логарифм x по заданному основанию (по умолчанию натуральный логарифм).
  • math.log2(x): возвращает логарифм x по основанию 2.
  • math.log10(x): возвращает логарифм x по основанию 10.

3. Тригонометрические функции

  • math.sin(x): возвращает синус x (в радианах).
  • math.cos(x): возвращает косинус x (в радианах).
  • math.tan(x): возвращает тангенс x (в радианах).

4. Другие

  • math.fabs(x): возвращает абсолютное значение x
  • math.isclose(a, b): возвращает True, если a и b близки, иначе False

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

random модуль

Модуль random в Python предоставляет функции для генерации случайных чисел и выбора случайных элементов из последовательностей. Он обычно используется в таких приложениях, как моделирование, игры и криптография. Вот несколько примеров использования модуля random:

  1. Генерация случайных целых чисел:
import random
rand_int = random.randint(1, 10)
print(rand_int)

Этот код импортирует модуль random и генерирует случайное целое число от 1 до 10 с помощью функции randint().

2. Выбор случайного элемента из списка:

import random
my_list = ["apple", "banana", "cherry", "date"]
rand_item = random.choice(my_list)
print(rand_item)

Этот код создает список фруктов и выбирает случайный фрукт из списка с помощью функции selection().

3. Перетасовка списка:

import random
my_list = ["apple", "banana", "cherry", "date"]
random.shuffle(my_list)
print(my_list)

Этот код перемешивает элементы в списке с помощью функции shuffle(). Элементы в списке будут переставлены в случайном порядке.

Модуль random также предоставляет функции для генерации случайных чисел с плавающей запятой, выбора нескольких случайных элементов из последовательности и генерации случайных чисел с различными распределениями (такими как нормальное распределение). Используя модуль random, вы можете добавить в свои программы на Python элемент непредсказуемости и случайности.

Сторонние библиотеки

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

  • numpy: обеспечивает поддержку больших многомерных массивов и матриц, а также библиотеку математических функций для эффективной работы с ними.
  • pandas: предоставляет высокоуровневый инструмент для обработки структурированных данных (например, таблиц, фреймов данных) и имеет функции для очистки, агрегирования и анализа данных.
  • matplotlib: предоставляет библиотеку для создания статических, анимированных и интерактивных визуализаций в Python. Он имеет широкий спектр функций построения графиков для создания линейных графиков, точечных диаграмм, гистограмм и многого другого.
  • scikit-learn: предоставляет библиотеку для машинного обучения в Python. Он включает алгоритмы классификации, регрессии, кластеризации и уменьшения размерности, а также инструменты для выбора и оценки моделей.

Эти и многие другие библиотеки можно установить с помощью диспетчера пакетов Python pip. Например

pip install numpy

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