首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python:自动售货机

Python:自动售货机
EN

Stack Overflow用户
提问于 2018-10-21 14:58:51
回答 2查看 18.6K关注 0票数 0

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

1)我不知道在用户回答'n‘到’购买其他东西?(y/n):‘之后如何退出自动售货机程序。

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

代码语言:javascript
复制
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()
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-10-21 15:13:42

1)我不知道在用户回答'n‘到’购买其他东西?(y/n):‘之后如何退出自动售货机程序。

Python语言中的break语句中断了包含它的第一个forwhile循环。您只是退出了所示的for循环。while True条件会让您永远循环。

但是,您做了一些聪明的事情,您将所有自动售货机功能都包含在您的自动售货机函数中。如果您使用return语句代替break,您不仅会退出自动售货函数,而且会到达整个程序的末尾,并按您的意愿退出。

return 语句也用于从函数调用返回值,但在本例中不需要这样做。

此外,您不需要也不应该从函数中使用两个独立的出口。删除以下三行:

代码语言:javascript
复制
                else:
                    print('thank you, have a nice day!\n')
                    break

突出您删除的三行上的两行,并将break替换为return

你还可以做其他的改进,但这只是一个开始。

票数 1
EN

Stack Overflow用户

发布于 2018-10-21 15:23:56

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

代码语言:javascript
复制
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()

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

代码语言:javascript
复制
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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52912856

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档