Почему диапазон (n) не включает числовое значение 0?

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 in range(9) and row in range(9)?

user207421 05.06.2024 04:26

Это не делает то, что вы думаете: column and row in range(9) Подсказка: он анализируется как column and (row in range(9)). Таким образом, оно всегда будет ложным, если column ложно, то есть когда column является 0. Такая ошибка случается, когда вы пытаетесь изобрести свой собственный синтаксис.

Tom Karzes 05.06.2024 04:36

Это не опечатка. ТАК что происходит? Это то, чего ОП не понимает, и с этим ему нужно помочь.

Chukwujiobi Canon 05.06.2024 05:32

Связанные дубликаты неточны, но указывают на основную проблему. Точный случай описан в существующих ответах и ​​комментариях здесь.

Andras Deak -- Слава Україні 05.06.2024 15:19

@AndrasDeak--СлаваУкраїни, так почему же близко? Если связанные дубликаты неточны?

Chukwujiobi Canon 07.06.2024 07:00

@ChukwujiobiCanon, потому что основная проблема является дубликатом, на нее отвечали десятки, а может быть, и сотни раз, и это тот вопрос, который вряд ли поможет будущим читателям (подумайте, найдет ли кто-то с такой же проблемой этот вопрос). Это, вероятно, также объясняет любые голоса с «опечатками». Нам действительно не нужны здесь больше ответы, завершение уместно.

Andras Deak -- Слава Україні 07.06.2024 10:49
Почему в 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
6
90
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ваше заявление:

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).

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