如果3个措辞名称包含中间名,则用户应插入名称作为输入,然后使用是或否(或其任何衍生物)进行确认。到目前为止,如果答案是肯定的话,我已经开始工作了。但如果答案是否定的话,它会不断循环。
目的:如果答案是肯定的,程序将理解其带有中间名的3个名称,因此执行具有中间名的命名组合;如果不是,程序将理解其带有第二个姓氏而不是中间名的3个名称,因此相应地执行命名组合。
请注意我已经排除了很多用于共享目的的代码。
我做错了什么?我的问题是关于循环的elif部分。
print ('enter name')
providedname = input ()
while providedname != 'quit':
if len(providedname.split())==4:
pass
elif len(providedname.split())==3:
print ('Does the name include a middle name or middle initial? Please type yes or no:')
userinput = input()
if userinput.startswith ('ye' or 'Ye' or 'YE' or 'ya' or 'Ya' or 'YA'):
firstname, middlename, lastname = providedname.split()
elif userinput.startswith ('no' or 'No' or 'NO' or 'na' or 'Na' or 'NA'):
firstname, lastname, secondlastname = providedname.split()
else:
pass
print ('enter name or type quit or q to exit')
providedname=input()
continue
答案 0 :(得分:1)
你不能那样使用or
。它在英语中是有意义的,但它在Python中不起作用。表达您正在做的事情的一种方法是使用迷你for
循环以及any
函数,如下所示:
if any(userinput.startswith(string) for string in ['ye', 'Ye', 'YE', 'ya', 'Ya', 'YA']):
如果你稍微改变一下这个词的顺序,它几乎就像英语一样:
如果用户输入以此列表中的任何字符串开头...
更好的是首先小写输入字符串。然后你不必检查这么多组合。
userinput = input().casefold() # Python 3.3+
userinput = input().lower() # Earlier
if any(userinput.startswith(string) for string in ['ye', 'ya']):
碰巧,startswith
也可以接受字符串列表。你实际上可以放弃所有的any()
机器,只需:
if userinput.startswith(('ye', 'ya')):
(感谢@kindall提示。)
答案 1 :(得分:0)
它看起来好像你错过了你的elif中的打印命令的结尾'(名称包括....),导致其余部分被视为更多的文本输入。尝试添加',看看是否有帮助!
答案 2 :(得分:0)
首先,您可以拥有更复杂的名称,例如,#34; Oscar De La Hoya",这将跳过,因为名称将具有长度= 4.忽略难以识别的名称',接下来的事情是清理用户的输入。我会像这样清理用户的输入:
userinput = input().lower().strip()
通过这种方式,您可以使自己更简单,也更具可读性。
现在你可以做到:
if userinput == 'yes':
firstname, middlename, lastname = providedname.split()
else:
firstname, lastname, secondlastname = providedname.split()
最后(如其他答案所述),如果“有效”'输入已经给出,您想要使用break
突破while循环。
答案 3 :(得分:0)
你有两个主要问题(忽略所有的语法错误,假设它们只是你的问题,但你的实际代码还可以)
首先,你永远不会打破while循环,你必须在任何想要退出循环的地方使用scp
语句。
其次,你在循环结束时覆盖break
,这将使你没有实际名称,即使提供了正确的名称,变量也将被退出。
答案 4 :(得分:0)
所以,只需在解释器中运行它
>>> 'ye' or 'Ye' or 'YE' or 'ya' or 'Ya' or 'YA'
'ye'
您的startswith
并非像您认为的那样工作。
除此之外,如果小写字符串,则可以缩短该语句。
可运行的示例
while True:
providedname = input ('enter name or type quit or q to exit: ')
if providedname in {'quit', 'q'}:
break
names = providedname.split()
if len(names) == 4:
pass
elif len(names) == 3:
userinput = input('Does the name include a middle name or middle initial? Please type yes or no:')
if userinput[:2].lower() in {'ye', 'ya'}:
firstname, middlename, lastname = names
elif userinput[:2].lower() in {'no' , 'na'}:
firstname, lastname, secondlastname = names
else:
pass
print(firstname, lastname)