如果条件不适用于“False”的值,为什么python?

问题描述

在以下代码中,对于值 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

解决方法

返回一个 bool,而不是一个 str

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

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

>>> bool("False")
True

当然,您的号码检测的正则表达式有点偏离:

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

将是一个更严格的测试。

,

您试图将“True”和“False”作为字符串返回。您需要像这样将它们作为布尔值返回:

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

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

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