Как правильно использовать циклы «пока нет» в python?

Я изучаю 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:

Была переменная под названием «догадка», изначально установленная в False.

в начале цикла while написано:

while not guessed ...

Но не похоже ли это на двойное отрицание? Когда угадал = Ложь, то не должен не угадать == Верно? так что мы могли бы также просто написать в то время как True и даже не нужно было бы угадывать переменную?

Или как понять понятие while not вообще?

Любая подсказка приветствуется.

Я думаю, что это больше с точки зрения читабельности кода. Как и в игре, изначально вы не угадывали, поэтому догадка ложна, и вы будете оставаться в цикле ожидания до тех пор, пока игрок не угадает ответ.

prathap sagar 14.12.2020 18:02
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
1
1 058
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Лучшее объяснение while not guessed состоит в том, что, по сути, это означает, что «догадка не равна истине». Это означает, что это в основном «пока догадка ложна». Таким образом, цикл while будет выполняться до тех пор, пока предположение будет ложным, а количество попыток > 0. Однако, если каждое предположение будет истинным, цикл while перестанет выполняться.

Главное, что not не означает отрицание в этом смысле. Это просто означает, что цикл while выполняется до тех пор, пока значение угаданного является ложным, а НЕ истинным. Я понимаю путаницу в этом, но это важный факт, который нужно знать.

Но не похоже ли это на двойное отрицание? Когда guessed = False, то не следует not guessed == True?

Да.

чтобы мы могли просто написать while True и даже не нуждались бы в переменной guessed?

Нет, потому что значение переменной guessed может (и, скорее всего, изменится) на True в какой-то момент выполнения цикла — ведь переменная называется переменной, потому что ее значение может меняться между разными состояниями выполнения программы. Тогда not guessed будет оцениваться как False, и цикл while завершится.
С другой стороны, цикл while True будет работать бесконечно, потому что True всегда останется True.

В этом весь смысл конструкций while: используется переменная (или какое-то более сложное условие, включающее различные значения, например not variable), которое первоначально оценивается как True и запускает цикл, но при выполнении некоторого условия меняет свое значение на False, вызывая прекращение цикла.

но вы подтвердили, что когда угадали = Ложь --> не угадали = Верно

JKnow 15.12.2020 18:57

в цикле for, о котором я говорю (github.com/kiteco/python-youtube-code/blob/master/…), есть еще одно предположение = True, которое завершает код. Но я не понимаю логики этого. Я имею в виду, это как пока петля верна ..... угадал = истина. Кажется, это лишнее... Извините, я еще новичок...

JKnow 15.12.2020 19:03

Петля не может быть истинной или ложной. Условие not guessed может быть истинным или ложным. И это условие переоценивается после каждой итерации цикла. После этой итерации, в которой guessed становится True, условие while больше не оценивается как True. Так что not guessed нельзя просто заменить на True.

Natalie Clarius 15.12.2020 19:05

Во-первых: Большое спасибо за ваши комментарии и терпение. К сожалению, я до сих пор не понимаю. Разве это не похоже на определение чего-либо: если я определяю a = b, тогда я могу использовать a и b взаимозаменяемо. Если я определяю «догадка = ложь», нельзя ли использовать их взаимозаменяемо? Когда я отрицаю догадку, следует: «не догадка = Истина» (как обсуждалось). Тогда внутри цикла while я ожидал бы чего-то вроде угаданного = False, так что условие цикла while («не угаданное») не выполняется, поскольку не угадано = True != угадано = False...

JKnow 15.12.2020 19:28

Да, вы можете использовать две стороны задания взаимозаменяемо, пока это задание активно. Но переменные можно переназначать, тем самым полностью переопределяя предыдущее назначение. После установки guessed = Trueguessed больше не равно False.

Natalie Clarius 15.12.2020 20:06

Условие not guessed выполняется после начального присваивания guessed = False, до первого раунда цикла. В этот момент запускается цикл. Условие больше не выполняется после раунда, в котором происходит переназначение guessed = True. В этот момент цикл останавливается.

Natalie Clarius 15.12.2020 20:09

вот и все. Понял. Большое спасибо!

JKnow 15.12.2020 20:48

Другие вопросы по теме