소개
이 랩에서는 다른 프로그램에서 가져와 사용할 수 있는 Python 코드를 포함하는 파일인 Python 모듈에 대해 배우게 됩니다. 이러한 모듈식 접근 방식은 코드 재사용을 촉진하고 프로그램을 논리적인 구성 요소로 구성하는 데 도움이 됩니다.
Python 모듈이 무엇이며 왜 유용한지 이해하고, 자신만의 모듈을 만드는 방법을 배우고, 다양한 방식으로 import 문을 사용하는 연습을 하고, 메인 모듈의 개념과 코드가 실행되는 시점을 파악하게 됩니다. 사전 요구 사항으로는 Python 구문 및 함수에 대한 기본적인 이해와 Python 스크립트를 생성하고 실행하는 데 익숙해야 합니다. 이 연습을 시작하기 전에 깨끗한 환경을 위해 Python 인터프리터 세션을 다시 시작하는 것이 좋습니다.
Python 모듈 이해하기
Python 에서 모듈은 Python 정의와 문을 담는 컨테이너와 같습니다. 본질적으로 파일이며, 이 파일의 이름은 끝에 .py 확장자가 추가된 모듈 이름입니다. 모듈을 도구 상자라고 생각해보세요. 모듈은 Python 코드를 논리적인 방식으로 구성하여 재사용 및 유지 관리를 용이하게 합니다. 더 나은 구성을 위해 다양한 도구를 별도의 상자에 보관하는 것처럼, 관련 Python 코드를 서로 다른 모듈로 그룹화할 수 있습니다.
이 랩을 위해 설정된 파일을 살펴보겠습니다.
- 먼저, 편집기에서
stock.py파일을 열어 내부를 확인합니다. 이를 위해 다음 명령을 사용합니다.cd명령은 디렉토리를 파일이 있는project폴더로 변경하고,cat명령은 파일의 내용을 표시합니다.
cd ~/project
cat stock.py
이 stock.py 파일은 Stock 클래스를 정의합니다. 클래스는 객체를 생성하기 위한 청사진과 같습니다. 이 경우, Stock 클래스는 주식을 나타냅니다. 주식의 이름, 주식 수, 가격에 대한 속성 (특성과 같음) 이 있습니다. 또한 주식의 비용을 계산하는 메서드 (클래스와 관련된 함수와 같음) 도 있습니다.
- 다음으로,
pcost.py파일을 살펴보겠습니다.cat명령을 다시 사용하여 내용을 봅니다.
cat pcost.py
이 파일은 portfolio_cost()라는 함수를 정의합니다. 함수는 특정 작업을 수행하는 코드 블록입니다. portfolio_cost() 함수는 포트폴리오 파일을 읽고 해당 포트폴리오의 모든 주식의 총 비용을 계산합니다.
- 이제 샘플 포트폴리오 데이터를 살펴보겠습니다.
cat명령을 사용하여portfolio.dat파일의 내용을 봅니다.
cat portfolio.dat
이 파일에는 간단한 형식의 주식 데이터가 포함되어 있습니다. 각 줄에는 주식의 티커 심볼, 주식 수 및 주당 가격이 있습니다.
import 문 사용하기
Python 의 import 문은 현재 프로그램에서 다른 모듈의 코드를 사용할 수 있게 해주는 강력한 도구입니다. 다른 도구 상자에서 도구를 빌리는 것과 같습니다. 다양한 방식으로 코드를 가져오는 연습을 해보겠습니다.
- 먼저, Python 인터프리터를 시작해야 합니다. Python 인터프리터는 Python 코드를 실행하는 프로그램입니다. 다음 명령을 사용하여 시작합니다.
python3
- 이제
pcost모듈을 가져와서 어떤 일이 발생하는지 확인해 보겠습니다.import문을 사용하면 Python 은pcost.py파일을 찾고 그 안의 코드를 사용할 수 있도록 합니다.
import pcost
출력 44671.15를 볼 수 있습니다. 이것은 portfolio.dat 파일에서 계산된 포트폴리오의 비용입니다. pcost 모듈이 가져오면 pcost.py 파일의 맨 아래에 있는 코드가 자동으로 실행됩니다.
- 다른 포트폴리오 파일로
portfolio_cost()함수를 호출해 보겠습니다.pcost모듈에서 함수를 호출하기 위해pcost.portfolio_cost()구문을 사용합니다.
pcost.portfolio_cost('portfolio2.dat')
출력은 19908.75여야 하며, 이는 두 번째 포트폴리오 파일의 주식 총 비용을 나타냅니다.
- 이제
stock모듈에서 특정 클래스를 가져오겠습니다. 전체 모듈을 가져오는 대신from...import문을 사용하여Stock클래스만 가져올 수 있습니다.
from stock import Stock
Stock클래스를 가져온 후Stock객체를 생성할 수 있습니다. 객체는 클래스의 인스턴스입니다. 이름이GOOG, 주식 수가 100 주, 가격이490.10인Stock객체를 생성합니다. 그런 다음 주식의 이름을 출력하고cost()메서드를 사용하여 비용을 계산합니다.
s = Stock('GOOG', 100, 490.10)
print(s.name)
print(s.cost())
출력은 다음과 같아야 합니다.
GOOG
49010.0
- 마지막으로, Python 인터프리터 사용을 마쳤으면
exit()함수를 사용하여 종료할 수 있습니다.
exit()
이 랩에서는 Python 코드를 가져오는 두 가지 방법을 시연했습니다.
import module_name- 전체 모듈을 가져와 해당 모듈의 모든 함수, 클래스 및 변수를 사용할 수 있도록 합니다.from module_name import specific_item- 모듈에서 특정 항목 (클래스 또는 함수) 만 가져오며, 모듈 기능의 일부만 필요한 경우 유용할 수 있습니다.
Python 의 메인 모듈 이해하기
Python 에서 스크립트를 직접 실행하면 "메인" 모듈 역할을 합니다. Python 에는 __name__이라는 특수한 변수가 있습니다. 파일을 직접 실행하면 Python 은 __name__의 값을 "__main__"으로 설정합니다. 이는 파일을 모듈로 가져올 때와는 다릅니다.
이 기능은 파일이 직접 실행되는지 또는 가져오는지에 따라 다르게 동작하는 코드를 작성할 수 있으므로 매우 유용합니다. 예를 들어, 스크립트로 파일을 실행할 때만 실행되고 다른 스크립트에서 가져올 때는 실행되지 않는 코드가 있을 수 있습니다.
메인 모듈 패턴을 사용하도록 pcost.py 수정하기
이 패턴을 활용하기 위해 pcost.py 프로그램을 수정해 보겠습니다.
- 먼저, 편집기에서
pcost.py파일을 열어야 합니다. 다음 명령을 사용하여 프로젝트 디렉토리로 이동하고 파일이 없는 경우 파일을 만들 수 있습니다.
cd ~/project
touch pcost.py
cd 명령은 현재 디렉토리를 홈 디렉토리의 project 디렉토리로 변경합니다. touch 명령은 pcost.py라는 새 파일을 만듭니다 (아직 없는 경우).
- 이제
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__": 조건으로 묶었다는 것입니다. 즉, 이 블록 내부의 코드는 파일이 모듈로 가져올 때가 아니라 스크립트로 직접 실행될 때만 실행됩니다.
- 이러한 변경을 수행한 후 파일을 저장하고 편집기를 종료합니다.
수정된 모듈 테스트하기
이제 수정된 모듈이 어떻게 동작하는지 확인하기 위해 두 가지 방법으로 테스트해 보겠습니다.
- 먼저, 다음 명령을 사용하여 프로그램을 스크립트로 직접 실행합니다.
python3 pcost.py
이전과 마찬가지로 출력 44671.15를 볼 수 있습니다. 이는 스크립트를 직접 실행하면 __name__ 변수가 "__main__"으로 설정되므로 if __name__ == "__main__": 블록 내부의 코드가 실행되기 때문입니다.
- 다음으로, Python 인터프리터를 다시 시작하고 모듈을 가져옵니다.
python3
import pcost
이번에는 아무런 출력도 보이지 않습니다. 모듈을 가져오면 __name__ 변수가 "__main__"이 아닌 "pcost"(모듈 이름) 로 설정됩니다. 따라서 if __name__ == "__main__": 블록 내부의 코드는 실행되지 않습니다.
portfolio_cost함수가 여전히 작동하는지 확인하려면 다음과 같이 호출할 수 있습니다.
pcost.portfolio_cost('portfolio.dat')
함수는 44671.15를 반환해야 하며, 이는 제대로 작동하고 있음을 의미합니다.
- 마지막으로, 다음 명령을 사용하여 Python 인터프리터를 종료합니다.
exit()
이 패턴은 가져올 수 있는 모듈과 독립 실행형 스크립트 모두로 사용할 수 있는 Python 파일을 만들 때 매우 유용합니다. if __name__ == "__main__": 블록 내부의 코드는 파일이 모듈로 가져올 때가 아니라 직접 실행될 때만 실행됩니다.
자신만의 모듈 만들기
이제 기존 모듈을 사용하는 방법을 이해했으므로 처음부터 새 모듈을 만들 차례입니다. 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 인터프리터에서 모듈을 사용합니다. 터미널에서
python3명령을 실행하여 Python 인터프리터를 시작합니다.
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
- 테스트를 마쳤으면
exit()명령을 실행하여 Python 인터프리터를 종료합니다.
exit()
이제 자신만의 Python 모듈을 성공적으로 만들고 사용했으며, 함수와 파일이 직접 실행될 때만 실행되는 메인 블록을 모두 결합했습니다. 이 모듈식 프로그래밍 방식은 코드를 재사용하고 프로젝트를 더 체계적으로 유지 관리할 수 있도록 합니다.
요약
이 랩에서는 Python 모듈의 기본 개념과 코드 구성을 위해 이를 사용하는 방법을 배웠습니다. 모듈은 재사용 가능한 코드를 포함하는 Python 파일이며, import 문을 사용하면 프로그램에서 다른 모듈의 코드를 활용할 수 있습니다. if __name__ == "__main__" 패턴을 사용하면 파일을 가져올 수 있는 모듈과 독립 실행형 스크립트 모두로 사용할 수 있습니다.
이러한 개념은 특히 더 큰 애플리케이션을 개발할 때 유지 관리 가능한 Python 코드를 작성하는 데 중요합니다. Python 을 계속 배우면서 모듈이 관련 코드를 그룹화하는 데 도움이 되고, 특정 항목을 가져오면 네임스페이스가 깨끗하게 유지되며, 메인 모듈 패턴이 모범 사례임을 기억하십시오. 이러한 기술을 적용하면 코드를 더 체계적이고, 유지 관리 가능하며, 재사용 가능하게 만들 수 있습니다.