소개
이 랩에서는 주식 보유를 나타내도록 설계된 Stock 클래스를 향상시키는 방법을 배우게 됩니다. 이 클래스에 새로운 메서드와 기능을 추가하여 더욱 다재다능하고 유용하게 만들 것입니다.
이 랩의 목표는 기존 Stock 클래스에 sell 메서드를 추가하고, CSV 파일에서 주식 포트폴리오 데이터를 읽는 함수와, 포트폴리오 데이터를 형식화된 테이블로 표시하는 또 다른 함수를 만드는 것입니다. 수정할 파일은 stock.py입니다.
이 랩에서는 주식 보유를 나타내도록 설계된 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 속성을 나타냅니다. -= 연산자는 nshares의 값을 self.shares의 현재 값에서 뺍니다.
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 클래스를 가져옵니다. 그런 다음 주식 기호 GOOG, 100 주, 가격 490.10 으로 s라는 Stock 객체를 만듭니다. 초기 주식 수를 출력합니다. 그 후, 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 에서 헤더는 "Name", "Shares", "Price"일 수 있습니다.
먼저 코드 편집기에서 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 메서드를 추가하고, CSV 파일에서 주식 데이터를 읽어 Stock 객체로 변환하는 read_portfolio 함수를 만들었으며, 포트폴리오 데이터를 잘 형식 지정된 표로 표시하는 print_portfolio 함수를 개발했습니다.
클래스에서 메서드를 정의하고, 파일로 작업하고 데이터를 구문 분석하며, 가독성을 높이기 위해 출력을 형식 지정하는 이러한 기술은 Python 의 객체 지향 프로그래밍의 기본입니다. 이제 이러한 개념을 적용하여 Python 프로그램에서 더 복잡한 클래스와 유틸리티를 만들 수 있습니다.