名称输入验证仅使用字母

时间:2015-10-15 17:50:31

标签: python validation variables for-loop input

有人可以帮我解决这个问题吗

name=input("What is your name?").lower()
for char in name:
      if not char.isalpha():
        print ("invalid name")
        name=input("What is your name?").lower()

不幸的是,当我运行它时,如果我将数字1设为名称,则无论如何都会在第二次尝试时将其设置为正确。例如,如果我输入123,那么相同的过程将重复3次

What is your name?123
What is your name?123
invalid name
What is your name?bob
invalid name
What is your name?bob
invalid name
What is your name?bob
What is  9 - 8 ?

如果我输入1

What is your name?1
invalid name
What is your name?bob
What is  7 - 4 ?

3 个答案:

答案 0 :(得分:2)

问题在于,即使您发现该名称无效,该循环仍会继续。此外,这只要求两次,并且第二次不验证名称。

除了if之外,您应该使用while循环,而且,您实际上不需要分别检查str.isalpha()每个字符,您可以检查字符串是否为整体而言,如果字符串中的任何字符不是字母,它将返回False。示例 -

while True:
    name=input("What is your name?").lower()
    if name.isalpha():
        break
    print ("invalid name")

#Rest of your logic.

str.isalpha()对整个字符串的行为示例 -

>>> 'asd'.isalpha()
True
>>> 'a1sd'.isalpha()
False
>>> 'a_sd'.isalpha()
False
>>> 'aAdsd'.isalpha()
True

答案 1 :(得分:0)

首先,如果您希望返回一个字符串(而不是让Python将您的输入解释为表达式),请将input()更改为raw_input()(提供便利的解释here)。这仅适用于Python 2.X而不是3.X。

其次,来自documentationisalpha()

  

如果字符串中的所有字符都是字母并且至少有一个字符,则返回true,否则返回false。

因此,您可以传入整个字符串,而不是检查每个字符。

它将循环三次,因为你循环初始字符串(例如'123'),如果你要输入'1bc',第一次尝试将无效,但第一次和第二次是有效的。< / p>

相反,为什么不检查名称是否仅包含整个字母?

name = raw_input('What is your name?').lower()
valid = False

while not valid:
    if name.isalpha():
        is_valid = True
        # Do whatever you need to do
    else:
        name = raw_input("Name is invalid, please try again.").lower()

或者如果你希望你使用while块,Anand S Kumar会写出它是否最适合你(我只是更喜欢它更明确)。

答案 2 :(得分:0)

主要问题是因为当你使用for char in name:时,它会遍历所有先前错误的输入(在你的情况下:123)。因此,它会要求您输入您的名字3次。

为了不偏离你所做的太多,我想出了这个供你参考。请注意isalpha()本身可以使用name,所以你不需要循环遍历所有角色。

name = input("What is your name?").lower()
while not name.isalpha():
    print("invalid name")
    name = input("What is your name?").lower()

print('Your name is ' + name)