【问题标题】:Python infinite while loopPython无限while循环
【发布时间】:2015-05-22 11:40:55
【问题描述】:

我有这个代码:

Text = input("Copy Text here ")
WordList = Text.split(" ")
i = 0
for i in range (0, len(WordList)-1):
     i += 1
while (i <= len(WordList))  :
    if (WordList[i] == "Name" or "Name1" or "Name2") :
        print(WordList[i])
     else:
        print("No DATA")

如果我运行这段代码,我会遇到两个问题:首先它只打印最后一个条目,这可能是因为我忘记告诉它在找到“Name”、“Name2”或“Name1”时停止计数。更大的问题是这会以无限循环结束,我不知道为什么。

【问题讨论】:

  • while 循环中没有 i 更改。将 i+=1 放在 while 末尾。
  • 因为在while循环中你永远不会改变i的值,这是一个条件变量,因此条件始终保持为真,

标签: python loops for-loop while-loop infinite


【解决方案1】:

你有两个循环:一个 for 循环,它每次都增加 i (这是一个错误,因为 for 已经为你做了),以及一个尝试做实际工作的 while 循环, 但直到 for 循环终止后才会运行。

无论如何,在 Python 中使用索引变量来迭代列表是解决问题的错误方法。相反,您应该直接对其进行迭代:

text = "a b c Name d e Name2 f Name1 g"

for word in text.split(" "):
    if word in ("Name", "Name1", "Name2"):
        print(word)
    else:
        print("No DATA")

原始代码中的另一个问题是该行

if (WordList[i] == "Name" or "Name1" or "Name2") :

...这不是你想的那样。这里实际发生的是"Name" or "Name1" or "Name2" 被评估为"Name"(因为short circuit logic),然后测试它与WordList[i] 是否相等。测试某事物是否是多个值之一的正确方法是使用 in 运算符,如上面的代码所示。

【讨论】:

    【解决方案2】:
    text = input("Copy Text here ")
    wordlist = text.split(" ")
    for i in wordlist:
        if (i in ["Name", "Name1", "Name2"]):
            print (i)
        else:
            print ("No DATA")
    

    你把python很好地处理迭代的事情复杂化了,你不需要在每次迭代后递增计数器,实际上你不需要任何类型的计数器。

    【讨论】:

    • 谢谢,它有效,是的,我有把事情过度复杂化的倾向。不管怎样,你为我节省了很多时间,因为我想至少要一天才能和柜台说再见。
    • 请点赞或用绿色勾号标记,如果真的对你有帮助,谢谢@Godisalie
    【解决方案3】:

    将你的循环混合在一起。第一个循环唯一的功能是不断添加到 i 直到它是你的单词列表的长度 - 1。

    然后第二个循环将继续循环,直到 i > wordlist 的长度,它不会这样做,除非您在该循环中更改 i 的值。

    这也是它会打印最后一个单词的原因,因为 i 总是 wordList - 1。

    试试这个

    for x in range (0, len(WordList)):
        if ((WordList[x] == "Name") or (WordList[x] ==  "Name1") or (WordList[x] ==  "Name2")):
            print (WordList[x])
        else:
            print ("No Data")
    

    【讨论】:

    • if (WordList[x] == "Name" or "Name1" or "Name2"): 这行得通吗?
    • 您的if 声明没有按照您的想法执行。
    • 抱歉,发帖前没有检查,我的错。
    猜你喜欢
    • 2017-10-12
    • 2020-11-30
    • 2020-08-18
    • 2012-08-28
    • 2015-06-25
    • 2018-08-30
    • 1970-01-01
    • 2014-03-29
    • 2016-08-27
    相关资源
    最近更新 更多