微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何减少 Python 上的 if 条件数量?

如何解决如何减少 Python 上的 if 条件数量?

我在 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
,
def ldm_discount(ldm):
    ldm = round(ldm)
    ldm_discount={1:0.3,2:0.38}
    discount = ldm_discount.get(ldm,None)
    return discount
,
from math import ceil

def ldm_discount(ldm):
  index = ceil(ldm)
  values = [0.3,.......]
  if ldm <= 10:
    return values[index - 1]
  else:
    return 1

,

您可以通过直接找出正确的索引来获得单个 if 语句:

import math
def ldm_discount(ldm):
    discounts = [0.3,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.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.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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。