Учет списка и функция%

Когда я использую следующий код

[i for i in range(-9, 10, 2) if not i%3)] 

это дает

 > (-9, -3, 3, 9) 

Почему он дает ответ? Что означает 'i%3' ?

Спасибо.

В вашем примере % – это оператор modulo . a % b возвращает остаток a / b .

Итак, в вашем примере цикл проходит:

 [-9, -7, -5, -3, -1, 1, 3, 5, 7, 9] 

-9 % 3 равно 0, потому что -9 делится на 3, и, следовательно, нет остатка. Однако 5 % 3 возвращает 2, потому что 3 идет в 5 раз, а 5 - 3 == 2 .

not i % 3 немного сложнее. Сначала оценивается i % 3 . Если результат больше 0, то он считается True . not является булевым оператором, который получает отрицание булева. Так что not True является Falsenot False is True ).

0 считается False , поэтому, если i % 3 == 0 , то i будет включен в новый список.


Теперь причина, по которой print("%s %s", ("hello", "world")) печатает «привет мир», потому что это не оператор modulo. Это форматирование строк . Документы объяснят это лучше меня: p. Просто случается, что % также используется.

i%3 – это остаток при делении i на 3. Однако он затем преобразуется в логическое (истинное / ложное) значение оператором not ; python делает это, делая 0 false и любое другое число true . Так что not i%3 истинно, когда i%3 равно 0; другими словами, когда i делится на 3.

range(-9,10,2) производит целые числа, начинающиеся с -9, приращение на 2, если они меньше 10. Другими словами, нечетные целые числа от -9 до +9. Таким образом, комбинация состоит в том, чтобы выбрать нечетные целые числа, делящиеся на 3 между -9 и +9, которые являются целыми числами, которые вы показываете (-9, -3, 3, 9)