두번째로 진행한 파이썬 과제는 바로바로 ... 자판기 만들기 !!
과제내용은 다음과 같다.
과제내용을 참고하여 파이썬 자판기를 제작해보자.
메뉴는 위의 과제내용을 참고하여 출력해주면 된다.
나는 먼저 메뉴리스트를 보았을 때 음료의 이름과 음료의 값으로 이루어진 리스트 형태로 생겼다고 판단하였고, 딕셔너리를 값으로 가진 리스트 형태를 떠올려 데이터를 아래와 같이 구성했다.
drinkMenu = [{'name': '사이다', 'price': 1700},
{'name': '콜라', 'price': 1900},
{'name': '식혜', 'price': 2500},
{'name': '솔의눈', 'price': 3000}]
이렇게 생성한 데이터를 화면에 출력시켜줄 것이다. 딕셔너리 값을 가진 리스트 형태의 데이터를 출력할 때는 반복문을 통하여 리스트의 요소 하나하나에 접근하여 출력시켜주면 될 것 같아서 반복문을 사용하여 메뉴 출력 함수를 작성해보았다.
def menuList(drinkMenu):
print('[ Menu ]')
for drink in drinkMenu:
print(drink['name'] + '' + str(drink['price']) + '원')
print('\n')
반복문을 통해 drinkMenu라는 리스트 요소 하나하나에 접근하여 name의 값과 price의 값을 출력하는 반복문을 작성했다. menuList라는 함수를 호출할 때 위에서 생성한 drinkMenu 변수를 매개변수로 넣어서 호출해주면 아래와 같이 메뉴가 출력될 것 이다.

메뉴를 출력시켜주었으니 이제 사용자에게 어떤 음료를 선택할 것인지 입력을 받아야할 것 이다.
python에서 사용자의 입력을 받을 때는 input()함수를 사용하면 된다.
파이썬에서 사용자의 입력을 받을 때 사용되는 input()에 대해서 간단히 알아보고 가겠다.
input()함수는 간단하게 사용자에게 어떤 값을 입력하게 하고, 사용자가 입력한 값을 변수에 저장하는 역할을 한다.
x = input('name : ')
>> name : sb
위와 같이 작성한 후 실행을 하면 아랫줄과 같이 x라는 변수는 사용자에게 값을 입력받아 저장을 하게된다.
이때 ()안에 작은따옴표로 뭔가를 작성하면 입력받을 대 출력되는 문구를 지정할 수 있다.
그렇다면 이제 input()을 사용하여 사용자에게 입력을 받는 코드는 금방 작성할 수 있을 것이다.
choiceDrink = input("음료를 선택해주세요 : ")
위와 같이 작성을 하면 실행창에 '음료를 선택해주세요 : ' 문구가 출력이 될것이다.
그럼 이 문구 옆에 음료 이름을 작성하면 된다.

