Python é conhecida por facilitar a escrita de códigos bonitos e pequenos. A colinha de hoje é sobre como pegar o último elemento de uma lista usando essa linguagem \o/
Vindo de outras linguagens como Java ou C para o Python é normal trazer um pouco de sotaque para os seus códigos e querer fazer algo mais ou menos assim para pegar o último elemento de uma lista:
1
2
3
4
5
6
7
lista = [1, 2, 3, 4, 5]
indice = len(lista) - 1
print(indice)
# 4
ultimo = lista[indice]
print(ultimo)
# 5
Usar a função de tamanho len() para pegar o comprimento da lista e subtrair 1 para obter o índice do último elemento daquela lista. E tudo bem! Isso funciona. Porém Python apresenta um jeito mais elegante de fazer isso, veja:
class="highlight">1
2
3
ultimo = lista[-1]
print(ultimo)
# 5

Apesar de parecer isso não é mágica não! Da documentação do Python:
If i or j is negative, the index is relative to the end of sequence s: len(s) + i or len(s) + j is substituted. But note that -0 is still 0.
De uma forma mais simples o Raymond Hettinger explica nesse tweet com código:
#python tip: How to support negative indexing:
def __getitem__(self, i):
if i < 0:
i += len(self)
if i < 0 or i >= len(self):
raise IndexError
...
— Raymond Hettinger (@raymondh) 20 de dezembro de 2017
A implementação de fato é mais complexa que essa, mas o que acontece em linhas gerais: o método __getitem__ é invocado quando fazemos a chamada lista[-1] recebendo a própria lista (self) e o índice negativo (i) então soma esse índice com o tamanho da lista e retornando o valor do índice atualizado. Curiosamente é o mesmo que fiz no primeiro exemplo porém já vem implementado de fábrica.
E detalhe, o mesmo pode ser feito para strings!
class="highlight">