Определение и импорт модулей Python

Beginner

This tutorial is from open-source community. Access the source code

Введение

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

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

Это Guided Lab, который предоставляет пошаговые инструкции, чтобы помочь вам учиться и практиковаться. Внимательно следуйте инструкциям, чтобы выполнить каждый шаг и получить практический опыт. Исторические данные показывают, что это лабораторная работа уровня начальный с процентом завершения 97%. Он получил 100% положительных отзывов от учащихся.

Понимание модулей Python

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

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

  1. Сначала откроем файл stock.py в редакторе, чтобы посмотреть, что в нем находится. Для этого мы будем использовать следующие команды. Команда cd изменяет текущую директорию на папку project, где находится наш файл, а команда cat отображает содержимое файла.
cd ~/project
cat stock.py

В этом файле stock.py определен класс Stock. Класс представляет собой чертеж для создания объектов. В данном случае класс Stock представляет акцию. У него есть атрибуты (которые похожи на характеристики) для названия акции, количества акций и цены. Также у него есть метод (который похож на функцию, связанную с классом) для расчета стоимости акции.

  1. Теперь рассмотрим файл pcost.py. Мы снова используем команду cat, чтобы просмотреть его содержимое.
cat pcost.py

В этом файле определена функция portfolio_cost(). Функция представляет собой блок кода, который выполняет определенную задачу. Функция portfolio_cost() считывает файл с портфелем и вычисляет общую стоимость всех акций в этом портфеле.

  1. Теперь посмотрим на пример данных о портфеле. Мы используем команду cat, чтобы просмотреть содержимое файла portfolio.dat.
cat portfolio.dat

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

Использование оператора import

Оператор import в Python - это мощный инструмент, который позволяет использовать код из других модулей в текущей программе. Это похоже на то, что вы заимствуете инструменты из других ящиков с инструментами. Давайте потренируемся использовать разные способы импорта кода:

  1. Сначала нам нужно запустить интерпретатор Python. Интерпретатор Python - это программа, которая выполняет код на Python. Мы используем следующую команду, чтобы запустить его.
python3
  1. Теперь импортируем модуль pcost и посмотрим, что произойдет. Когда мы используем оператор import, Python ищет файл pcost.py и делает код внутри него доступным для использования.
import pcost

Вы должны увидеть вывод 44671.15. Это рассчитанная стоимость портфеля из файла portfolio.dat. Когда модуль pcost импортируется, код внизу файла pcost.py запускается автоматически.

  1. Попробуем вызвать функцию portfolio_cost() с другим файлом портфеля. Мы используем синтаксис pcost.portfolio_cost(), чтобы вызвать функцию из модуля pcost.
pcost.portfolio_cost('portfolio2.dat')

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

  1. Теперь импортируем конкретный класс из модуля stock. Вместо импорта всего модуля мы можем импортировать только класс Stock с помощью оператора from...import.
from stock import Stock
  1. После импорта класса Stock мы можем создать объект Stock. Объект представляет собой экземпляр класса. Мы создадим объект Stock с именем GOOG, 100 акциями и ценой 490.10. Затем мы выведем название акции и вычислим ее стоимость с помощью метода cost().
s = Stock('GOOG', 100, 490.10)
print(s.name)
print(s.cost())

Вывод должен быть:

GOOG
49010.0
  1. Наконец, когда мы закончили использовать интерпретатор Python, мы можем выйти из него, используя функцию exit().
exit()

В этой лабораторной работе были продемонстрированы два разных способа импорта кода на Python:

  • import module_name - Это импортирует весь модуль, делая все функции, классы и переменные в этом модуле доступными для использования.
  • from module_name import specific_item - Это импортирует только конкретный элемент (например, класс или функцию) из модуля, что может быть полезно, если вам нужна только часть функциональности модуля.

Понимание основного модуля в Python

В Python, когда вы запускаете скрипт напрямую, он выступает в роли "основного" модуля. Python имеет специальную переменную с именем __name__. Когда файл выполняется напрямую, Python устанавливает значение переменной __name__ равным "__main__". Это отличается от ситуации, когда файл импортируется как модуль.

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

