Python 如何摆脱一堆“如果”

Python 如何摆脱一堆“如果”,python,Python,考虑到这项任务: 你开得有点太快了,一个警察拦住了你。编写代码计算结果,编码为int值:0=无票,1=小票,2=大票。如果速度小于等于60,则结果为0。如果速度介于61和80之间,则结果为1。如果速度大于等于81,则结果为2 首先想到的是一堆“如果”: def caught_speeding(speed): if speed > 80: return 2 elif speed > 60: return 1 else:

考虑到这项任务:

你开得有点太快了,一个警察拦住了你。编写代码计算结果,编码为int值:0=无票,1=小票,2=大票。如果速度小于等于60,则结果为0。如果速度介于61和80之间,则结果为1。如果速度大于等于81,则结果为2

首先想到的是一堆“如果”:

def caught_speeding(speed):
  if speed > 80:
      return 2
  elif speed > 60:
      return 1          
  else:
      return 0
是否有一种方法可以用更少的行数达到相同的结果

>>> from bisect import bisect_left
>>> bisect_left([60, 80], 50)
0
>>> bisect_left([60, 80], 60)
0
>>> bisect_left([60, 80], 70)
1
>>> bisect_left([60, 80], 80)
1
>>> bisect_left([60, 80], 90)
2
所以你本来可以

def caught_speeding(speed):
    bisect_left([60, 80], speed)
所以你本来可以

def caught_speeding(speed):
    bisect_left([60, 80], speed)

解决问题的一般方法是使用;您可以使用以下工具实现一个:

bisect_left
函数以最有效的方式查找速度的插入点(它将查看每个列表的一半,以确定速度应适合的位置,然后再查看一半,直到找到插入点为止)。对于速度高达60的情况,将其插入位置0;对于速度介于61和80之间的情况,将其插入位置1,其余部分将添加到末尾位置2:

>>> import bisect
>>> tickets = [60, 80]
>>> bisect.bisect_left(tickets, 60)
0
>>> bisect.bisect_left(tickets, 61)
1
>>> bisect.bisect_left(tickets, 80)
1
>>> bisect.bisect_left(tickets, 81)
2

对于3种不同的票证价值来说,这确实有点过头了。当稍后返回代码时,您的3分支
if else
构造更容易理解。

解决此问题的一般方法是使用;您可以使用以下工具实现一个:

bisect_left
函数以最有效的方式查找速度的插入点(它将查看每个列表的一半,以确定速度应适合的位置,然后再查看一半,直到找到插入点为止)。对于速度高达60的情况,将其插入位置0;对于速度介于61和80之间的情况,将其插入位置1,其余部分将添加到末尾位置2:

>>> import bisect
>>> tickets = [60, 80]
>>> bisect.bisect_left(tickets, 60)
0
>>> bisect.bisect_left(tickets, 61)
1
>>> bisect.bisect_left(tickets, 80)
1
>>> bisect.bisect_left(tickets, 81)
2

对于3种不同的票证价值来说,这确实有点过头了。稍后返回代码时,如果elif else构造更容易理解,则您的3分支

虽然不如使用
对分
的速度快,因为它执行线性搜索,下面对间隔或指定间隔的顺序进行一些假设(也不包括正在比较的值类型,可以是整数、浮点数、日期等):

导入系统 超速(速度、间隔): 对于i,枚举中的间隔(间隔):
如果区间[0]由于进行线性搜索而不如使用对分法快,则以下对区间或其指定顺序(或比较的值类型,可能是整数、浮点数、日期等)进行一些假设:

导入系统 超速(速度、间隔): 对于i,枚举中的间隔(间隔):
如果间隔为[0]为什么你需要更少的线?你现在拥有的是清晰可读的。@MartijnPieters,thx用于指向,更正了我的解决方案。为什么你需要更少的线?你现在拥有的是清晰可读的。@MartijnPieters,thx用于指向,更正了我的解决方案。谢谢,这就是为什么我问是否有更好的方法。我以前没有读过关于对分的内容。谢谢,这就是为什么我问是否有更好的方法。我以前没有读过关于对分的书