如何减少 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