Python:为了精简Python代码,我可以做些什么呢?

2024-03-29 09:38:39 发布

您现在位置:Python中文网/ 问答频道 /正文

我可以用不同的代码来简化这个Python源代码的要点吗?该计划的重点是太多的用户总金额和添加它太运费。运输成本由国家(加拿大或美国)和产品价格决定: 在加拿大运输125美元的产品是12美元。在


input ('Please press "Enter" to begin')

如果是真的: print('这将计算运费和您的总计')

^{pr2}$

Tags: 代码用户重点input源代码产品国家计划
2条回答

以下是成本计算的基本策略:

import math

amount = int(totalAmount)
assert amount >= 0
shipping = { 
  'USA': [6, 8, 10],
  'Canada': [8, 10, 12]
}
try:
    surcharge = shipping[country][amount and (math.ceil(amount / 50.0) - 1)]
except IndexError:
    surcharge = 0
total = amount + surcharge

这里的关键概念是,运输成本范围遵循一个相当线性的过程:[0-50],(50-100],(100-150],(150,inf)

请注意,第一组有点滑稽,因为它包含0的下限,而其他组不包括下限(它们在底部是一个开放区间)。因此,接下来我们将把第一组看作是:0或(0-50)

我们希望将用户提供的数量转换为一个索引,并将其转换为运费清单[6, 8, 10]和{}。列表的长度为3,因此索引为0、1和2。注意,如果我们将范围(0,150]中的任何一个数除以50.0(我们将0到50相加,这样我们就可以得到一个实数1 / 50 == 0,但是下一步1 / 50.0 == 0.02)我们得到的是范围(0和3)中的一个数。在

现在意识到这一点数学.ceil将实数舍入为大于或等于自身的最接近整数,例如math.ceil(.001) == 1.0math.ceil(1.5) == 2.0math.ceil(2) == 2.0。所以应用数学.ceil对于(0,3)范围内的数字,我们将提供1.0、2.0或3.0。将这些数字转换成int(int(2.0) == 2),我们得到值1、2和3。从这些值中减去1,我们得到0,1,2。喂!这些数字与我们的装运阵列中的索引相匹配。在

您可以用Python来表示这种转换:int(math.ceil(amount / 50.0) - 1)

我们快到了。我们处理过(0,150)范围内的任何数量。但是如果数量是0呢。math.ceil(0) == 0.00.0 - 1 == -1.0这将不会正确索引到数组中。因此,我们通过首先检查amount是否等于0来分别处理0,如果是,则使用0作为装运数组索引,而不是将转换应用于amount来确定索引。这可以通过使用Python的short-circuit and操作符(web应该有很多关于这方面的信息)来实现:amount and int(math.ceil(amount / 50.0) - 1)

请注意,任何大于150的值都将减少为大于2的索引,并且对传送数组应用该索引将导致索引错误。但是,任何大于150的值都可以免费送货,因此我们可以捕获索引器并应用0的附加费:

^{pr2}$

我们完了!在

这里是简化代码的核心。它打印在美国的运费是100美元

totalAmount = 100

chargeCode = (int(100*(totalAmount+0.001))-1)/5000 #0   <=50, 1   50.01-100, etc
if chargeCode > 3: chargeCode = 3

shipping = {}
shipping[("USA", 0)] = 6
shipping[("USA", 1)] = 8
shipping[("USA", 2)] = 10
shipping[("USA", 3)] = 0
shipping[("Canada", 0)] = 8
shipping[("Canada", 1)] = 10
shipping[("Canada", 2)] = 12
shipping[("Canada", 3)] = 0

print shipping[("USA", chargeCode)]

totalAmount+0.001用于避免浮点数的乐趣:

^{pr2}$

在我的系统中返回True,因为浮点81.85比十进制81.85稍小。在

相关问题 更多 >