【问题标题】:Python: vending machinePython:自动售货机
【发布时间】:2019-03-25 13:19:33
【问题描述】:

程序提供商品,让用户为商品付款,“赠送”商品,并更新每件商品的库存。它似乎或多或少地起作用。我有两个问题:

1) 用户回答“n”为“买别的东西?”后,我不知道如何退出自动售货机程序。 (是/否):'。

2) 有没有办法让代码更简单/更好?

def vend():

    a = {'item': 'choc', 'price': 1.5, 'stock': 2}
    b = {'item': 'pop', 'price': 1.75, 'stock': 1}
    c = {'item': 'chips', 'price': 2.0, 'stock': 3}
    d = {'item': 'gum', 'price': 0.50, 'stock': 1}
    e = {'item': 'mints', 'price': 0.75, 'stock': 3}
    items = [a, b, c, d, e]
    cim = 0 # cash in machine

    print('welcome to vending machine! \n***************')

    # show items, prices
    def show(items):
        print('\nitems available \n***************')

        for item in items:      
            if item.get('stock') == 0:
                items.remove(item)
        for item in items:
            print(item.get('item'), item.get('price'))

        print('***************\n')

    # have user choose item
    while True:
        show(items)
        selected = input('select item: ')
        for item in items:
            if selected == item.get('item'):
                selected = item               
                price = selected.get('price')
                while cim < price:
                    cim = float(input('insert ' + str(price - cim) + ': '))   
                else:
                    print('you got ' + selected.get('item'))
                    selected['stock'] -= 1
                    cim -= price
                    print('cash remaining: ' + str(cim))
                    a = input('buy something else? (y/n): ')
                    if a == 'n':
                        if cim != 0:
                            print(str(cim) + ' refunded')
                            cim = 0
                            print('thank you, have a nice day!\n')
                            break                        
                        else:
                            print('thank you, have a nice day!\n')
                            break                        
                    else:
                        continue



vend()

【问题讨论】:

    标签: python while-loop infinite-loop


    【解决方案1】:

    如果用户的答案是n,您只需要添加一个设置为false 的布尔变量。另请注意,代码中存在问题,您没有以正确的方式更新cim 的值。您必须考虑到一个人可能需要输入多个硬币,因此您必须累计投入的硬币总数:

    def vend():
    
        a = {'item': 'choc', 'price': 1.5, 'stock': 2}
        b = {'item': 'pop', 'price': 1.75, 'stock': 1}
        c = {'item': 'chips', 'price': 2.0, 'stock': 3}
        d = {'item': 'gum', 'price': 0.50, 'stock': 1}
        e = {'item': 'mints', 'price': 0.75, 'stock': 3}
        items = [a, b, c, d, e]
        cim = 0 # cash in machine
    
        print('welcome to vending machine! \n***************')
    
        # show items, prices
        def show(items):
            print('\nitems available \n***************')
    
            for item in items:      
                if item.get('stock') == 0:
                    items.remove(item)
            for item in items:
                print(item.get('item'), item.get('price'))
    
            print('***************\n')
        continueToBuy = True
        # have user choose item
        while continueToBuy == True:
            show(items)
            selected = input('select item: ')
            for item in items:
                if selected == item.get('item'):
                    selected = item               
                    price = selected.get('price')
                    while cim < price:
                        cim = cim + float(input('insert ' + str(price - cim) + ': '))   
    
                    print('you got ' + selected.get('item'))
                    selected['stock'] -= 1
                    cim -= price
                    print('cash remaining: ' + str(cim))
                    a = input('buy something else? (y/n): ')
                    if a == 'n':
                        continueToBuy = False
    
                        if cim != 0:
                            print(str(cim) + ' refunded')
                            cim = 0
                            print('thank you, have a nice day!\n')
                            break                        
                        else:
                            print('thank you, have a nice day!\n')
                            break  
                    else:
                        continue
    
    
    
    vend()
    

    另外,我认为这是介绍面向对象编程的一个很好的例子。它可以让你拥有更好的结构化代码,并让你专注于你想要开发的逻辑。这是一个可能的实现:

    class Item:
        def __init__(self, name, price, stock):
            self.name = name
            self.price = price
            self.stock = stock
    
        def updateStock(self, stock):
            self.stock = stock
    
        def buyFromStock(self):
            if self.stock == 0:
                # raise not item exception
                pass
            self.stock -= 1
    
    class VendingMachine:
        def __init__(self):
            self.amount = 0
            self.items = []
    
        def addItem(self, item):
            self.items.append(item)
    
        def showItems(self):
            print('\nitems available \n***************')
    
            for item in self.items:      
                if item.stock == 0:
                    self.items.remove(item)
            for item in self.items:
                print(item.name, item.price)
    
            print('***************\n')
    
        def addCash(self, money):
            self.amount = self.amount + money
    
        def buyItem(self, item):
            if self.amount < item.price:
                print('You can\'t but this item. Insert more coins.')
            else:
                self.amount -= item.price
                item.buyFromStock()
                print('You got ' +item.name)
                print('Cash remaining: ' + str(self.amount))
    
        def containsItem(self, wanted):
            ret = False
            for item in self.items:
                if item.name == wanted:
                    ret = True
                    break
            return ret
    
        def getItem(self, wanted):
            ret = None
            for item in self.items:
                if item.name == wanted:
                    ret = item
                    break
            return ret
    
        def insertAmountForItem(self, item):
            price = item.price
            while self.amount < price:
                    self.amount = self.amount + float(input('insert ' + str(price - self.amount) + ': '))
    
        def checkRefund(self):
            if self.amount > 0:
                print(self.amount + " refunded.")
                self.amount = 0
    
            print('Thank you, have a nice day!\n')
    
    
    def vend():
    
        machine = VendingMachine()
        item1 = Item('choc',  1.5,  2)
        item2 = Item('pop', 1.75,  1)
        item3 = Item('chips',  2.0,  3)
        item4 = Item('gum',  0.50, 1)
        item5 = Item('mints',0.75,  3)
        machine.addItem(item1)
        machine.addItem(item2)
        machine.addItem(item3)
        machine.addItem(item4)
        machine.addItem(item5)
    
        print('Welcome to the vending machine!\n***************')
    
        continueToBuy = True
        while continueToBuy == True:
            machine.showItems()
            selected = input('select item: ')
            if machine.containsItem(selected):
                item = machine.getItem(selected)
    
                machine.insertAmountForItem(item)
                machine.buyItem(item)
    
                a = input('buy something else? (y/n): ')
                if a == 'n':
                    continueToBuy = False
                    machine.checkRefund()
                else:
                    continue
    
            else:
                print('Item not available. Select another item.')
                continue
    
    vend()
    

    有关 OOP 的更多信息,请参阅a resource like this

    【讨论】:

      【解决方案2】:

      1)我不知道如何退出自动售货机程序后 用户回答'n'来'买别的东西? (是/否):'。

      Python 中的 break 语句从第一个 forwhile 循环中跳出。您只是退出了您显示的 for 循环。 while True 条件让您永远循环。

      但是,您做了一些聪明的事情,您将所有自动售货机功能都包含在 vend 函数中。如果你使用 return 语句代替 break,你不仅会退出 vend 函数,还会到达整个程序的结尾并随心所欲地退出。

      return 语句也用于从函数调用返回值,但在您的情况下不需要这样做。

      另外,您不需要也不应该有两个独立的函数出口。删除这三行:

                      else:
                          print('thank you, have a nice day!\n')
                          break
      

      将您删除的三行上方的两行缩进,并将 break 替换为 return

      您还可以进行其他改进,但这是一个开始。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多