我想按照这个比例申请一笔费用:
AMOUNT FEE
------- ---
0 24.04 €
6010.12 0.00450
30050.61 0.00150
60101.21 0.00100
150253.03 0.00050
601012.11 0.00030
从0到6010.13€是24.04€的固定费用
我的代码:
def fee(amount):
scale = [[0, 24.04],
[6010.12, 0.00450],
[30050.61, 0.00150],
[60101.21, 0.00100],
[150253.03, 0.00050],
[601012.11, 0.00030]]
if amount <= scale[1][0]:
fee = scale[0][1]
else:
for i in range(0, 5):
if amount >= scale[i][0] and amount < scale[i+1][0]:
fee = amount * scale[i][1]
break
return fee
print(fee(601012.12))
此代码在0€到601012.11€之间正常工作,但对于601012.12€或更高版本失败。
return fee UnboundLocalError: local variable 'fee' referenced before assignment
我认为问题在于:amount < scale[i+1][0]
当i = 4时,未分配fee
变量。
是否有更多pythonic方法可以选择量表的范围限制?
答案 0 :(得分:1)
你不是在处理这一案件。您应该在循环外添加另一个if
语句(类似于您使用的if ammount <= scale[1][0]
,因为循环不处理这两个范围中的值):
if ammount >= scale[len(scale) - 1][0]:
fee = scale[len(scale) - 1][1]
顺便说一句,第一个<=
的{{1}}与第二个if
和>=
之间的差异不大
我怀疑我能做得比这更好:
<
for i in range(-1, len(scale) - 1):
if((i == -1 or ammount >= scale[i][0]) and
(i == len(scale) or ammount < scale[i + 1][0])):
fee = ammount * scale[i][1]
return fee
和scale[-1][0]
无法执行,因此会被短路。
答案 1 :(得分:1)
我认为更好的方法是使用while循环来检查amount
是否小于scale[i+1][0]
,这样您就可以使用scale[i][1]
。并且还要给其他人处理大于scale[len(scale)][0]
的任何内容。
答案 2 :(得分:0)
首先,你应该尽量避免命名不同的东西。这使问题变得更加困难。
这会发生什么:如果金额低于比例表中的第二个条目,则返回第一个条目。如果没有,则查看表格并检查金额是否大于当前值并小于下一个阈值。直到最后一个为止, [HttpGet]
public object Get(string table, string columns, int id)
{
var splitColumns = columns.Split(',');
var t = new propertyModel()
{
gallery = _db.PROPERTYGALLERies.Where(p => p.propertyId == id).ToList(),
property = _db.PROPERTies.SingleOrDefault(p => p.id == id)
};
var requestedClass = t.GetType().GetProperty(table.ToLower()).GetValue(t, null);
var returnArray = new Dictionary<string, List<string>>();
var requestArray = new List<string>();
foreach (var column in splitColumns)
{
foreach (var field in StringProperties(requestedClass, column))
{
requestArray.Add(field.Value);
}
}
returnArray.Add(table, requestArray);
return Json(returnArray, JsonRequestBehavior.AllowGet);
}
public IEnumerable<KeyValuePair<string, string>> StringProperties(object obj, string column)
{
return from p in obj.GetType().GetProperties()
where p.Name == column
select new KeyValuePair<string, string>(p.Name, Convert.ToString(p.GetValue(obj)));
}
将产生range(0, 5)
,而不会到达最后一个并且中断。
在这种情况下,当您尝试返回时,未定义0, 1, 2, 3, 4
,从而引发UnboundLocalError。我也会通过检查上限来修复:
fee