2015-10-04 18 views
1

我想用Python编写一个代码,要求用户提供一个包的重量,然后考虑到我们的成本,发送它需要多少成本。如果语句和条件:邮局代码


重量(公斤):每kg价格

高达2千克:30

从2千克多达6公斤:28

从6千克高达12公斤:25

12 kg和向上:23


这是我写:

vikt = float(input("Weight of package?: ")) 

if vikt = 0: 
    print("Please insert a weight") 
elif vikt < 2: 
    print("The cost is", vikt*30, "kronor") 
elif vikt >= 2: 
    print("The cost is", vikt*28, "kronor") 
elif vikt >= 6: 
    print("The cost is", vikt*25, "kronor") 
elif vikt >= 12: 
    print("The cost is", vikt*23, "kronor") 

(vikt是重量和瑞典克朗是货币)

某些输入权这工作得很好,但是当我写例如7.15公斤,这应该花费178.75我反而得到200.20000000000002。哪一个是不正确的,其次是有没有简单的方法来不显示成本与许多小数?但也许如果我们让它显示正确的成本,我们甚至不会有这个问题。

感谢您的帮助!

+2

您可能想从最高的体重开始,然后逐渐减少。 – jchamp

+0

感谢Pynchia编辑它看起来更好,jchamp,你究竟是什么意思?那会有什么不同? (我不是说生气) –

+0

'elif vikt> = 2:'胜和其他测试被忽略 – Pynchia

回答

0

我认为这将是更好地使用函数来检索一个重量单位的成本:

def get_price(weight): 
    if weight < 2: 
     return 30 
    elif 2 <= weight < 6: 
     return 28 
    elif 6 <= weight < 12: 
     return 25 
    else: 
     return 23 


vikt = float(input("Weight of package?: ")) 
if vikt = 0: 
    print("Please insert a weight") 
else: 
    print("The cost is", vikt*get_price(vikt), "kronor") 
0

尤金,谢谢!我这样做是这样的:

vikt =浮动

if vikt == 0: print("Please insert a weight") 

elif vikt < 2: print("The cost is", vikt*30, "kronor") 

elif 2 <= vikt <6: print("The cost is", vikt*28, "kronor") 

elif 6 <= vikt < 12: print("The cost is", vikt*25, "kronor") 

elif vikt >= 12: print("The cost is", vikt*23, "kronor") 

(输入( “包的重量?:”)),它似乎是工作

0

首先尝试评估你的最高重量:

vikt = float(input("Weight of package?: ")) 

if vikt >= 12: 
    print("The cost is", vikt*23, "kronor") 
elif vikt >= 6: 
    print("The cost is", vikt*25, "kronor") 
elif vikt >= 2: 
    print("The cost is", vikt*28, "kronor") 
elif vikt > 0: 
    print("The cost is", vikt*30, "kronor") 
else: 
    print("Please insert a weight") 
0

为了使它更Python,摆脱了多次测试的,在插入的元组的参数和使用生成器表达式

weights = (2, 6, 12) 
vals = (30, 28, 25) 

while True: 
    vikt = float(input("Weight of package?: ")) 
    if vikt > 0.0: 
     break 

k = next((v for w,v in zip(weights, vals) if w > vikt), 23) 
print(round(k*vikt, 2)) 

产生所需的输出。

例子:

vikt = 0.5 
k = 30 
k * vikt = 15.0 

vikt = 7.15 
k = 25 
k * vikt = 178.75 

vikt = 14.2 
k = 23 
k * vikt = 326.6 

编辑: 由@lvc建议,使用bisect甚至会更好

import bisect 

weights = (2, 6, 12) 
vals = (30, 28, 25, 23) 

while True: 
    vikt = float(input("Weight of package?: ")) 
    if vikt > 0.0: 
     break 

k = vals[bisect.bisect(weights, vikt)] 
print(round(k*vikt, 2)) 
+0

这样做表查找很好,但该生成器表达式不是。改为使用stdlib ['bisect'](https://docs.python.org/3.5/library/bisect.html)模块。 – lvc

+0

@lvc完成了,谢谢 – Pynchia

0

与相当多的一切,Python中实际上有一个标准库模块那很容易为你做这种事情。它被称为bisect,它可以做的一件事是查表。要使用它,你把你的截止到一个列表,以及相关的乘数到另一个列表以相同的顺序是这样的:

weights = [2, 6, 12] 
unit_prices = [30, 38, 25, 23] 

然后找到合适的乘数给出一个任意重量是一个函数调用:

from bisect import bisect 
weight = float(input("Weight of package?: ")) 
total = weight * unit_prices[bisect(unit_prices, weight)] 
print("The cost is", total, "kronor") 

您仍然需要特殊情况下的无效输入,但导致计算总成本的所有分支都合并为一个。