【问题标题】:Python not detecting a single letter, but detects two letters finePython 没有检测到单个字母,但可以检测到两个字母
【发布时间】:2015-06-20 12:06:43
【问题描述】:

这是我用来检测字符串是否包含字母的代码。如果没有检测到,它允许程序将字符串转换为浮点数。这个想法是我可以在尝试将带有字母的字符串转换为浮点数后阻止程序崩溃。

for i in range(1, len(argument)):
    if argument[i].isalpha():
        return False
        print("Ran option 1")
    else:
        return True
        print("Ran option 2")

打印行只是为了帮助我查看正在执行的部分。事实证明,他们都不是。

http://puu.sh/ivVI7/8598b82fe8.png

这是输出的屏幕截图。在前半部分,它检测到“aa”字符串并且不会使代码崩溃。但是,在后半部分,它无法检测到单个“a”并尝试将其转换为浮点数,从而导致程序崩溃。如果有人能伸出援手,将不胜感激。

如果有帮助,其余代码在这里:http://pastebin.com/Cx7HbM4c

【问题讨论】:

  • 请不要发布纯文本输出的图片。将输出复制到您的帖子中。
  • 只需使用 try/except 并捕获 ValueError

标签: python error-handling crash letters


【解决方案1】:

return 命令后面有 print 行,因此它们永远不会被执行。将print 移到return 上方。

您还可以使您的代码更具 Python 风格和可读性:

for char in argument:
   return char.isalpha()

【讨论】:

    【解决方案2】:

    Python 字符串是从 0 开始的。测试从不检查字符串中的第一个字符。

    for i in range(0, len(argument)):
    

    将这些知识归档,@DeepSpace 和 @helmbert 的答案中显示的 python 方式 (for char in argument) 似乎更干净。

    【讨论】:

    • 这似乎已经解决了。谢谢!
    【解决方案3】:

    在 Python 中,数组是零索引。这意味着,您需要从 0 开始迭代,而不是从 1 开始!

    您只需在循环体中添加print(argument[i]) 即可轻松重现:

    def func(argument):
        for i in range(1, len(argument)):
            print(argument[i])
    
    func("a") # Prints nothing
    func("ab") # Prints "b"
    

    尽可能接近原始代码,只需从 0 而不是 1 开始迭代:

    for i in range(0, len(argument):
        # ...
    

    更简单的是,您还可以直接迭代字符串

    for character in argument:
        print(character) # Will print every single character
        # ...
    

    【讨论】:

      【解决方案4】:

      好吧,如果你想知道你能不能转换字符串,你为什么不使用这样的函数:

      def convertable(value): 
          try: 
              float(value)
              return True
          except ValueError:
              return False
      

      【讨论】:

        【解决方案5】:

        如果您只想防止程序崩溃,例外就是您的朋友:

        argument = "abc"
        try:
            value = float(argument)
        except ValueError as e:
            print e, "is unacceptable"
        else:
            print value, "is acceptable as a float"
        finally:
            print "alright"
        

        输出:

        could not convert string to float: abc is unacceptable
        alright
        

        而如果argument = "3.14" 它输出:

        3.14 is acceptable as a float
        alright
        

        当然,您可以将所有这些逻辑放入一个函数中,以防您需要在整个程序中多次执行此操作。 玩得开心!

        【讨论】:

        • 不需要else和finally。
        • 当然。我故意添加它们以显示它们的行为,以便她/他可以正确设计她/他的代码。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-01-06
        • 1970-01-01
        • 2018-07-09
        • 1970-01-01
        • 2014-02-04
        • 1970-01-01
        相关资源
        最近更新 更多