Python 未检测到单个字母,但检测到两个字母正常

Python not detecting a single letter, but detects two letters fine

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

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

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

您还可以使您的代码更符合 pythonic 和更具可读性:

for char in argument:
   return char.isalpha()

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

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

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

在 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
    # ...

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

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

如果您只想防止程序崩溃,那么您的朋友们除外:

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

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