我想创建一个开关/案例,其中案例可以有间隔作为条件,例如:
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/