【问题标题】:Cannot get simple while loop working in Python无法在 Python 中获得简单的 while 循环
【发布时间】:2014-02-14 12:56:37
【问题描述】:
LETTERS = "abc"
correct = "cab "
guess = ""

while guess != correct:
    for i in LETTERS:
        position = random.randrange(len(LETTERS))
        guess += LETTERS[position]
        LETTERS = LETTERS[:position] + LETTERS[(position + 1):]
    print(guess)

我是 Python 新手,我想做这个简单的程序:

  • 将字母“abc”混在一起,随机创建一个新的三字母单词。
  • 打印杂乱无章的内容
  • 继续执行此循环,直到计算机出现“驾驶室”混乱。
  • 然后停下来。

我想出了这段代码,它给了我一个无限循环。我不知道为什么要这样做。我确定这很容易,但我看不到。需要一些帮助!谢谢!

【问题讨论】:

  • 您的意思是用空格结束您的correct 值吗?
  • 你的意思是在猜测失败后重新设置?
  • OP 还在 for 循环的每次迭代中更改 LETTERS。需要在 while 循环内立即使用 myLetters = LETTERS[:] 更改 LETTERS 的副本(并重置 guess

标签: python loops while-loop infinite


【解决方案1】:

您的 correct 值包含一个空格,但您的循环从不生成空格:

correct = "cab "

删除那个空格:

correct = "cab"

接下来,您的循环将LETTERS 减少为一个空字符串,因此您的循环只有一次 会产生一个随机的guess,但之后,您将永远被LETTERS = '' 困住,所以没有for 循环运行。

您最好使用random.shuffle 进行猜测:

LETTERS = list("abc")
correct = "cab"

while True:
    random.shuffle(LETTERS)
    guess = ''.join(LETTERS)
    if guess == correct:
        print(guess)
        break

【讨论】:

    【解决方案2】:

    我可以看到你有三个问题:

    1. "cab " 有空格,LETTERS 没有空格。所以你永远猜不出空格
    2. 您没有重置guess。您只需不断添加即可
    3. 您在 for 循环中更改 LETTERS,因此在您的 while 循环的第二次迭代中,它将完全为空。

    这就是我将如何去做你想做的事情(只需最少的修改):

    _LETTERS = "abc"
    correct = "cab"
    guess = ""
    
    while guess != correct:
        LETTERS = _LETTERS[:]
        guess = ""
        for i in LETTERS:
            position = random.randrange(len(LETTERS))
            guess += LETTERS[position]
            LETTERS = LETTERS[:position] + LETTERS[(position + 1):]
        print(guess)
    

    这是我将如何进行随机搜索(这就是你想要做的):

    guess = "abc"
    correct = "cab"
    
    while guess != correct:
        guess = list(guess)
        random.shuffle(guess)
        guess = ''.join(guess)
        print(guess)
    print(guess)
    

    当然,有更好的技术来正确猜测"cab"。如果你真的想尝试穷举搜索,那么你可以使用回溯 DFS:

    def DFS(letters, correct, sofar=None)
        if sofar is None:
            sofar = ''
        if not letters:
            if sofar == correct:
                print("Yay! I found it")
            else:
                print("Oops! I found %s instead" %sofar)
        else:
            for i,char in enumerate(letters):
                DFS(letters[:i]+letters[i+1:], correct, sofar+char)
    

    【讨论】:

    • 您的第二个代码 sn-p 不起作用。您正在丢弃打乱列表。
    • @user2357112:错误。 random.shuffle 就地。它返回None
    • 就地放置在您立即丢弃的列表中。
    • @user2357112:很好。我完全错过了。现在已经修好了。谢谢
    • 感谢您的所有回答! “出租车”的那个空间是一个错字。它不应该在那里!我现在明白出了什么问题哈哈,多么愚蠢的事情。现在它工作正常。还要感谢您提供 random.shuffle 的东西。我不知道那个!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-10-10
    • 2012-05-14
    • 2021-09-25
    • 1970-01-01
    • 1970-01-01
    • 2014-03-09
    • 1970-01-01
    相关资源
    最近更新 更多