【问题标题】:Why is python if condition not working for values of "False"? [closed]如果条件不适用于“False”值,为什么python? [关闭]
【发布时间】:2021-03-31 10:15:01
【问题描述】:

在下面的代码中,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

【问题讨论】:

  • 该函数返回一个字符串,而不是布尔值
  • 你的正则表达式也匹配“lkjh456uzt”
  • 如果字符串中有任何数字,则不要使用返回“True”的string_is_number,而是考虑完全转储该函数并仅使用the_string.isdigit()
  • 您的“是一个数字”检查需要多准确? 6,381 是写数字的正常方式。但是6,33,1呢?那是一个数字吗? 12:22?

标签: python if-statement boolean boolean-expression


【解决方案1】:

返回bool,而不是str

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

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

>>> bool("False")
True

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

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

将是一个更严格的测试。

【讨论】:

  • 我喜欢你的回答,但部分修复是完全放弃正则表达式,因为它只测试字符串是否有数字,而不是数字。 str.isdigit() 是一个很好的替代品。
  • 但这并不是问题的一部分。我认为“1,23”或“1.23”应该被视为数字,所以str.isdigit 不够
  • ...除了可能不是。才发现里面有逗号。
【解决方案2】:

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

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

【讨论】:

  • 我们可以尝试很多,但您介意解释一下它是否有效以及为什么有效吗?
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-12
    • 1970-01-01
    • 2014-08-17
    • 1970-01-01
    • 2018-06-26
    相关资源
    最近更新 更多