나는 사용자가 입력한 음료가 있는지를 판단하고 미리 해당 음료에 대한 값에 대한 정보를 저장하도록 했다.
choiceDrink = input("음료를 선택해주세요 : ")
choiceDrinkInfo = {}
for i, drink in enumerate(drinkMenu):
if choiceDrink in drink['name']:
choiceDrinkInfo['name'] = choiceDrink
choiceDrinkInfo['price'] = drinkMenu[i]['price']
print('{}를 선택하셨습니다.'.format(choiceDrinkInfo['name']))
print('가격은 {}원 입니다.\n'.format(choiceDrinkInfo['price']))
break
사용자에게 음료이름을 입력받고, 위에서 생성한 drinkMenu에 대한 리스트 값을 반복돌면서 입력받은 음료이름과 일치하는 데이터가 있다면 choiceDrinkInfo라는 딕셔너리 형태에 음료의 이름과 음료의 값을 별도로 저장해두도록 하였다.
음료의 이름과 값에 대해 안내하는 문구를 한번 더 출력시켜주고, 일치하는 음료 데이터를 찾았으니 해당 반복문은 종료해주도록 하였다.
만약 사용자가 입력한 음료와 일치하는 데이터가 없을 경우, choiceDrinkInfo는 아직 빈 딕셔너리 일 것이다.
빈 딕셔너리 일 때 입력한 음료는 없다고 판단하여 사용자에게 안내 문구를 출력해주도록 한다.
if choiceDrinkInfo == {}:
print('입력한 음료는 없습니다.')
사용자가 입력한 음료명을 통해 위에서 음료가 있다면 음료에 대한 데이터를 별도 저장하고, 음료가 없다면 없다는 문구를 출력하는 처리를 했다.
이젠 사용자에게 금액을 입력받아 결제단계 처리를 해보도록 하겠다.
inputPrice = input("금액을 투입해주세요 : ")
if int(inputPrice) >= choiceDrinkInfo['price']:
print('구입 후 잔액은 {}원 입니다'.format(int(inputPrice)-choiceDrinkInfo['price']))
else:
print('돈이 부족합니다.')
첫번째로 사용자에게 투입할 금액을 입력 받는다. 사용자가 입력한 금액에 대한 값은 inputPrice 라는 변수에 담아둔다.
!!! 이때 주의할 점은 !!! input() 함수를 통해 사용자에게 입력받는 값은 모두 문자열의 자료형태를 가지게 된다. 그렇기 때문에 금액에 대한 값을 숫자도 받더라도 문자로 인식하기 때문에 해당 변수값에 대한 타입을 int형으로 변경해주는 과정이 필요하다.
다음으로는 조건문을 이용하여 입력받은 금액을 위에서 선택한 음료의 값과 비교를 한다.
음료의 값보다 입력한 금액의 값이 많거나 같을 때 두 값을 뺀 금액을 구하여 잔액 안내를 해주고, 입력받은 금액이 선택한 음료의 값보다 적다면 '돈이 부족합니다' 라는 안내 문구를 출력해주도록 한다.
전체코드는 아래와 같다.
drinkMenu = [{'name': '사이다', 'price': 1700},
{'name': '콜라', 'price': 1900},
{'name': '식혜', 'price': 2500},
{'name': '솔의눈', 'price': 3000}]
def menuList(drinkMenu):
print('[ Menu ]')
for drink in drinkMenu:
print(drink['name'] + '' + str(drink['price']) + '원')
print('\n')
def choiceDrink(drinkMenu):
choiceDrink = input("음료를 선택해주세요 : ")
choiceDrinkInfo = {}
for i, drink in enumerate(drinkMenu):
if choiceDrink in drink['name']:
choiceDrinkInfo['name'] = choiceDrink
choiceDrinkInfo['price'] = drinkMenu[i]['price']
print('{}를 선택하셨습니다.'.format(choiceDrinkInfo['name']))
print('가격은 {}원 입니다.\n'.format(choiceDrinkInfo['price']))
break
if choiceDrinkInfo == {}:
print('입력한 음료는 없습니다.')
inputPrice = input("금액을 투입해주세요 : ")
if int(inputPrice) >= choiceDrinkInfo['price']:
print('구입 후 잔액은 {}원 입니다'.format(int(inputPrice)-choiceDrinkInfo['price']))
else:
print('돈이 부족합니다.')
menuList(drinkMenu)
choiceDrink(drinkMenu)
그리고 위 코드를 실행하면 입력값에 따라 출력되는 결과가 다르겠지만 이런 형태로 출력되는 것을 볼 수 있을 것이다.

이번 과제에서는 딕셔너리 값을 가진 리스트 형태의 자료구조를 사용하여 진행을 해보았는데, 이런 자료형태를 사용할 수 있으니 데이터 표현이 다양하게 될 것 같다는 생각이 든다.
과제를 진행하다 보니 전체 요구사항에서 메뉴출력과 음료뽑기 두가지로 함수를 생성하여 코드를 분리해두었는데, 나중에는 개발을 시작하기전에 이 함수를 어느정도 단위로 나누는지에 대한 고민도 필요할 것 같다.
또 같은 과제를 진행한 다른 분들이 작성한 코드들도 보게되었는데, 사람마다 코딩하는 방식이나 분기처리 등등이 너무 다양해서 신기했다..!