Изменение файла pcost.py для использования шаблона основного модуля

Давайте изменим программу pcost.py, чтобы воспользоваться этим шаблоном.

  1. Сначала вам нужно открыть файл pcost.py в редакторе. Вы можете использовать следующие команды, чтобы перейти в директорию проекта и создать файл, если он не существует:
cd ~/project
touch pcost.py

Команда cd изменяет текущую директорию на директорию project в вашей домашней директории. Команда touch создает новый файл с именем pcost.py, если он еще не существует.

  1. Теперь измените файл pcost.py так, чтобы он выглядел следующим образом:
## pcost.py

def portfolio_cost(filename):
    total_cost = 0.0

    with open(filename, 'r') as f:
        for line in f:
            fields = line.split()
            try:
                nshares = int(fields[1])
                price = float(fields[2])
                total_cost += nshares * price
            except (ValueError, IndexError):
                print(f"Couldn't parse: {line}")

    return total_cost

## This code only runs when the file is executed as a script
if __name__ == "__main__":
    total = portfolio_cost('portfolio.dat')
    print(total)

Основное изменение здесь заключается в том, что мы обернули код в конце в условие if __name__ == "__main__":. Это означает, что код внутри этого блока будет выполняться только при прямом запуске файла как скрипта, а не при его импорте как модуля.

  1. После внесения этих изменений сохраните файл и выйдите из редактора.

Тестирование измененного модуля

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

  1. Сначала запустите программу напрямую как скрипт, используя следующую команду:
python3 pcost.py

Вы должны увидеть вывод 44671.15, как и раньше. Это происходит потому, что при прямом запуске скрипта переменная __name__ устанавливается равной "__main__", поэтому код внутри блока if __name__ == "__main__": выполняется.

  1. Затем запустите интерпретатор Python снова и импортируйте модуль:
python3
import pcost

На этот раз вы не увидите никакого вывода. Когда вы импортируете модуль, переменная __name__ устанавливается равной "pcost" (имени модуля), а не "__main__". Поэтому код внутри блока if __name__ == "__main__": не выполняется.

  1. Чтобы убедиться, что функция portfolio_cost по - прежнему работает, вы можете вызвать ее следующим образом:
pcost.portfolio_cost('portfolio.dat')

Функция должна вернуть 44671.15, что означает, что она работает корректно.

  1. Наконец, выйдите из интерпретатора Python, используя следующую команду:
exit()

Этот шаблон очень полезен при создании файлов на Python, которые могут быть использованы как импортируемые модули, так и как самостоятельные скрипты. Код внутри блока if __name__ == "__main__": выполняется только при прямом запуске файла, а не при его импорте как модуля.

Создание собственного модуля

Теперь, когда вы понимаете, как использовать существующие модули, пришло время создать новый модуль с нуля. Модуль в Python - это файл, содержащий определения и инструкции на Python. Он позволяет организовать ваш код на переиспользуемые и управляемые части. Создав собственный модуль, вы можете сгруппировать связанные функции и переменные вместе, сделав ваш код более модульным и легким в поддержке.

Создание модуля для отчетов

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

  1. Сначала нам нужно создать новый файл с именем report.py. Для этого мы воспользуемся командной строкой. Перейдите в директорию project в своей домашней директории и создайте файл с помощью команды touch.
cd ~/project
touch report.py
  1. Теперь откройте файл report.py в предпочитаемом текстовом редакторе и добавьте следующий код. Этот код определяет две функции и основной блок.
## report.py

def read_portfolio(filename):
    """
    Read a stock portfolio file into a list of dictionaries with
    keys: name, shares, price
    """
    portfolio = []
    with open(filename, 'r') as f:
        for line in f:
            fields = line.split()
            try:
                stock = {
                    'name': fields[0],
                    'shares': int(fields[1]),
                    'price': float(fields[2])
                }
                portfolio.append(stock)
            except (ValueError, IndexError):
                print(f"Couldn't parse: {line}")
    return portfolio

