为什么这个循环的第二部分不起作用?

时间:2016-11-30 23:17:35

标签: python python-3.x loops if-statement while-loop

如果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

5 个答案:

答案 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)