def get_chess_square_color(column, row):
if not (column and row in range(9)):
return ''
elif column == row:
return 'white'
else:
return 'black'
assert get_chess_square_color(0, 8) == ''
После написания этой функции я заметил эту строку кода assert get_chess_square_color(0, 8) == ''
Я действительно не понимаю, обычно 0 является частью диапазона (9), поэтому я ожидал, что get_chess_square_color(0, 8) вернет «белый»,
Соответствуют ли в этом случае элементы диапазона не своему числовому значению, а представляют собой индексацию?, например
text = 'Look'
print(text[0])
ВЫВОДИТ 'L', первый символ текста, индексированный цифрой 0
Это не делает то, что вы думаете: column and row in range(9) Подсказка: он анализируется как column and (row in range(9)). Таким образом, оно всегда будет ложным, если column ложно, то есть когда column является 0. Такая ошибка случается, когда вы пытаетесь изобрести свой собственный синтаксис.
Это не опечатка. ТАК что происходит? Это то, чего ОП не понимает, и с этим ему нужно помочь.
Связанные дубликаты неточны, но указывают на основную проблему. Точный случай описан в существующих ответах и комментариях здесь.
@AndrasDeak--СлаваУкраїни, так почему же близко? Если связанные дубликаты неточны?
@ChukwujiobiCanon, потому что основная проблема является дубликатом, на нее отвечали десятки, а может быть, и сотни раз, и это тот вопрос, который вряд ли поможет будущим читателям (подумайте, найдет ли кто-то с такой же проблемой этот вопрос). Это, вероятно, также объясняет любые голоса с «опечатками». Нам действительно не нужны здесь больше ответы, завершение уместно.






Ваше заявление:
if not (column and row in range(9)):
эквивалентно:
if not ((column) and (row in range(9))):
column сам по себе оценивается как ложь, если он равен 0, и как истина, если это любое другое число.
Условие if not (column and row in range(9)): не проверяет, находится ли столбец в диапазоне (9). Он только проверяет, находится ли строка в диапазоне (9) и не равен ли столбец нулю.
То, что вы пытаетесь написать, должно выглядеть так:
if column not in range(9) or row not in range(9):
Чтобы проверить, являются ли несколько значений членами последовательности, вы не можете сделать это, объединив несколько and вместе, чтобы проверить это. Вот почему ваш подход не работает.
Однако вы можете использовать set, чтобы пройти тест на членство. Создайте set из sequence, а затем также создайте set из значений, которые нужно проверить.
Пример:
a, b = 17043, 5367709
{a, b} <= set(range(10000000)) # <— Returns True because a and b are members of the range range(10000000).a, b = "frog", "toad"
{a, b} <= set(•••A very long sequence of amphibians read from file•••)Это масштабы, и я подумал, что мне следует разместить это здесь для потомков. Но ваш случай очень прост:
if not {column, row} <= range(9)):Теперь два значения column и row проверяются на принадлежность к диапазону значений (9).
Вы наверняка имеете в виду
column in range(9) and row in range(9)?