Python,第一次使用Decimal和量化

时间:2013-01-12 04:40:25

标签: python string dictionary decimal

我只是想知道是否有人对如何改进此代码有任何意见。我的目标是让它尽可能像pythonic一样,因为我正在努力学习python。这个程序工作正常,但是如果你看到任何你认为可以改进的东西(不是重大改变,只是基本的"我是python和#34的东西)这个程序请告诉我。

#!/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!"

3 个答案:

答案 0 :(得分:3)

  1. 调用产品词典“产品”或一些类似的描述性名称,而不仅仅是“词典”
  2. 一般情况下,如果您在某个范围内进行迭代,请使用xrange代替range以获得更好的效果(尽管在这样的应用中这是一个非常小的挑剔)
  3. 您可以使用subtotal = sum(dictionary.itervalues())快速添加所有商品价格,而无需使用循环。
  4. 您应该始终使用Decimal来避免float导致的不准确。
  5. 您可以使用格式化字符串,例如'%.2f' % value(旧格式)或'{:.2f}' .format(value)(新格式)来打印带有两位小数的值。
  6. 税额应该是一个常数,因此可以轻松更改(它在两个地方使用,一次用于计算,一次用于显示)。

答案 1 :(得分:1)

  • 更新字典,我会使用dict[key] = value,而不是dict.update({key:value})

  • 尝试使用格式规范,而不是连接字符串。这看起来更干净,可以节省您必须明确地将值转换为字符串。

    • C风格:"Qty: %d, Price: %f" % (qty, price)
    • string.format:"Qty: {0}, Price {1}".format(qty, price)

答案 2 :(得分:1)

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

dictionary[currentProduct] = currentPrice

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

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

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