Skip to main content
 首页 » 编程设计

python之如何创建一个以间隔为单位的开关盒

2025年05月04日15java哥

我想创建一个开关/案例,其中案例可以有间隔作为条件,例如:

switch = { 
    1..<21: do one stuff, 
    21...31: do another 
} 

我怎样才能达到这个结果?

请您参考如下方法:

In Python 3.10 引入了显式 switch 语句 - match . 尽管它不支持直接包含检查,所以我们必须利用 guard特点:

number = int(input("num: ")) 
 
match number: 
    case num if 1 <= num <  21: 
        # do stuff 
    case num if 21 <= num < 31: 
        # do other stuff 
    case _: 
        # do default 

但在这一点上它引出了一个问题,为什么不直接使用 if/elif/else 结构……根据个人喜好。

对于早期版本,看起来您已经尝试过,在 Python 中实现 switch 结构的明显方法是使用字典.

为了支持间隔,您可以实现自己的dict 类:

class Switch(dict): 
    def __getitem__(self, item): 
        for key in self.keys():                 # iterate over the intervals 
            if item in key:                     # if the argument is in that interval 
                return super().__getitem__(key) # return its associated value 
        raise KeyError(item)                    # if not in any interval, raise KeyError 

现在您可以使用 range 作为键:

switch = Switch({ 
    range(1, 21): 'a', 
    range(21, 31): 'b' 
}) 

还有一些例子:

>>> print(switch[4]) 
a 
 
>>> print(switch[21]) 
b 
 
>>> print(switch[0]) 
KeyError: 0 

另一种选择是解压范围并单独保存范围内的每个数字。像这样的东西:

cases = {range(1, 21): 'a', 
         range(21, 31): 'b' 
        } 
 
switch = {num: value for rng, value in cases.items() for num in rng} 

其余工作相同。


这两个选项之间的区别是第一个节省内存,但失去了字典的时间效率(当你检查所有键时),而第二个将保持字典的O(1) 查看占用更多内存的成本(所有范围的内容加在一起)。

根据您的应用,您可以在它们之间进行选择,一般来说:

  • 几个长距离 - 第一个选项
  • 许多短程 - 第二个选项
  • 介于两者之间的任何事情 - 为您的案例找到最佳解决方案