添加数字时处理 None

Handling None when adding numbers

我想执行 2 个整数的加法,也可以是 None,结果如下:

add(None, None) = None
add(None, b) = b
add(a, None) = a
add(a, b) = a + b

对此最pythonic、简洁的表达是什么? 到目前为止我有:

def add1(a, b):
    if a is None:
        return b
    elif b is None:
        return a
    else:
        return a + b

def add2(a, b):
    try:
        return a + b
    except TypeError:
        return a if a is not None else b

有没有更短的实现方式?

试试这个

def add(a,b):
    a = 0 if not a else a
    b = 0 if not b else b
    return a+b

使用布尔逻辑:

这是一个 Pythonic 的方法,使用惰性 or:

def add(a, b):
    return (a or 0) + (b or 0)

有过滤器

对于任意数量的加数,您可以使用 filter and sum:

def add(*p):
    return sum(filter(None, p))

print(add(3))
# 3
print(add(3, 5))
# 8
print(add(3, 5, 7))
# 15
print(add(3, None))
# 3
print(add(None))
# 0
print(add(None, 0))
# 0

有例外

请注意,之前的实现将为 return 0 add(None, None)。这是 empty sum.

的预期数学结果

返回 None 令人惊讶,当您使用 add.

的输出时可能会导致 TypeErrors

当用户未输入任何有效的加数时实现所需行为的一种方法是抛出异常:

def add(*p):
    summands = list(filter(None, p))
    if not summands:
        raise ValueError("There should be at least one defined value.")
    return sum(summands)

print(add(3))
# 3
print(add(3, 5))
# 8
print(add(3, 5, 7))
# 15
print(add(3, None))
# 3
print(add(None, 0))
# 0
print(add(0))
# 0
print(add(None))
# ValueError: There should be at least one defined value
print(add())
# ValueError: There should be at least one defined value

这相当紧凑,可以处理不同数量的术语:

def None_sum(*args):
    args = [a for a in args if not a is None]
    return sum(args) if args else None