当前位置: 首页 > 知识库问答 >
问题:

结构模式匹配和无穷大

穆德海
2023-03-14

我正在计算非负p的Lp距离函数。除了p=0和p=∞ 内置的pow()函数可以很好地发挥作用。在学习结构模式匹配之前,我使用了字典和异常处理:

from math import sqrt, inf
distance_function = {   0.0: lambda x, y: int(x != 0.0) + int(y != 0.0),
                        1.0: lambda x, y: abs(x) + abs(y), # Likely a tad faster than 'pow()'       
                        inf: lambda x, y: max(abs(x), abs(y))}                  
def lp_distance(x, y, p): 
    try:                return distance_function[p](x, y)                   
    except KeyError:    return pow(pow(abs(x), p) + pow(abs(y), p), 1.0/p)

有些人不希望这里有例外。因此,我将该片段改写为以下内容:

def lp_distance(x, y, p):
    match p:
        case 0.0:           return int(x != 0.0) + int(y != 0.0)
        case 1.0:           return abs(x) + abs(y)      
        # The line below triggers "SyntaxError: name capture 'inf' makes remaining patterns unreachable"
        case inf:           return max(abs(x), abs(y))
        # But the following works:
        case p if p == inf: return max(abs(x), abs(y))
        case _:             return pow(pow(abs(x), p) + pow(abs(y), p), 1.0/p)

为什么大小写inf不正确(Python v3.10.2)?

共有2个答案

宰父正真
2023-03-14

正如其他受访者所指出的,您不能直接使用inf,因为这是一种捕获模式。显而易见的解决方案是使用带有虚线查找的值模式;但是,这仅适用于正无穷大。

要处理其他所有特殊值,例如负无穷大和NaNs,您需要保护:

match x:
    case 1.0: ...                   # Exact value (literal pattern)
    case 0.0: ...                   # Exact value (literal pattern)
    case _ if math.isfinite(x): ... # Normal cases
    case _ if math.isnan(x): ...    # NaNs defy equality tests
    case _: ...                     # Negative infinity   


   
鲍健柏
2023-03-14

case语句中,简单名称是捕获(分配)该名称的模式。相比之下,虚线名称是引用该名称值的模式。

简单地说,名称总是成功的,它将设置名称=

简单来说NAME1。NAME2只有在

仅使用大小写inf:意味着要匹配的值将无条件地分配给名称inf,无论名称之前是否已绑定<你想要的是案例数学。inf:,表示与此值进行比较。

import math

def lp_distance(x, y, p):
    match p:
        case 0.0:
            return int(x != 0.0) + int(y != 0.0)
        case 1.0:
            return abs(x) + abs(y)      
        # compare against a value by using its dotted name
        case math.inf:
            return max(abs(x), abs(y))
        case _:
            return pow(pow(abs(x), p) + pow(abs(y), p), 1.0/p)
 类似资料:
  • 我无法运行此代码: 我在Python中找不到匹配关键字。 我在这里找到的:https://www.python.org/dev/peps/pep-0622/#the-match语句 有什么想法吗?

  • 我一直在玩Python 3.10中的结构模式匹配,但不知道如何让它匹配一组。例如,我尝试过: 我尝试过: 以及: 我想有一种方法可以做到这一点,因为我们可以匹配其他对象,我只是缺少正确的语法,但我想不出还有什么其他方法可以尝试。任何帮助都将不胜感激!谢谢

  • 字面量 变量 占位符

  • 我有一个字符串,我正试图根据几个regex模式验证它,我希望由于模式匹配在3.10中可用,我可以使用它来代替创建if-else块。 考虑一个字符串'validateString',其可能的值1021102,1.25.32string021。 我尝试的代码如下所示。 对于正则表达式1、2和3,我尝试了字符串正则表达式模式,还重新设置了。编译对象,但它似乎不起作用。 我一直试图在互联网上找到这方面的例

  • 我一直在将if-elif链转换为结构模式匹配,但在反向测试中遇到了困难。 很容易生成与任何支持的模式(文本、类、映射、序列等)匹配的案例。我如何证明一个否定的匹配? 例如,当对象的类型不匹配时,我需要强制它: