简介
在这个实验中,你将学习如何增强一个用于表示股票持仓的 Stock
类。你将为这个类添加新的方法和功能,使其更加通用和实用。
这个实验的目标包括:为现有的 Stock
类添加一个 sell
方法,创建一个从 CSV 文件中读取股票投资组合数据的函数,以及另一个以格式化表格形式显示投资组合数据的函数。需要修改的文件是 stock.py
。
This tutorial is from open-source community. Access the source code
💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版
在这个实验中,你将学习如何增强一个用于表示股票持仓的 Stock
类。你将为这个类添加新的方法和功能,使其更加通用和实用。
这个实验的目标包括:为现有的 Stock
类添加一个 sell
方法,创建一个从 CSV 文件中读取股票投资组合数据的函数,以及另一个以格式化表格形式显示投资组合数据的函数。需要修改的文件是 stock.py
。
在这一步中,我们将通过添加一个新方法来增强 Stock
类。方法类似于属于某个类的特殊函数,它可以对从该类创建的对象进行操作。我们将创建一个名为 sell(nshares)
的方法,该方法将帮助我们模拟出售股票的操作。当你出售股票时,你持有的股票数量会减少,这个方法将为我们处理这种数量的减少。
让我们首先了解一下什么是方法。方法是定义在类内部的函数。它旨在对该类的实例(类似于单个副本)进行操作。当在对象上调用方法时,它可以访问该对象的所有属性(特征)。这是通过 self
参数实现的。self
参数是对调用该方法的对象的引用。因此,当你在方法内部使用 self
时,你指的是该方法正在操作的特定对象。
stock.py
文件。为此,我们将使用命令行。打开你的终端并运行以下命令。此命令将目录更改为包含 stock.py
文件的 project
文件夹。cd ~/project
打开 stock.py
文件后,你需要在 Stock
类中找到一个特定的注释。查找注释 ## TODO: Add sell(nshares) method here
。这个注释是一个占位符,指示我们应该在哪里添加新的 sell
方法。
现在,是时候添加 sell
方法了。这个方法将接受一个名为 nshares
的参数,该参数表示你要出售的股票数量。这个方法的主要任务是将 Stock
对象的 shares
属性减少你要出售的股票数量。
以下是你需要添加的 sell
方法的代码:
def sell(self, nshares):
self.shares -= nshares
在这段代码中,self.shares
指的是 Stock
对象的 shares
属性。-=
运算符从 self.shares
的当前值中减去 nshares
的值。
添加 sell
方法后,你需要保存 stock.py
文件。你可以通过按下键盘上的 Ctrl+S
组合键,或者在编辑器的菜单中选择“文件 > 保存”来完成保存操作。
为了确保我们的 sell
方法能正常工作,我们将创建一个测试脚本。创建一个名为 test_sell.py
的新 Python 文件,并在其中添加以下代码:
## test_sell.py
from stock import Stock
## Create a stock object
s = Stock('GOOG', 100, 490.10)
print(f"Initial shares: {s.shares}")
## Sell 25 shares
s.sell(25)
print(f"Shares after selling: {s.shares}")
在这个脚本中,我们首先从 stock.py
文件中导入 Stock
类。然后,我们创建一个名为 s
的 Stock
对象,其股票代码为 GOOG
,持有 100 股,价格为 490.10。我们打印初始的股票数量。之后,我们在 s
对象上调用 sell
方法来出售 25 股。最后,我们打印出售后的股票数量。
sell
方法是否按预期工作。再次打开你的终端并运行以下命令:python3 test_sell.py
如果一切正常,你应该会看到类似于以下的输出:
Initial shares: 100
Shares after selling: 75
这个输出确认了我们的 sell
方法工作正常。它已成功将股票数量减少了我们指定的数量。
在这一步中,我们将创建一个函数,用于从 CSV 文件中读取股票数据,并返回一个 Stock
对象列表。Stock
对象代表股票持仓,完成这一步后,你将能够从 CSV 文件中读取股票投资组合。
CSV 是逗号分隔值(Comma-Separated Values)的缩写,它是一种非常常见的存储表格数据的格式。你可以把它想象成一个简单的电子表格。CSV 文件中的每一行代表一行数据,行内的各列由逗号分隔。通常,CSV 文件的第一行包含表头,这些表头描述了每列数据的类型。例如,在一个股票投资组合的 CSV 文件中,表头可能是“名称”、“股数”和“价格”。
首先,在你的代码编辑器中打开 stock.py
文件。如果已经打开了,那就很好;如果没有,找到并打开它。我们将在这个文件中添加新的函数。
打开 stock.py
文件后,查找注释 ## TODO: Add read_portfolio(filename) function here
。这个注释是一个占位符,指示我们应该在哪里添加新的函数。
在该注释下方,添加以下函数。这个函数名为 read_portfolio
,它接受一个文件名作为参数。该函数的目的是读取 CSV 文件,提取股票数据,并创建一个 Stock
对象列表。
def read_portfolio(filename):
"""
Read a CSV file containing portfolio data and return a list of Stock objects.
Args:
filename (str): Path to the CSV file
Returns:
list: A list of Stock objects
"""
portfolio = []
with open(filename, 'r') as f:
headers = next(f).strip().split(',') ## Skip the header line
for line in f:
row = line.strip().split(',')
name = row[0]
shares = int(row[1])
price = float(row[2])
## Create a Stock object and add it to the portfolio list
stock = Stock(name, shares, price)
portfolio.append(stock)
return portfolio
让我们来详细分析这个函数的功能。首先,它创建了一个名为 portfolio
的空列表。然后,它以只读模式打开 CSV 文件。next(f)
语句跳过了第一行,即表头行。之后,它遍历文件中的每一行。对于每一行,它将行分割成一个值列表,提取名称、股数和价格,创建一个 Stock
对象,并将其添加到 portfolio
列表中。最后,它返回 portfolio
列表。
添加函数后,保存 stock.py
文件。你可以通过按下键盘上的 Ctrl+S
组合键,或者在代码编辑器的菜单中选择“文件 > 保存”来完成保存操作。保存文件可确保你的更改得以保留。
现在,我们需要测试 read_portfolio
函数。创建一个名为 test_portfolio.py
的新 Python 脚本。这个脚本将从 stock.py
文件中导入 read_portfolio
函数,从 CSV 文件中读取投资组合,并打印投资组合中每只股票的信息。
## test_portfolio.py
from stock import read_portfolio
## Read the portfolio from the CSV file
portfolio = read_portfolio('portfolio.csv')
## Print information about each stock
for stock in portfolio:
print(f"Name: {stock.name}, Shares: {stock.shares}, Price: ${stock.price:.2f}")
## Print the total number of stocks in the portfolio
print(f"\nTotal number of stocks in portfolio: {len(portfolio)}")
在这个脚本中,我们首先导入 read_portfolio
函数。然后,我们使用文件名 portfolio.csv
调用该函数,以获取 Stock
对象列表。接着,我们遍历该列表并打印每只股票的信息。最后,我们打印投资组合中股票的总数。
test_portfolio.py
文件所在的目录,并运行以下命令:python3 test_portfolio.py
如果一切正常,你应该会看到输出列出了 portfolio.csv
文件中的所有股票,以及它们的名称、股数和价格。你还应该会看到投资组合中股票的总数。
Name: AA, Shares: 100, Price: $32.20
Name: IBM, Shares: 50, Price: $91.10
Name: CAT, Shares: 150, Price: $83.44
Name: MSFT, Shares: 200, Price: $51.23
Name: GE, Shares: 95, Price: $40.37
Name: MSFT, Shares: 50, Price: $65.10
Name: IBM, Shares: 100, Price: $70.44
Total number of stocks in portfolio: 7
这个输出确认了你的 read_portfolio
函数能够正确读取 CSV 文件,并根据其中的数据创建 Stock
对象。
在这一步中,我们将创建一个函数,帮助我们以结构良好的表格形式展示投资组合数据。投资组合是股票的集合,以清晰易读的方式呈现这些数据非常重要。这就是 print_portfolio(portfolio)
函数的用武之地。该函数将投资组合作为输入,并以带有表头且格式对齐的表格形式展示。
在 Python 中,有多种字符串格式化的方法。字符串格式化是一项关键技能,因为它能让你以更有条理且用户友好的方式呈现数据。
%
运算符是一种较旧的字符串格式化方式。它就像一个模板,你可以将值插入到字符串的特定位置。str.format()
方法是另一种方式。它在字符串格式化方面提供了更多的灵活性和更简洁的语法。在这个练习中,我们将使用 %
运算符。当你想要创建固定宽度的列时,它特别有用,而这正是我们的投资组合表格所需要的。
首先,在你的编辑器中打开 stock.py
文件。如果已经打开了,那就很好。我们将在这个文件中编写 print_portfolio
函数。
打开文件后,查找 ## TODO: Add print_portfolio(portfolio) function here
注释。这个注释是一个标记,指示我们应该在哪里添加新函数。
在该注释下方,添加以下函数:
def print_portfolio(portfolio):
"""
Print the portfolio data in a nicely formatted table.
Args:
portfolio (list): A list of Stock objects
"""
## Print the header row
print('%10s %10s %10s' % ('name', 'shares', 'price'))
## Print a separator line
print('-' * 10 + ' ' + '-' * 10 + ' ' + '-' * 10)
## Print each stock in the portfolio
for stock in portfolio:
print('%10s %10d %10.2f' % (stock.name, stock.shares, stock.price))
这个函数首先打印表格的表头行,然后打印分隔线,最后遍历投资组合中的每只股票,并以格式化的方式打印其详细信息。
添加函数后,保存文件。你可以通过按下 Ctrl+S
组合键,或者在菜单中选择“文件 > 保存”来完成保存操作。保存文件可确保你的更改得以保留。
现在,我们需要测试我们的函数。创建一个名为 test_print.py
的新文件。这个文件将作为我们的测试脚本。在其中添加以下代码:
## test_print.py
from stock import read_portfolio, print_portfolio
## Read the portfolio from the CSV file
portfolio = read_portfolio('portfolio.csv')
## Print the portfolio as a formatted table
print_portfolio(portfolio)
这个脚本从 stock.py
文件中导入 read_portfolio
和 print_portfolio
函数。然后,它从 CSV 文件中读取投资组合数据,并使用我们新创建的 print_portfolio
函数来展示这些数据。
python3 test_print.py
如果一切正常,你应该会看到如下输出:
name shares price
---------- ---------- ----------
AA 100 32.20
IBM 50 91.10
CAT 150 83.44
MSFT 200 51.23
GE 95 40.37
MSFT 50 65.10
IBM 100 70.44
这个输出确认了你的 print_portfolio
函数按预期工作。它将投资组合数据格式化为带有表头且列对齐的表格,使其易于阅读。
让我们仔细看看 print_portfolio
函数中的字符串格式化是如何工作的。
%10s
用于格式化字符串。10
表示字段的宽度,s
代表字符串。它将字符串在宽度为 10 的字段内右对齐。%10d
用于格式化整数。10
是字段宽度,d
表示整数。它也将整数在宽度为 10 的字段内右对齐。%10.2f
用于格式化浮点数。10
是字段宽度,.2
指定我们要将浮点数显示为保留 2 位小数。它将浮点数在宽度为 10 的字段内右对齐。这种格式化方式确保了表格中的所有列都能正确对齐,从而使输出更易于阅读和理解。
在这个实验中,你学习了如何为 Stock
类添加新功能。你添加了 sell
方法来模拟出售股票,创建了 read_portfolio
函数从 CSV 文件中读取股票数据并将其转换为 Stock
对象,还开发了 print_portfolio
函数以格式良好的表格形式展示投资组合数据。
这些技能,包括在类中定义方法、处理文件和解析数据,以及为提高可读性而格式化输出,是 Python 面向对象编程的基础。现在,你可以将这些概念应用到 Python 程序中,创建更复杂的类和实用工具。