Проблема заключается в while marker != 'X' or marker != 'O'
.
Что происходит в вашей первой попытке, так это то, что даже если marker != 'X'
равно False (маркер равен равен 'X'), тогда marker != 'O'
ДОЛЖНО быть истинным. Таким образом, он всегда будет запрашивать ввод снова, потому что это «тот или иной».
Предположим, marker != 'X'
- это выражение A и marker != 'O'
- это выражение В . Тогда, согласно DeMorgan's L aws, у вас есть:
(not (A and B)) is equivalent to ((not A) or (not B))
И:
(not (A or B)) is equivalent to ((not A) and (not B))
Следовательно, ваша последняя попытка работает должным образом, потому что:
while not (marker == 'X' or marker == 'O'):
Эквивалентно:
while (not marker == 'X') and (not marker == 'O'):