有人可以帮我解决这个问题吗
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 ?
答案 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。
其次,来自documentation的isalpha()
:
如果字符串中的所有字符都是字母并且至少有一个字符,则返回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)