Python 有没有办法匹配不等式?3.10?

gus*_*rom 43 python pattern-matching python-3.10

Python 3.10 中新的结构模式匹配功能是一个非常受欢迎的功能。有没有办法使用这个语句来匹配不等式?原型示例:

match a:
    case < 42:
        print('Less')
    case == 42:
        print('The answer')
    case > 42:
        print('Greater')
Run Code Online (Sandbox Code Playgroud)

Aja*_*234 55

您可以使用守卫

match a:
    case _ if a < 42:
        print('Less')
    case _ if a == 42:
        print('The answer')
    case _ if a > 42:
        print('Greater')
Run Code Online (Sandbox Code Playgroud)

另一种选择,没有防护,使用纯模式匹配:

match [a < 42, a == 42]:
    case [True, False]:
        print('Less')
    case [_, True]:
        print('The answer')
    case [False, False]:
        print('Greater')
Run Code Online (Sandbox Code Playgroud)

  • 在第一个示例中,我宁愿只使用旧的 if/elif,在我看来,它更容易阅读。 (16认同)
  • 如果第一个基本上只是一个带有更多步骤的 if-elif ,那么它有什么意义呢? (2认同)
  • @minseong 嗯,TBF,这不是它的目的。这很大程度上是“结构模式匹配”。看看[我写的这个答案](/a/71151862/4518341) 以及匹配大小写使解析代码变得更加清晰。 (2认同)

wja*_*rea 7

在此示例中,使用 good ol' if-elif 更简单,即使这意味着重复变量名称。

if a < 42:
    print('Less')
elif a == 42:
    print('The answer')
elif a > 42:
    print('Greater')
Run Code Online (Sandbox Code Playgroud)

PS 使用托马斯·索利(Thomas Sollie)的答案中的枚举和比较函数有利于为程序添加更多结构,但对于基本脚本等来说似乎有点矫枉过正。

说到代码风格,请避免使用幻数:如果42代码中的所有三个代表相同的事物,请为其命名,例如:

the_answer = 42
if a < the_answer:
...
Run Code Online (Sandbox Code Playgroud)


小智 6

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")
Run Code Online (Sandbox Code Playgroud)

  • 那时,当您可以简单地使用“if/elif”时,我很难证明使用 case 语句的合理性。行数只有一半,更容易阅读。 (2认同)