如何减少 Python 上的 if 条件?
How to reduce amount of if conditions on Python?
我在 Python 中有一个函数,它看起来像这样:
def ldm_discount(ldm):
if ldm <= 1:
return 0.3
if ldm <=2:
return 0.38
if ldm <=3:
return 0.45
if ldm <=4:
return 0.51
if ldm <=5:
return 0.57
if ldm <=6:
return 0.63
if ldm <=7:
return 0.69
if ldm <=8:
return 0.75
if ldm <=9:
return 0.80
if ldm <=10:
return 0.85
else:
return 1
我觉得可能有更好的方法。如何减少 if 语句的数量?
更新: 顺便说一句,我不能使用导入
分配列表中的所有输出,遍历列表并将 ldm 与列表索引匹配。
vals = [0.3,0.38,0.45,0.51,0.57,0.63,0.69,0.75,0.80,0.85]
def ldm_discount(ldm):
for i in range(1,len(vals)+1):
if ldm <= i:
return vals[i-1]
return 1
ldm_discount(2)
>> 0.38
ldm_discount(5)
>> 0.57
from math import ceil
def ldm_discount(ldm):
index = ceil(ldm)
values = [0.3, 0.38, 0.45, .......]
if ldm <= 10:
return values[index - 1]
else:
return 1
您可以通过直接找出正确的索引来获得单个 if
语句:
import math
def ldm_discount(ldm):
discounts = [0.3, 0.38, 0.45, 0.51, 0.57, 0.63, 0.69, 0.75, 0.8, 0.85]
return discounts[math.ceil(ldm) - 1] if ldm <= 10 else 1
请注意,您必须确保 ldm
不是负数或零,否则它将进行负索引或 IndexError
(超出范围)。
或者你可以稍微改变一下条件:
import math
def ldm_discount(ldm):
discounts = [0.3, 0.38, 0.45, 0.51, 0.57, 0.63, 0.69, 0.75, 0.8, 0.85]
return discounts[math.ceil(ldm) - 1] if 0 < ldm <= 10 else 0 if ldm == 0 else 1
编辑(无导入)
math
是内置 python 模块的一部分,但如果您不能使用任何类型的导入,您可以自己做 ceil
.
discounts = [0.3, 0.38, 0.45, 0.51, 0.57, 0.63, 0.69, 0.75, 0.8, 0.85]
def ldm_discount(ldm):
casted = int(ldm)
return discounts[casted - 1 if ldm == casted else casted] if 0 < ldm <= len(discounts) else 0 if ldm == 0 else 1
Python 3.10引入了“match”语句,在其他语言中通常称为“switch”语句。参见 PEP 622
就是说,正如您提到的,可能有更好的方法来完成您当前正在做的事情。
例如,您可以使用字典并循环遍历它:
values = {
1: 0.3,
2: 0.38,
...
}
for threshold in values.keys():
if ldm <= threshold:
return values
def ldm_discount(ldm):
ldm = round(ldm)
ldm_discount={1:0.3,2:0.38}
discount = ldm_discount.get(ldm,None)
return discount
我在 Python 中有一个函数,它看起来像这样:
def ldm_discount(ldm):
if ldm <= 1:
return 0.3
if ldm <=2:
return 0.38
if ldm <=3:
return 0.45
if ldm <=4:
return 0.51
if ldm <=5:
return 0.57
if ldm <=6:
return 0.63
if ldm <=7:
return 0.69
if ldm <=8:
return 0.75
if ldm <=9:
return 0.80
if ldm <=10:
return 0.85
else:
return 1
我觉得可能有更好的方法。如何减少 if 语句的数量?
更新: 顺便说一句,我不能使用导入
分配列表中的所有输出,遍历列表并将 ldm 与列表索引匹配。
vals = [0.3,0.38,0.45,0.51,0.57,0.63,0.69,0.75,0.80,0.85]
def ldm_discount(ldm):
for i in range(1,len(vals)+1):
if ldm <= i:
return vals[i-1]
return 1
ldm_discount(2)
>> 0.38
ldm_discount(5)
>> 0.57
from math import ceil
def ldm_discount(ldm):
index = ceil(ldm)
values = [0.3, 0.38, 0.45, .......]
if ldm <= 10:
return values[index - 1]
else:
return 1
您可以通过直接找出正确的索引来获得单个 if
语句:
import math
def ldm_discount(ldm):
discounts = [0.3, 0.38, 0.45, 0.51, 0.57, 0.63, 0.69, 0.75, 0.8, 0.85]
return discounts[math.ceil(ldm) - 1] if ldm <= 10 else 1
请注意,您必须确保 ldm
不是负数或零,否则它将进行负索引或 IndexError
(超出范围)。
或者你可以稍微改变一下条件:
import math
def ldm_discount(ldm):
discounts = [0.3, 0.38, 0.45, 0.51, 0.57, 0.63, 0.69, 0.75, 0.8, 0.85]
return discounts[math.ceil(ldm) - 1] if 0 < ldm <= 10 else 0 if ldm == 0 else 1
编辑(无导入)
math
是内置 python 模块的一部分,但如果您不能使用任何类型的导入,您可以自己做 ceil
.
discounts = [0.3, 0.38, 0.45, 0.51, 0.57, 0.63, 0.69, 0.75, 0.8, 0.85]
def ldm_discount(ldm):
casted = int(ldm)
return discounts[casted - 1 if ldm == casted else casted] if 0 < ldm <= len(discounts) else 0 if ldm == 0 else 1
Python 3.10引入了“match”语句,在其他语言中通常称为“switch”语句。参见 PEP 622
就是说,正如您提到的,可能有更好的方法来完成您当前正在做的事情。
例如,您可以使用字典并循环遍历它:
values = {
1: 0.3,
2: 0.38,
...
}
for threshold in values.keys():
if ldm <= threshold:
return values
def ldm_discount(ldm):
ldm = round(ldm)
ldm_discount={1:0.3,2:0.38}
discount = ldm_discount.get(ldm,None)
return discount