치킨집 주문 프로그램 짜기
▼엉망진창 내코드 ..
class NoMoreChicken(Exception):
def __init__(self, msg)
self.msg = msg
def __str__(self)
return self.msg
chicken = 10
number = 1
for while(True): #왜하는거지? 무슨 값을 True로 받아야하지?
try:
print("반갑습니다. 나도 치킨입니다. {}마리 주문 가능합니다.".format(chicken))
order = int(input("몇 마리 주문 하시겠습니까? : "))
if order <= chicken:
print("{}번 손님, {}마리 주문이 완료되었습니다.".format(number, order))
number += 1
chicken -= order
elif chicken <= 0 :
print("죄송합니다. 재고 소진되었습니다.")
break
elif order > chicken :
raise NoMoreChicken
except:
NoMoreChicken as err
for while ㅋㅋㅋ 다나온다 ㅜ
▼ 지피티샘이랑 수정한 코드
while (True):
try:
#남은 치킨이 0보다 적을때 : input 명령 위에 있어야 남은치킨이 0마리일때 프로그램 종료됨.
if chicken <= 0 : #
raise NoMoreChicken
print("반갑습니다. 나도 치킨입니다. {}마리 주문 가능합니다.".format(chicken))
order = int(input("몇 마리 주문 하시겠습니까? : "))
#남은 치킨이 0보다 적을때
if chicken <= 0 : #
raise NoMoreChicken
#주문값이 남은 치킨보다 많거나 0 보다 적을때
if order > chicken :
raise ValueError("남은 치킨은 {}마리 입니다.".format(chicken))
if order <= 0 :
raise ValueError("주문값은 0보다 커야합니다.")
# 올바른 주문일 경우 처리
else :
print("{}번 손님, {}마리 주문이 완료되었습니다.".format(number, order))
number += 1
chicken -= order
except NoMoreChicken :
print("죄송합니다. 재고 소진되어 더이상 주문 받지 않습니다.")
break
except ValueError as e:
print("잘못된 값을 입력하였습니다.",e)
1. print문과 input문을 try 안에서 가장 위에 적었더니 남은 치킨이 0마리가 돼도 주문을 받는 문제가 생겼음
2. 같은 ValueError를 발생시키더라도 각 조건에 따라 다른 msg를 받아올 수 있다
3. if 다음에 반드시 elif 를 써야하는건 아님.
elif 는 위의 if 가 거짓일때만 받아온다. if 는 위의 조건문이 참이더라도 받아온다.
4. while 문 안에 try / except 를 넣어서 루프를 반복되도록 한다
모듈&패키지
모듈 생성하기 : ~~~.py
def price(people):
print("{}명 일반 티켓 가격은 {}원입니다.".format(people, 10000 * people))
def price_morning(people):
print("{}명 조조 티켓 가격은 {}원입니다.".format(people, 5000 * people))
def price_kid(people):
print("{}명 어린이 티켓 가격은 {}원입니다.".format(people, 3000 * people))
import module
module.price(3)
module.price_morning (5)
module.price_kid(3)
불러와서 실행시키기
module명.메서드(변수)
메서드에 이미 print문이 있으므로 print를 쓸 필요가 없다~~~ (당연함)
import module as m
m.price(3)
m.price_morning (5)
m.price_kid(3)
다른 이름으로 가져올수 있음
from module import *
price(3)
price_morning(5)
price_kid(3)
from 모듈 import *
이렇게 하면 앞에 모듈명. 을 붙이지 않고 바로 메서드 사용이 가능하다 ㅇㅁㅇ
from module import price_kid as price
price(3)
한가지 메서드만 다른 이름으로 불러올수 있다
모듈이 담긴 폴더 = 패키지 = travel
모듈 = thailand, vietnam
▼ import 해오는 방법
import travel.thailand #import는 class를 바로 import할수없다
trip = travel.thailand.ThailandPackage()
trip.detail()
from travel.thailand import ThailandPackage
trip = ThailandPackage() # 바로 class 만 이용해서 변수 생성
trip.detail()
from travel import * # *을 쓰면 패키지 안의 모듈을 다 가져오겠다는건데 > import해오려면 공개 범위를 선택해주어야한다
__all__은 파이썬 모듈에서 다른 모듈이나 패키지로 공개될 요소를 정의하는데 사용되는 특별한 변수입니다. 이 변수를 사용하면 모듈 작성자가 모듈을 사용하는 사람들에게 어떤 객체가 공개되어 있는지 명시적으로 나타낼 수 있습니다.
게임 만들기 복습도 하러가장
책 보고 간단한 프로그램 작성해보려고했는데 이마저도 아직 쉽지 않았다. 허덕허덕..
#자판기 프로그램
class Drink():
def __init__(self, name, price):
self.name = name
self.price = price
def __str__(self):
return("{} : {}원 입니다.".format(self.name, self.price))
DrinkList = []
coke = Drink("coke", 2000)
juice = Drink("juice", 2500)
coffee = Drink("coffee", 3000)
DrinkList.append(coke)
DrinkList.append(juice)
DrinkList.append(coffee)
while True:
count = 0
menu = input("음료를 고르세요 : ")
for drink in DrinkList:
if menu != drink.name:
print("잘못된 주문입니다.")
elif menu == drink.name:
print("{}: {}원 입니다.".format(drink.name, drink.price))
payment = int(input("얼마를 내시겠습니까? : "))
if payment >= drink.price:
print("거스름돈 :{}원 입니다.".format(payment - drink.price))
elif payment < drink.price:
print("금액이 부족합니다.")
1. class 선언시 def__str__ 빼먹음
2. DrinkList 에 append 하는 방법 블로그 검색해서 찾아봄;
3. payment input으로 받을때 int로 받기
4. if menu == DrinkList :(x) = >리스트 그 자체로 값이 아님 * 리스트 : 숫자만 들어가있을땐 출력이 됨
for drink in DrinkList: => 리스트 안에 있는 값(element) = drink 라는 변수로 꺼내서
if menu == drink.name: => drink의 name특성과 비교해준다
5. 그리고 결과가 이상하게 출력됨 ㅜ ㅜ 흑흑.. 제대로 주문해도 잘못된 주문입니다 x2 출력됨..
로직을 처음부터 잘 세워놓고 코드를 쓰는게 중요하다는것을 느꼈다..