Я изучаю 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 вообще?
Любая подсказка приветствуется.
Лучшее объяснение 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
, вызывая прекращение цикла.
но вы подтвердили, что когда угадали = Ложь --> не угадали = Верно
в цикле for, о котором я говорю (github.com/kiteco/python-youtube-code/blob/master/…), есть еще одно предположение = True, которое завершает код. Но я не понимаю логики этого. Я имею в виду, это как пока петля верна ..... угадал = истина. Кажется, это лишнее... Извините, я еще новичок...
Петля не может быть истинной или ложной. Условие not guessed
может быть истинным или ложным. И это условие переоценивается после каждой итерации цикла. После этой итерации, в которой guessed
становится True
, условие while больше не оценивается как True
. Так что not guessed
нельзя просто заменить на True
.
Во-первых: Большое спасибо за ваши комментарии и терпение. К сожалению, я до сих пор не понимаю. Разве это не похоже на определение чего-либо: если я определяю a = b, тогда я могу использовать a и b взаимозаменяемо. Если я определяю «догадка = ложь», нельзя ли использовать их взаимозаменяемо? Когда я отрицаю догадку, следует: «не догадка = Истина» (как обсуждалось). Тогда внутри цикла while я ожидал бы чего-то вроде угаданного = False, так что условие цикла while («не угаданное») не выполняется, поскольку не угадано = True != угадано = False...
Да, вы можете использовать две стороны задания взаимозаменяемо, пока это задание активно. Но переменные можно переназначать, тем самым полностью переопределяя предыдущее назначение. После установки guessed = True
guessed
больше не равно False
.
Условие not guessed
выполняется после начального присваивания guessed = False
, до первого раунда цикла. В этот момент запускается цикл. Условие больше не выполняется после раунда, в котором происходит переназначение guessed = True
. В этот момент цикл останавливается.
вот и все. Понял. Большое спасибо!
Я думаю, что это больше с точки зрения читабельности кода. Как и в игре, изначально вы не угадывали, поэтому догадка ложна, и вы будете оставаться в цикле ожидания до тех пор, пока игрок не угадает ответ.