Создание собственного модуля
Теперь, когда вы понимаете, как использовать существующие модули, пришло время создать новый модуль с нуля. Модуль в Python - это файл, содержащий определения и инструкции на Python. Он позволяет организовать ваш код на переиспользуемые и управляемые части. Создав собственный модуль, вы можете сгруппировать связанные функции и переменные вместе, сделав ваш код более модульным и легким в поддержке.
Создание модуля для отчетов
Давайте создадим простой модуль для генерации отчетов о акциях. Этот модуль будет содержать функции для чтения файла с портфелем и вывода отформатированного отчета об акциях в портфеле.
- Сначала нам нужно создать новый файл с именем
report.py. Для этого мы воспользуемся командной строкой. Перейдите в директорию project в своей домашней директории и создайте файл с помощью команды touch.
cd ~/project
touch report.py
- Теперь откройте файл
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 принимает портфель (список словарей с акциями) и выводит отформатированный отчет, показывающий название акции, количество акций, цену и общую стоимость. Основной блок в конце выполняется, когда файл запускается напрямую. Он читает файл с портфелем и выводит отчет.
- После добавления кода сохраните файл и выйдите из редактора.
Тестирование вашего модуля
Давайте протестируем наш новый модуль, чтобы убедиться, что он работает как ожидается.
- Сначала мы запустим скрипт напрямую из командной строки. Это выполнит основной блок в файле
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
- Затем мы будем использовать модуль из интерпретатора 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}
- Теперь давайте используем импортированный модуль, чтобы самостоятельно рассчитать общую стоимость портфеля. Мы будем перебирать акции в портфеле и суммировать общую стоимость каждой акции.
total = 0.0
for stock in portfolio:
total += stock['shares'] * stock['price']
print(total)
Вывод должен быть 44671.15, что совпадает с общей стоимостью, выведенной функцией print_report.
- Наконец, давайте создадим настраиваемый отчет для определенного типа акций. Мы отфильтруем портфель, чтобы он включал только акции 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
- Когда вы закончите тестирование, выйдите из интерпретатора Python, выполнив команду
exit().
exit()
Теперь вы успешно создали и использовали собственный модуль на Python, объединив функции и основной блок, который выполняется только при прямом запуске файла. Такой модульный подход к программированию позволяет переиспользовать код и сделать ваши проекты более организованными и легкими в поддержке.