1

我只是想知道是否有人对如何改进此代码有任何意见。我的目标是让它尽可能像 Python 一样,因为我正在努力真正学好 Python。这个程序运行良好,但是如果你看到任何你认为可以改进的东西(不是重大变化,只是基本的“我是 python 新手”的东西)这个程序请告诉我。

#!/usr/bin/python
from decimal import *


print "Welcome to the checkout counter!  How many items are you purchasing today?"

numOfItems = int(raw_input())

dictionary = {}

for counter in range(numOfItems):

    print "Please enter the name of product", counter + 1
    currentProduct = raw_input()    

    print "And how much does", currentProduct, "cost?"
    currentPrice = float(raw_input())

    dictionary.update({currentProduct:currentPrice})

print "Your order was:"

subtotal = 0
for key, value in dictionary.iteritems():

    subtotal = subtotal + value
    stringValue = str(value)
    print key, "$" + stringValue

tax = subtotal * .09
total = subtotal + tax
total = Decimal(str(total)).quantize(Decimal('0.01'), rounding = ROUND_DOWN)

stringSubtotal = str(subtotal)
stringTotal = str(total)

print "Your subtotal comes to", "$" + stringSubtotal + ".", " With 9% sales tax, your total is $" + stringTotal + "."

print "Please enter cash amount:"
cash = Decimal(raw_input()).quantize(Decimal('0.01'))

change = cash - total
stringChange = str(change)

print "I owe you back", "$" + stringChange

print "Thank you for shopping with us!"
4

3 回答 3

3
  1. 将产品字典称为“产品”或类似的描述性名称,而不仅仅是“字典”
  2. 通常,如果您在一个范围内进行迭代,请使用xrange而不是以range获得更好的性能(尽管在这样的应用程序中这是一个非常小的挑剔)
  3. 您可以使用subtotal = sum(dictionary.itervalues())快速添加所有项目的价格,而无需使用循环。
  4. 您绝对应该始终使用 Decimal 以避免由于float.
  5. 您可以使用'%.2f' % value(旧式格式)或'{:.2f}' .format(value)(新式格式)之类的格式字符串来打印带两位小数的值。
  6. 税值应该是一个常数,所以它可以很容易地改变(它在两个地方使用,一次用于计算,一次用于显示)。
于 2013-01-12T05:31:49.530 回答
1
  • 更新字典,我会使用dict[key] = value, 而不是dict.update({key:value})

  • 尝试使用格式规范,而不是连接字符串。这看起来更简洁,并且不必将值显式转换为字符串。

    • C风格:"Qty: %d, Price: %f" % (qty, price)
    • 字符串格式:"Qty: {0}, Price {1}".format(qty, price)
于 2013-01-12T04:54:43.487 回答
1

1 在字典中添加键值,您可以使用:

dictionary[currentProduct] = currentPrice

但是,在这种情况下你不需要 dict,因为 dict 是无序的。您可以使用元组列表。

2 为什么不使用Decimal(raw_input()),那么您可以在不使用浮点数的情况下进行所有十进制计算。

3 要打印结果,您不需要先将值转换为 str,您可以使用str.format()

于 2013-01-12T05:00:26.297 回答