def print_report(portfolio):
    """
    Print a report showing the stock name, shares, price, and total value
    """
    print("Name    Shares    Price    Value")
    print("-" * 40)
    total_value = 0.0
    for stock in portfolio:
        value = stock['shares'] * stock['price']
        total_value += value
        print(f"{stock['name']:6s} {stock['shares']:9d} {stock['price']:9.2f} {value:9.2f}")
    print("-" * 40)
    print(f"Total Value: {total_value:16.2f}")

if __name__ == "__main__":
    portfolio = read_portfolio('portfolio.dat')
    print_report(portfolio)

Функция read_portfolio читает файл, содержащий информацию об акциях, и возвращает список словарей, где каждый словарь представляет собой акцию с ключами name, shares и price. Функция print_report принимает портфель (список словарей с акциями) и выводит отформатированный отчет, показывающий название акции, количество акций, цену и общую стоимость. Основной блок в конце выполняется, когда файл запускается напрямую. Он читает файл с портфелем и выводит отчет.

  1. После добавления кода сохраните файл и выйдите из редактора.

Тестирование вашего модуля

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

  1. Сначала мы запустим скрипт напрямую из командной строки. Это выполнит основной блок в файле report.py.
python3 report.py

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

Name    Shares    Price    Value
----------------------------------------
AA         100     32.20   3220.00
IBM         50     91.10   4555.00
CAT        150     83.44  12516.00
MSFT       200     51.23  10246.00
GE          95     40.37   3835.15
MSFT        50     65.10   3255.00
IBM        100     70.44   7044.00
----------------------------------------
Total Value:         44671.15
  1. Затем мы будем использовать модуль из интерпретатора Python. Запустите интерпретатор Python, выполнив команду python3 в терминале.
python3

После запуска интерпретатора мы можем импортировать модуль report и использовать его функции.

import report
portfolio = report.read_portfolio('portfolio.dat')
len(portfolio)  ## Should return 7, the number of stocks
portfolio[0]    ## First stock in the portfolio

Инструкция import report делает доступными функции и переменные, определенные в файле report.py, в текущей сессии Python. Затем мы используем функцию read_portfolio для чтения файла с портфелем и сохраняем результат в переменной portfolio. Инструкция len(portfolio) возвращает количество акций в портфеле, а portfolio[0] возвращает первую акцию в портфеле.

Вы должны увидеть следующий вывод:

7
{'name': 'AA', 'shares': 100, 'price': 32.2}
  1. Теперь давайте используем импортированный модуль, чтобы самостоятельно рассчитать общую стоимость портфеля. Мы будем перебирать акции в портфеле и суммировать общую стоимость каждой акции.
total = 0.0
for stock in portfolio:
    total += stock['shares'] * stock['price']
print(total)

Вывод должен быть 44671.15, что совпадает с общей стоимостью, выведенной функцией print_report.

  1. Наконец, давайте создадим настраиваемый отчет для определенного типа акций. Мы отфильтруем портфель, чтобы он включал только акции IBM, а затем используем функцию print_report для вывода отчета по этим акциям.
ibm_stocks = [stock for stock in portfolio if stock['name'] == 'IBM']
report.print_report(ibm_stocks)

Это должно вывести отчет, показывающий только акции IBM и их стоимость.

Name    Shares    Price    Value
----------------------------------------
IBM         50     91.10   4555.00
IBM        100     70.44   7044.00
----------------------------------------
Total Value:         11599.00
  1. Когда вы закончите тестирование, выйдите из интерпретатора Python, выполнив команду exit().
exit()

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

Резюме

В этом практическом занятии (лабораторной работе) вы изучили основные концепции модулей Python и научились использовать их для организации кода. Модули - это файлы на Python, содержащие переиспользуемый код, а оператор import позволяет использовать код из других модулей в вашей программе. Шаблон if __name__ == "__main__" позволяет файлам работать как в качестве импортируемых модулей, так и как самостоятельные скрипты.

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