A. Programming/Python

[파이썬 코딩 #4] 모듈 만들기 - 로또(Lotto) 번호 생성 프로그램 - 4

_DK_ 2022. 3. 11. 12:00
반응형
성공(success)이 노력(work)보다 먼저 나타나는 유일한 곳은 사전이다.
- 비달 사순

 

  이전 글들을 통해 로또 번호를 랜덤으로 생성을 해보고 이를 파일로 저장하는 것까지 해보았습니다.

[A. Programming/Python] - [파이썬 코딩 #3] 엑셀 파일 저장하기 - 로또(Lotto) 번호 생성 프로그램 - 3

 

[파이썬 코딩 #3] 엑셀 파일 저장하기 - 로또(Lotto) 번호 생성 프로그램 - 3

우리는 배워야 할 것을 직접 해보면서 배운다. - 토머스 제퍼슨 이전 글에서는 파이썬의 텍스트 저장 방법을 통해 랜덤으로 생성한 로또 번호를 저장하는 방법에 대해 알아보았습니다. [A. Programm

yongbba.tistory.com

 

  앞서 알아본 내용으로도 로또 번호를 생성하고 이를 저장하는 기능을 하는 프로그램은 만들 수 있을 것입니다. 하지만 이런 기능만을 가진 프로그램은 사실 로또 구매 시 자동번호로 구매 요청을 해도 별 차이가 없다고 생각합니다. 이와는 차이를 조금 두기 위해서 몇 가지의 기능들을 추가를 더 해보려고 하는데 이렇게 코드가 추가가 되다 보면 코드를 이해하는데 점점 어려워질 수 있습니다.

 

  이번에는 조금 더 효율적인 코딩을 하기 위한 방법으로 작성한 코드들을 모듈화하는 방법에 대해서 알아보려고 합니다.

 

 

 파이썬 모듈 생성

 

  파이썬에서는 하나의 파일을 모듈로 만들어서 쉽게 참조하여 사용할 수 있습니다. 이때 만들어지는 모듈은 "[모듈 이름]. py" 형식으로 작성하여야 합니다.

 

  이전 글들에서 작성한 코드들에서 기능에 따라서 모듈을 분리하여 저장을 해보도록 하겠습니다. 이전 글까지 작성된 'Lottoy.py' 파일의 코드를 보면 아래와 같습니다.

import random
import openpyxl

lottoNum = random.sample(range(1, 46), 6)
lottoNum = sort()
print(lottoNum)

wb = openpyxl.Workbook()
ws = wb.active

ws.title = "Lotto Number"
ws['A1'] = "회차"
for i in range(1, 7):
    ws.cell(1, i+1, "숫자" + str(i))
ws['A2'] = 998
for i in range(6):
    ws.cell(2, i+2, lottoNum[i])

wb.save('C:/TEST/Lotto/data/data.xlsx')

wb2 = openpyxl.load_workbook('C:/TEST/Lotto/data/data.xlsx')
ws2 = wb2.active

readNum1 = ws2.cell(2, 1).value
readNum2 = []
cell = ws2['B2' : 'G2']
for row in cell:
    for cell in row:
        readNum2.append(cell.value)

print(readNum1)
print(readNum2)

 

  위의 코드를 보면 크게 랜덤 숫자를 생성하는 부분과 생성된 숫자를 엑셀 파일로 저장하는 기능이 있다고 볼 수 있습니다. 여기에서는 이 기능들을 모듈로 따로 저장하고 이를 이용하는 코드로 바꾸어보도록 하려고 합니다.

 

  먼저 1~45의 숫자 중 6개의 랜덤 숫자를 선택하여 정렬시켜주는 기능을 모듈로 옮겨본다면 아래와 같이 가능할 것입니다.

import random

def ranNumAndSort(start, end, count):
    lottoNum = random.sample(range(start, end+1), count)
    lottoNum.sort()

    return lottoNum

 

 

  'randomNum.py'라는 파일을 생성하여 위와 같이 코드를 작성한 후, 'Lotto.py' 파일을 아래와 같이 작성하였습니다.

import randomNum
import openpyxl

lottoNum = randomNum.ranNumAndSort(1, 45, 6)
print(lottoNum)

wb = openpyxl.Workbook()
ws = wb.active

ws.title = "Lotto Number"
ws['A1'] = "회차"
for i in range(1, 7):
    ws.cell(1, i+1, "숫자" + str(i))
ws['A2'] = 998
for i in range(6):
    ws.cell(2, i+2, lottoNum[i])

wb.save('C:/TEST/Lotto/data/data.xlsx')

wb2 = openpyxl.load_workbook('C:/TEST/Lotto/data/data.xlsx')
ws2 = wb2.active

readNum1 = ws2.cell(2, 1).value
readNum2 = []
cell = ws2['B2' : 'G2']
for row in cell:
    for cell in row:
        readNum2.append(cell.value)

print(readNum1)
print(readNum2)

 

  기존 코드와 달라진 점은 'random' 모듈을 호출하는 코드를 지금 생성한 'randomNum' 모듈에서 import하여 랜덤 번호를 생성하고, 'Lotto.py'에서는 'randomNum' 모듈에 존재하는 함수를 호출하는 것으로 바뀌었습니다. 위와 같이 변경 후 저장하여 실행해보면 동일하게 동작하는 것을 확인할 수 있습니다.

 

  이제 엑셀파일에 해당 값을 저장하는 부분도 모듈을 추가적으로 생성하여 바꾸어보도록 하겠습니다.

import openpyxl

def createWorkBook():
    return openpyxl.Workbook()

def writeLottoNum(wb, lottoNum, fileName):
    ws = wb.active

    ws.title = "Lotto Number"
    ws['A1'] = "회차"
    for i in range(1, 7):
        ws.cell(1, i+1, "숫자" + str(i))
    ws['A2'] = 998
    for i in range(6):
        ws.cell(2, i+2, lottoNum[i])

    wb.save(fileName)

def readLottoNum(fileName):
    wb.openpyxl.load_workbook(fileName)
    ws = wb.active

    readNum1 = ws.cell(2, 1).value
    readNum2 = []
    cell = ws['B2' : 'G2']
    for row in cell:
        for cell in row:
            readNum2.append(cell.value)

    return readNum2

 

  위와 같이 excel 파일을 생성하고, 생성한 번호를 저장 및 읽는 기능을 'excelFunc'라는 모듈로 만들어보았습니다. 이를 활용하여 기존의 'Lotto.py' 내 코드를 수정하면 아래와 같이 작성할 수 있습니다.

import randomNum
import excelFunc

lottoNum = randomNum.ranNumAndSort(1, 45, 6)
print(lottoNum)

wb = excelFunc.createWorkBook()
excelFunc.writeLottoNum(wb, lottoNum, 'C:/TEST/Lotto/data/data.xlsx')

readNum = excelFunc.readLottoNum('C:/TEST/Lotto/data/data.xlsx')

print(readNum)

 

  위와 같이 기존에 다소 복잡하게 보였던 코드들이 모듈의 함수를 호출하는 몇 번의 과정으로 변경된 것을 확인할 수 있습니다.

 

  이처럼 변경하는 과정이 꼭 필요한 것은 아니지만 복잡하고 다양한 기능을 가진 프로그램일수록 코드들의 양은 증가할 수밖에 없는데 이때 코드의 분석 및 재사용성을 높이기 위해서는 모듈을 효율적으로 구성하고 사용하는 게 중요한 항목이라고 생각합니다.(사실 예제 코드는 재사용성보다는 모듈로 변환을 해보고자 작성한 코드라 효율적인 코드라고 보기는 조금 부족한 것 같습니다...)

 

  이 로또 번호 생성 프로그램을 만들면서 아주 완벽한 프로그램을 만들기 보다는 이런 프로그램을 만들면서 파이썬 언어를 이용하여 코딩을 하는 방법에 대해서 조금씩 정리를 해보려고 하였습니다. 앞으로도 조금씩 기능들을 추가하면서 파이썬에서 제공하는 기능들을 알아보려고 합니다.

 

 

 

반응형