【问题标题】:User Input being incorrectly appended to Python List用户输入被错误地附加到 Python 列表
【发布时间】:2018-03-26 16:48:06
【问题描述】:

这里是 Python 新手。

我的程序提示用户输入他们的姓名。只有一个“正确”的名字,那就是约翰。当用户输入不正确的名字(即不是 John)时,程序会将不正确的名字添加到列表中。一旦输入了正确的姓名,John 我想打印不正确的姓名列表。

我遇到/不明白的问题是,当输入 John 时,它已被附加到错误名称列表中。以下是我的代码:

incorrectNames = []
name = ""

while name != "John":
    name = input("Enter your name: \n")
    incorrectNames.append(name)
    if name == "John":
        print("Incorrect names", incorrectNames)

此代码返回 [Andy, Sam, John] 而不仅仅是 [Andy, Sam](如果这两个名字是在 John 之前输入的错误)​​。这是由于操作顺序吗?我以为一旦变量名是 John 就会绕过附加指令?

任何形式的清晰度都将不胜感激或为我指明正确的方向。

提前致谢!

【问题讨论】:

  • 在附加到列表之前,您需要检查名称John。如果名称等于John,则显示所有名称,否则附加到列表。
  • 附带说明,变量 name 不是 John;它的名字总是name,它的”John”

标签: python python-3.x list data-structures append


【解决方案1】:

Python 按照你给它们的顺序执行你的指令。这就像一个食谱 - 如果您将“将蛋糕放入烤箱”作为第 1 步,将“预热烤箱”作为第 2 步,那么您将把蛋糕放入冷烤箱中。

所以,你可以这样修复它:

if name == "John":
    print("Incorrect names", incorrectNames)
incorrectNames.append(name)

但是,这仍然会将 John 添加到列表中。它会在你打印列表后添加他,所以它不会出现在输出中,但你可能根本不希望他添加。所以更好的答案可能是:

if name == "John":
    print("Incorrect names", incorrectNames)
else:
    incorrectNames.append(name)

或者,或者,可能更容易将名称打印为您在循环之后执行的操作,而不是在循环内有条件地打印:

while name != "John":
    name = input("Enter your name: \n")
    if name != "John":
        incorrectNames.append(name)

print("Incorrect names", incorrectNames)

此时,您可能会认为仔细检查有点多余并执行以下操作:

incorrect_names = []

while True:
    name = input("Enter your name: \n")
    if name == "John":
        break
    incorrectNames.append(name)

print("Incorrect names", incorrectNames)

这种配方式排序是大多数编程语言的工作方式,称为“命令式”执行。一些“函数式”语言通过根本不让您编写多条指令来避免这种混淆。你必须明确地说“这个函数由其他两个函数组成”或类似的。其他“数据流”和“逻辑”语言的工作方式更像是一个电子表格,你可以告诉它每个变量如何依赖于其他变量,然后让它找出序列以获取你要求的任何变量的值。但一般来说,允许您按顺序编写一堆指令的语言以命令式的方式执行它们,就像 Python 一样。

【讨论】:

    【解决方案2】:

    我将在下面提供一个更正的代码,然后给出解释:

    守则:

    incorrectNames = []
    name = ""
    
    while name != "John":
        name = input("Enter your name: \n")
        if name != "John":
            incorrectNames.append(name)
        if name == "John":
            print("Incorrect names", incorrectNames)
    

    说明:
    尝试想象运行代码时发生的情况。假设我们在用户每次输入后都遵循变量name 和列表incorrectNames 的值。

    输入Andy后,name的值由于输入语句变成了'Andy'。现在,请注意紧跟在输入语句之后的是行incorrectNames.append(name)。这会导致列表incorrectNames 变为['Andy']。

    在此之后,“Sam”也会发生相同的过程。首先它进入name,然后它被附加到列表中,使incorrecNames变成['Andy','Sam']。

    然后是最后一个循环,当真正的动作发生时。

    现在用户输入“John”。但问题就在这里:紧跟在输入语句之后的是行incorrectNames.append(name)。这意味着即使不检查 name 的值,它也会附加到incorrectNames

    您所要做的就是插入一些代码来检查name 的值,如果是John,则不要将其附加到incorrecNames

    【讨论】:

      【解决方案3】:

      其实很简单。无论名称是否等于“John”,您都将名称附加到列表中。要解决此问题,只需在 if 语句后添加 else 语句即可。

      incorrectNames = []
      name = ""
      
      while name != "John":
          name = input("Enter your name: \n")
          if name == "John":
              print("Incorrect names", incorrectNames)
          else:
              incorrectNames.append(name)
      

      注意:您可能需要添加break 语句来告诉程序退出循环,否则您的应用程序将永远不会退出。

      【讨论】:

        【解决方案4】:

        当输入 John 时,您处于 while 循环(下一次迭代)中。接下来,将 John 附加到列表中,然后测试 name John。如果你在追加之前测试 John,你会得到你想要的结果:

        incorrectNames = []
        name = ""
        
        while name != "John":
            name = input("Enter your name: \n")
            if name == "John":
                print("Incorrect names", incorrectNames)
            incorrectNames.append(name)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2013-08-15
          • 2018-02-09
          • 2019-04-12
          • 2020-01-09
          • 1970-01-01
          • 2015-05-30
          • 2014-07-01
          相关资源
          最近更新 更多