Sigo esperando meu microfone chegar pra gravar mais vídeos. Enquanto isso, vamos seguindo nos tópicos por aqui. Quando o microfone chegar eu faço um intensivão de vídeos pros tópicos acompanharem os vídeos.
Se os posts fossem unidades de um livro, achei que falar de contêineres seria uma nova unidade. Então vamos começar a falar de contêineres.
Há uma certa convenção na linguagem de chamar de contêineres as estruturas de dados que armazenam outras estruturas de dados dentro delas. Algo parecido com os arrays de outras linguagens.
Dentre os tipos de contêineres básicos da linguagem temos: tuplas, listas, dicionários, conjuntos e conjuntos congelados. Neste tópico vou abordar as tuplas.
Tuplas são imutáveis. O que quer dizer que não podemos adicionar nem mudar o que está dentro delas (embora há uma exceção aqui que não é bem uma exceção mas vou falar no tópico de listas).
Em Python, há duas formas de definir uma tupla:
In [1]: tupla = ()
In [2]: type(tupla)
Out[2]: tuple
In [3]: tupla_2 = tuple()
In [4]: type(tupla_2)
Out[4]: tuple
Na primeira forma, já podemos passar os elementos da tupla para dentro dos parênteses. Na segunda forma, devemos inserir um iterável dentro dos parênteses:
In [6]: tupla = (1, 2, 3, 4, 5)
In [7]: tupla_2 = tuple([1, 2, 3, 4, 5])
In [8]: tupla
Out[8]: (1, 2, 3, 4, 5)
In [9]: tupla_2
Out[9]: (1, 2, 3, 4, 5)
Tuplas aceitam qualquer estrutura de dados de Python dentro delas. Abaixo, adicionei inteiros, floats, strings, listas, dicionários e funções dentro da tupla:
In [20]: tupla_3 = (1, 2, 3, 'Sardinhagem', 2.5, 3.14, [1, 2, 3, 4], {'one': 1, 'two': 2}, lambda x: x + 2)
Como tuplas são imutáveis, eu não posso mudar os elementos dela nem adicionar nem retirar novos elementos:
In [10]: # Tentando mudar o segundo item de 3 para 6
In [11]: tupla[2]
Out[11]: 3
In [12]: tupla[2] = 6
---------------------------------------------------------------------------
TypeError Traceback (most recent call last)
<ipython-input-12-9f94ba92ab4f> in <module>
----> 1 tupla[2] = 6
TypeError: 'tuple' object does not support item assignment
In [16]: # Tentando adicionar o número 6 no final da fila
In [17]: tupla.append(6)
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-17-0016fa25324e> in <module>
----> 1 tupla.append(6)
AttributeError: 'tuple' object has no attribute 'append'
In [18]: # Tentando inserir o número 6 na posição 2
In [19]: tupla.insert(2, 6)
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-19-90b610860352> in <module>
----> 1 tupla.insert(2, 6)
AttributeError: 'tuple' object has no attribute 'insert'
Ou seja, depois da criação da tupla, os items dentro delas não podem ser mudados, exceto pela exceção que falei acima que no próximo tópico vou falar, e explicar o motivo da possibilidade da exceção de uma forma mais "baixo nível", a nível de memória do computador.
Por serem imutáveis, tuplas são mais "baratas" para a memória do computador, ocupam menos espaço na memória do que outros tipos de contêineres como as listas. São úteis quando eu não quero mudar os elementos de dentro dela. Usar tuplas nesse caso torna nosso programa mais "rápido", mais performático. Teve um forista do site que ao fazer o jogo de pedra, papel e tesoura de um dos desafios usou uma tupla para definir uma matriz das possibilidades do jogo de vitória, empate e derrota. Como não havia a necessidade de mudar os elementos de dentro dessa matriz, a escolha da tupla foi excelente.
No próximo tópico vou abordar listas e explicar mais a fundo porque nem tudo que está dentro de uma tupla é imutável.