Comments 12
Круто!
В 1С'е, хоть она и в доску паскаль, не сделали обратный цикл (downto), поэтому приходится так:
for i = -Count+1 to 0 do
some = somearray[-i];
enddo;
хороший трюк, теперь главное не забыть когда, в следующий раз, он понадобится
В реальном коде - никогда. Отличный способ запутать потом себя и коллег.
Какой код читается лучше #1
, #2
или #3
?
s = 'aaa;bbb;ccc;ddd'
parts = s.split(';')
last = parts[len(parts)-1] # 1
*_, last = s.split(';') # 2
last = s.split(';')[-1] # 3
Опыт показывает, что #3
очевиден, прост и удобен любому разработчику на Python. Особенно в сравнении с #1
где надо написать две строки вместо одной, а ещё посчитать длину списка. Кстати, благодаря отрицательным индексам, первый вариант будет работать с пустым списком без ошибок.
Заворачивание индексов - это просто инструмент, который надо применять там где нужно, а там где не нужно, применять не нужно. Вот и всё. Это так же как с goto, не надо слушать "фанатиков чистоты кода", а использовать, руководствуясь опытом и здравым смыслом.
Кстати, благодаря отрицательным индексам, первый вариант будет работать с пустым списком без ошибок.
С чего вдруг? Что же будет присвоено в last
?)
Этот способ может вызвать баги, которые не могли бы появиться при использовании индексации с конца. Предположим, хотим получить 5-й элемент с конца, но список оказался слишком коротким:
a = [0,1,2]
print(a[len(a) - 5])
Получаем 1
вместо ожидаемой ошибки. Если бы было написано a[-5]
, то мы бы получили нужную ошибку.
Добавляет возможность решать ребусы в чужом коде.
А интересно на больших циклах это как скажется на производительности? Или ни как?
Будет ли этот приём работать как на LSB, так и на MSB архитектурах?
Порядок байт тут ни при чём. Этот приём работает за счёт особенностей отрицательных чисел в дополнительном коде
Симметричная индексация в Python