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

标签 python python-3.x switch-statement

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

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) 查看占用更多内存的成本(所有范围的内容加在一起)。

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

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

关于python - 如何创建一个以间隔为单位的开关盒?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57884270/

相关文章:

python-3.x - 如何使用嵌套的 while 循环

c++ - 无中断的 switch-case 语句

javascript - 使用 switch 和 if else 语句来切换 JavaScript 计算器模式

处理 if-else 的 pythonic 方式

python - 导入 cx_Oracle 和 kinterbasdb 返回错误

python - 字典键的问题

python - 在 Python 中设置 Windows 命令行终端标题

python - 重新排列列表中的元素

javascript - Node.js 脚本似乎跳过了 fs.readFile 代码块

python - Linux 上的 PyQt5 QMultimedia 出现段错误