Python 3.10中新的结构模式匹配特性是一个非常受欢迎的特性。有没有办法用这个表述来匹配不平等呢?原型的例子:
match a:
case < 42:
print('Less')
case == 42:
print('The answer')
case > 42:
print('Greater')
可以使用:
match a:
case _ if a < 42:
print('Less')
case _ if a == 42:
print('The answer')
case _ if a > 42:
print('Greater')
另一个选项,没有保护符,使用纯模式匹配:
match [a < 42, a == 42]:
case [True, False]:
print('Less')
case [_, True]:
print('The answer')
case [False, False]:
print('Greater')
在本例中,使用if-elif更简单,即使这意味着重复变量名。
if a < 42:
print('Less')
elif a == 42:
print('The answer')
elif a > 42:
print('Greater')
注:像Thomas Sollie的回答那样,使用枚举和比较函数可以很好地为程序添加更多的结构,但对于基本脚本之类的东西来说,这似乎是多余的。
说到代码风格,避免魔术数字:如果代码中的所有三个42
表示相同的东西,请给它一个名称,例如:
the_answer = 42
if a < the_answer:
...
match-case语句本质上是为匹配等式而设计的(因此有了"match"这个词)。在您的原型示例中,您可以通过匹配if子句来实现这一点(正如其他答案所建议的那样),但是现在您实质上只是匹配True和False,这似乎是多余的。
其他语言解决这个问题的一种方法是通过使用枚举进行比较:from enum import Enum
class Ordering(Enum):
LESS = 1
EQUAL = 2
GREATER = 3
def compare(a, b):
if a < b:
return Ordering.LESS
elif a == b:
return Ordering.EQUAL
elif a > b:
return Ordering.GREATER
match compare(a, 42):
case Ordering.LESS:
print("Less")
case Ordering.EQUAL:
print("The answer")
case Ordering.GREATER:
print("Greater")