为什么 python if 条件不适用于 "False" 的值?

Why is python if condition not working for values of "False"?

在下面的代码中,is_number 对于值 "foo"False,但这仍然会为该字符串打印 is a number。为什么?我该如何解决?

def string_is_number(a_string):
    pattern = re.compile(r'[0-9]+')
    if pattern.search(a_string):
        return("True")
    else:
        return("False")
 
for value in 42, 0.5, "foo":
    the_string = str(value)
    is_number = string_is_number(the_string)
    print(the_string, is_number)
    if is_number:
        print(the_string, "is a number")

输出:

42 True
42 is a number
0.5 True
0.5 is a number
foo False
foo is a number

Return一个bool,不是一个str:

if pattern.search(a_string):
    return True
else:
    return False 

Python 中的任何非空字符串都被认为是真实的(或“真实的”),包括 "False":

>>> bool("False")
True

当然,您的号码检测正则表达式有点不对劲:

re.match("^\d+([.,]\d+)?$", a_string)

将是一个更严格的测试。

您正在尝试 return“True”和“False”作为字符串。您需要像这样 return 它们作为布尔值:

def string_is_number(a_string):
    
    pattern = re.compile(r'[0-9]+')
    
    return pattern.search(a_string) # Returns True or False

您的函数失败,因为您返回的非空字符串总是True。一个更微妙的问题是,您将任何至少有一位数字的东西称为数字。所以“我不是第一”是一个数字。检查某物是否为“数字”的一个好方法是尝试转换它。在您的情况下,看起来您正在处理都可以转换为 float 的整数和浮点数。由于字符串文字中不允许使用逗号,因此需要将其分解,但您的函数可能是

def string_is_number(a_string):
    try:
        float(a_string.strip(','))
        return True
    except:
        return False