【问题标题】:Why doesn't the second part of this loop work? [closed]为什么这个循环的第二部分不起作用? [关闭]
【发布时间】:2016-11-30 23:17:35
【问题描述】:

用户应插入一个名称作为输入,然后用是或否(或其任何派生词)确认三字名称是否包含中间名。到目前为止,如果答案是肯定的,我已经让循环工作了;但是如果答案是否定的,它会一直循环问题。

目的:如果答案是肯定的,程序将理解它是一个带有中间名的三字名称,因此执行与中间名的命名组合;如果它不是,程序将理解它是一个 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

【问题讨论】:

  • 该代码在语法上无效。此外,它仅以单个空格缩进,因此很难阅读。提供一个minimal reproducible example,它实际上重现了问题
  • 提示:if userinput[:2].lower() in {'ye', 'ya'}:
  • 谢谢乔恩,它的代码很长,所以我不得不把它删掉。我添加了双空格作为缩进,以使其更易于阅读。我还添加了我打算如何拆分三个单词的名称输入。

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


【解决方案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 的提示。)

【讨论】:

  • startswith() 将采用一组备选方案,因此您不需要该生成器表达式。 startswith(("ye", "ya")) 会的。
【解决方案2】:

所以,只需在解释器中运行它

>>> '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)

【讨论】:

  • 非常感谢@cricket_007,我通过解释器运行它并意识到我完全误解了orstartswith。您的解决方案是正确的,非常有帮助。
【解决方案3】:

看起来好像您在 elif 内的 print 命令中缺少结尾 ' (“名称是否包括......),导致其余部分被视为更多文本输入。尝试添加 ' 看看是否有帮助!

【讨论】:

  • 我认为这只是问题中的错字,而不是 OP 的实际代码。
  • 你说得对,我忘了把它输入到我的帖子中,谢谢。
【解决方案4】:

首先,您可以使用更复杂的名称,例如“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 循环。

【讨论】:

  • 谢谢@David542,我将阅读这些解决方案以了解它们并尝试一下。我正在通过这个程序学习 Python。
【解决方案5】:

您有 2 个主要问题(忽略所有语法错误,假设它们只是在您的问题上,但您的实际代码还可以)

首先,您永远不会跳出 while 循环,您必须在要退出循环的任何地方使用 break 语句。

第二次你在循环结束时覆盖providedname,这会让你没有实际的名字,即使提供了正确的名字,变量也会被退出。

【讨论】:

  • 感谢@Dalvenjia,在实践中我从来没有真正理解过break语句的使用。我试试看。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-09
  • 2013-12-13
  • 2010-10-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多