본문 바로가기
개발 공부 일지/Python

개발 공부 일지 : 파이썬 - 강의 복습 (독학 6일차)

by yelimu 2024. 6. 8.

치킨집 주문 프로그램 짜기

▼엉망진창 내코드 ..


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 출력됨..

로직을 처음부터 잘 세워놓고 코드를 쓰는게 중요하다는것을 느꼈다..