2014-11-05 2 views
-2

Я видел такой код в Интернете и в ответ на мои вопросы в заявлениях людей if.если синтаксис оператора - отличается от приведенного

if (not (letter.lower() in word) or not(letter.lower() in guessed_letters)) and letter != ' ': 

Может ли кто-то сломать это? Это связано с тем, что исходный ввод сравнивается с фразой, не указанной.

+2

В какой части конкретно у вас есть вопрос? – AtAFork

+3

«Разные, чем учили» имеет смысл, если вы расскажете нам, чему вас учили. –

ответ

1

Начнем с верхней:

(not (letter.lower() in word) or not(letter.lower() in guessed_letters)) and letter != ' ' 

Это два условия, разделенные and:

a = (not (letter.lower() in word) or not(letter.lower() in guessed_letters)) 
b = letter != ' ' 
result = a and b 

Смысл этого b довольно очевидна, так давайте дадим ему лучшее название:

a = (not (letter.lower() in word) or not(letter.lower() in guessed_letters)) 
not_space = letter != ' ' 
result = a and not_space 

Но вы все еще озадачены этим a, поэтому давайте разложим его так же. Это выражение в скобках, что то же самое, что внутри скобок, так что давайте пропустить эту часть и перейти право:

x = not (letter.lower() in word) 
y = not (letter.lower() in guessed_letters) 
a = x or y 

Теперь Они должны быть достаточно малы, чтобы разобрать в вашей голове. Если нет, вы можете сделать еще один шаг, но обратите внимание, что вы также можете просто добавить несколько вызовов print, например print(letter, x, y), и запустить программу и посмотреть, поможет ли это.

Во всяком случае, давайте дадим им имена:

not_found = not (letter.lower() in word) 
not_guessed = not (letter.lower() in guessed_letters) 
new_letter = not_found or not_guessed 
not_space = letter != ' ' 
result = new_letter and not_space 

И теперь вы сделали: вы проверяете, что письмо это новое письмо (ни в слове, ни не догадывался), а не пространство ,


Если вы хотите, чтобы принять это до предела, это будет выглядеть примерно так: *

a1a1a1a = letter.lower 
a1a1a1 = a1a1a1a() 
a1a1a = a1a1a1 in word 
a1a1 = (a1a1a) 
a1a = not a1a1 
a1b1a1a = letter.lower 
a1b1a1 = a1b1a1a() 
a1b1a = a1b1a1 in guessedletters 
a1b1 = (a1b1a) 
a1b = not a1b1 
a1 = a1a or a1b 
a = (a1) 
b = letter != ' ' 
result = a and b 

И тогда вы можете идти шаг за шагом, устраняя те, которые не делают ничего, что дает промежуточный имена для значимых с самого низкого уровня вверх и т. д.

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

* На самом деле, если вы действительно хотите разбить его так, как это делает Python, вы можете попросить Python сделать это за вас, используя модуль ast.

0

попробовать так:

if letter.lower() not in word or letter.lower() not in guessed_letters and letter != ' ': 

почему unnwanted скобки, если можно обрабатывать Постулаты

+0

Я согласен, что это больше pythonic ... но я не уверен, что он отвечает на его вопрос (если честно, я не совсем уверен, что вопрос) +1, но не –

+0

Я тоже не уверен, только что сформировал его в pythonic way – Hackaholic

+0

Я не согласен, что это Pythonic. «Явный лучше, чем неявный». –

0

если либо строчная буква не в слове или строчной буквы не в списке угаданных номеров , и письмо не пробел, то сделать что-то ... это, скорее всего, для палача типа игры

обычно то, что вы делаете, это добавить его в список угаданных букв (как минимум)