커피 자판기 만들기 (실습)
이번에는 커피 자판기 프로그램을 만들어 보려고 합니다. (물론 실제로 커피를 만들어주는 프로그램이 아니라 가상의 커피 자판기를 만드려는 것입니다)
espresso, latte, cappuccino 이렇게 3가지의 메뉴를 뽑을 수 있고, report를 입력했을 땐 남은 재료 현황, off를 입력했을땐 자판기 작동이 멈추도록 프로그램을 짜려고 합니다.
먼저 아래의 코드를 복사, 붙여넣기 한 후 몇 번 동작시켜서 자판기의 구조를 파악해보시길 바랍니다.
# current resources status
water = 1000
milk = 600
coffee = 300
money = 0
# coins setting / quarters : 0.25, dimes : 0.10, nickles : 0.05, pennies : 0.01
quarter = 0.25
dime = 0.10
nickle = 0.05
penny = 0.01
def running() :
"""coffee machine running"""
global water, milk, coffee, money
# is resources sufficient? (if not, print current status)
switch = True
while switch:
# prompt user by asking "what would you like?? (espresso/latte/cappuccino) : "
question = input("What would you like? espresso(1.5$) / latte(2.5$) / cappuccino(3.0$) : ")
# report function (shows current resources up. hidden function for maintainers)
if question == "report":
print(f"Current stock \n water : {water}ml \n milk : {milk}ml \n coffee : {coffee}g \n money : {money}$")
continue
elif question == "off":
switch = False
# coin insert question and make progress
input_quarter = float(input("How many quarters?(0.25$) : "))
input_dime = float(input("How many dimes(0.10$) : "))
input_nickle = float(input("How many nickles(0.05$) : "))
input_penny = float(input("How many pennies(0.01$) : "))
def coin_calculation(coin, input_coin) :
"""calculate inputted coins"""
coin *= input_coin
return coin
inputted_money = float(coin_calculation(quarter, input_quarter))
+ float(coin_calculation(dime, input_dime)) + float(coin_calculation(nickle, input_nickle))
+ float(coin_calculation(penny, input_penny))
# check inserted coins are enough or not / stock check / money check
if question == "espresso" and inputted_money > 1.5:
if water >= 50 and coffee >= 18:
print(f"Here is espresso and ${round(inputted_money - 1.5, 2)} in change")
money += 1.5
water -= 50
coffee -= 18
else:
if water < 50:
print("Sorry, there is no water enough.")
if coffee < 18:
print("Sorry, there is no coffee enough.")
elif question == "latte" and inputted_money > 2.5:
if water >= 200 and milk >= 150 and coffee >= 24:
print(f"Here is latte and ${round(inputted_money - 2.5, 2)} in change")
money += 2.5
water -= 200
milk -= 150
coffee -= 24
else:
if water < 200:
print("Sorry, water is not enough.")
if milk < 150:
print("Sorry, milk is not enough.")
if coffee < 24:
print("Sorry, coffee is not enough.")
elif question == "cappuccino" and inputted_money > 3.0:
if water >= 250 and milk >= 100 and coffee >= 24:
print(f"Here is cappuccino and ${round(inputted_money - 3.0, 2)} in change")
money += 3.0
water -= 250
milk -= 100
coffee -= 24
else:
if water < 250:
print("Sorry, there is no water enough.")
if milk < 100:
print("Sorry, there is no milk enough.")
if coffee < 24:
print("Sorry, there is no coffee enough.")
else:
print("You inserted not enough money or chose wrong menu.")
running()
몇번 작동 시킨 후, 다시 작성된 코드를 봅니다. 위의 코드는 작동하는데에는 문제가 없습니다. 하지만 자판기에 메뉴를 추가한다던지, 재료 사용량을 바꾼다던지, 가격을 바꾼다던지 등등.. 프로그램을 수정할 일이 생기면 어떨까요? 위의 코드는 수정하기에 조금 불편할 것입니다.
프로그램은 한 번 완성하면 끝나는 것이 아닙니다. 버그를 찾아 수정해야하고, 버전을 업데이트해야하는 경우도 많습니다. 그렇기 때문에 코드를 읽기 쉽게, 그리고 나중에 수정하기 쉽게 작성할 필요가 있습니다. 이번 포스팅에서는 그 중, 수정하기 쉽게 작성하기에 포커스를 맞춰볼 것입니다.
dictionary를 이용해 코드 간소화
#1
MENU = {
"espresso": {
"ingredients": {
"water": 50,
"coffee": 18,
},
"cost": 1.5,
},
"latte": {
"ingredients": {
"water": 200,
"milk": 150,
"coffee": 24,
},
"cost": 2.5,
},
"cappuccino": {
"ingredients": {
"water": 250,
"milk": 100,
"coffee": 24,
},
"cost": 3.0,
}
}
resources = {
"water": 1000,
"milk": 600,
"coffee": 300,
}
profit = 0
#4
def is_ingredient_sufficient(order_ingredients):
"""return True if ingredients are enough, return False if ingredients are not enough"""
for item in order_ingredients:
if order_ingredients[item]>resources[item]:
print(f"sorry. {item} is not enough.")
return False
return True
#6
def coin_process():
"""insert coins and sum up how much is it"""
print("please insert coins")
total = float(input("How many quarters?(0.25$) : ")) * 0.25
total += float(input("How many dimes?(0.10$) : ")) * 0.10
total += float(input("How many nickles?(0.05$) : ")) * 0.05
total += float(input("How many pennies?(0.01$) : ")) * 0.01
return total
#8
def is_transaction_successful(money_inputted, beverage_cost):
"""Return True if money is enough. return False if money is not enough"""
if money_inputted >= beverage_cost:
charge = round(money_inputted - beverage_cost, 2)
print(f"${charge} in charge.")
global profit
profit += beverage_cost
return True
else :
print("Sorry. That is not enough money.")
return False
#10
def make_coffee(ordered_ingredients, beverage_name):
"""Deduct the required ingredients from the resources"""
for item in ordered_ingredients:
resources[item] -= ordered_ingredients[item]
print(f"Here is your {beverage_name}.")
#2
is_on = True
while is_on:
#3
choice = input("What would you like? espresso(1.5$) / latte(2.5$) / cappuccino(3.0$) : ")
if choice == "off":
is_on = False
elif choice == "report":
print("Current stock")
print(f"water : {resources['water']}ml")
print(f"milk : {resources['milk']}ml")
print(f"coffee : {resources['coffee']}g")
print(f"money : ${profit}")
else:
#5
drink = MENU[choice]
if is_ingredient_sufficient(drink['ingredients']):
#7
payment = coin_process()
#9
if is_transaction_successful(payment, drink['cost']):
#11
make_coffee(drink['ingredients'], choice)
이번에는 각 메뉴에 들어가는 재료, 비용을 딕셔너리로 만든 후 다시 코드를 작성하였습니다.
이제 메뉴, 재료, 가격 등을 수정하려면 딕셔너리 내부 위주로하여 쉽게 수정하실 수 있을 것입니다.
그리고 코드를 작성한 순서를 매겨보았습니다.
while 반복문 안에 커피를 뽑는 과정을 작성하면서 필요한 함수들이 생기면 추가하는 방식으로 작성하였습니다.
*이 글은 Udemy 강좌 100 Days of Code - The Complete Python Pro Bootcamp for 2021의 Day 15 (intermediate) - Local Development Environment Setup & Coffee Machine Project 내용을 바탕으로 작성하였습니다.
(URL : https://www.udemy.com/course/100-days-of-code/)