【问题标题】:How to properly use "while not" loops in python?如何在python中正确使用“while not”循环?
【发布时间】:2021-03-25 07:58:51
【问题描述】:

我从这几天开始学习 python。我确实理解了 while 和 for 循环的一般概念。然而,此刻我试图理解为一个刽子手游戏编写的代码,我偶然发现了以下代码行:

import random
from words import word_list


def get_word():
    word = random.choice(word_list)
    return word.upper()


def play(word):
    word_completion = "_" * len(word)
    guessed = False
    guessed_letters = []
    guessed_words = []
    tries = 6
    print("Let's play Hangman!")
    print(display_hangman(tries))
    print(word_completion)
    print("\n")
    while not guessed and tries > 0:

有一个名为“guessed”的变量最初设置为 False。

在while循环的开头,它是这样写的:

while not guessed ...

但这不是双重否定吗?当 guessed = False 时,那么不应该 not guessed == True 吗? 这样我们也可以只写 while True 甚至不会需要变量猜测

或者我如何理解 while not 的一般概念?

感谢任何提示。

【问题讨论】:

  • 我认为它更多的是从代码可读性的角度来看。就像在游戏中一开始你没有猜测一样,所以猜测是错误的,你将停留在 lwhile 循环中,直到玩家没有猜到答案。

标签: python while-loop boolean logic


【解决方案1】:

while not guessed 的最佳解释是它本质上是在说“虽然猜测不等于真实”。这就是说它基本上是“虽然猜测是假的”。因此,只要猜测为假并尝试 > 0,while 循环就会运行。但是,如果每个猜测都为真,则 while 循环将停止运行。

关键是在这个意义上,not 并不意味着否定。这只是意味着只要guessed 的值为false 而不是true,while 循环就会运行。我理解其中的困惑,但这是一个重要的事实。

【讨论】:

    【解决方案2】:

    但这不是双重否定吗?当guessed = False,那么不应该not guessed == True

    是的。

    这样我们也可以只写while True,甚至不需要变量guessed

    不,因为变量guessed 的值可以(并且很可能会)在循环执行期间的某个时间点更改为True——毕竟,变量被称为变量,因为它的值可以在程序执行的不同状态。然后not guessed 将评估为Falsewhile 循环将终止。
    另一方面,while True 循环将无限运行,因为True 将始终保持为True

    这就是while 构造的全部意义:使用一个变量(或一些涉及可变值的更复杂的条件,例如not variable),它最初评估为True 并使循环运行,但是当某些条件满足时会将其值更改为False,从而导致循环终止。

    【讨论】:

    • 但您同意当猜测 = False --> 未猜测 = True
    • 在我所指的 for 循环中 (github.com/kiteco/python-youtube-code/blob/master/…),还有另一个 guessed = True 结束了代码。但我不明白这背后的逻辑。我的意思是,就像当循环为真时......猜测=真。好像是多余的……不好意思,我还是新手……
    • 循环不能为真或假。条件not guessed 可以为真或假。并且在每次循环迭代后重新评估该条件。在guessed 变为True 的迭代之后,whlile 条件not 不再评估为True。所以not guessed不能简单的换成True
    • 首先:非常感谢您的 cmets 和耐心。不幸的是,我仍然不明白。这不就像定义一些东西:如果我定义 a = b,那么我可以互换使用 a 和 b。如果我定义“guessed = False”,我不能互换使用它们吗?当我否定猜测时,它遵循:“未猜测=真”(如所讨论的)。那么在while循环中,我会期待像guessed = False这样的东西,因此while循环的条件(“未猜到”)不满足,因为未猜到= True!=guessed = False ...
    • 是的,您可以交替使用作业的两侧——只要该作业处于活动状态。但是变量可以被重新赋值,从而完全覆盖之前的赋值。设置guessed = True后,guessed不再等于False
    猜你喜欢
    • 2021-10-19
    • 1970-01-01
    • 1970-01-01
    • 2017-10-05
    • 1970-01-01
    • 2022-11-23
    • 2013-10-29
    • 2012-11-04
    • 1970-01-01
    相关资源
    最近更新 更多