Python: Массив с конца: ~n

2014/02/23

Чем дольше изучаю Python, тем больше я его люблю и тем сильнее он мне нравится. Если вы хоть немного знакомы с Python, то и slicing наверняка знаете и в этом slicing есть особенность — элементы в массивах, словарях и так далее, если их считать с начала, нумеруются с 0 (как и во всех языках программирования), а если с конца — с минус единицы.

Python: Массив с конца: ~n

print("Hello"[0], "Hello"[-1])
(H, o)

Когда я только начал учить Python, то для меня такое поведение было нормой и вполне логичным. До тех пор, пока вместо фиксированных index notation не пришлось использовать переменные:

i=2<
print("Hello"[i], "Hello"[-i-1])
(l, l)

Т. е. чтобы взять значение с конца, нужно постоянно добавлять минус единицу. Что, согласитесь, является потенциальным источником багов (сколько boundary тестов повалилось на одном нашем продукте из-за этого). Но есть способ лучше, спасибо всеобщему разуму, который подсказал эту идею:

print("Hello"[i], "Hello"[~i])
(l, l)
print("Hello"[0], "Hello"[~0])
(H, o)

Вместо очередной минус единицы достаточно использовать тильду — ~ Не могу сказать на счет скорости работы, ибо замеров не делал, но судя по времени прохождения моих smoke тестов — вариант с ~ работает так же, как и с «минусединицей».

Пользуйтесь на здоровье