-
Notifications
You must be signed in to change notification settings - Fork 3
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
b05b37c
commit dbfe797
Showing
3 changed files
with
344 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,342 @@ | ||
{ | ||
"cells": [ | ||
{ | ||
"cell_type": "markdown", | ||
"metadata": {}, | ||
"source": [ | ||
"# Tuplas" | ||
] | ||
}, | ||
{ | ||
"cell_type": "markdown", | ||
"metadata": {}, | ||
"source": [ | ||
"Tuplas são outra estrutura de dados bem parecidas com listas, com uma diferença super importante e relevante. Vamos explorar essa estrutura ao longo deste capítulo." | ||
] | ||
}, | ||
{ | ||
"cell_type": "markdown", | ||
"metadata": {}, | ||
"source": [ | ||
"## Definição" | ||
] | ||
}, | ||
{ | ||
"cell_type": "markdown", | ||
"metadata": {}, | ||
"source": [ | ||
"Tuplas também são uma sequência de elementos e possuem algumas características em comum com listas.\n", | ||
"\n", | ||
"Dentre as características de listas, tuplas também possuem as seguintes:\n", | ||
"\n", | ||
"- **Ordenadas:** As listas mantêm a ordem dos elementos conforme são adicionados. \n", | ||
"- **Permite duplicatas:** Listas podem conter elementos duplicados. Cada elemento na lista mantém sua própria posição e pode ser acessado individualmente.\n", | ||
"- **Heterogêneas:** Uma lista pode conter elementos de diferentes tipos de dados. Por exemplo, você pode ter uma lista que contém números, strings e até mesmo outras listas.\n", | ||
"\n", | ||
"A única característica diferentre entre tuplas e listas é que **tuplas são imutáveis e listas são mutáveis**. \n", | ||
"\n", | ||
"Em palavras mais simples, usando listas eu consido modificar (alterar a ordem, inserir e remover) os seus elementos, enquanto que tuplas não tem essa flexibilidade, não sendo possível alterar a ordem, inserir, remover e nem modificar seus elementos uma vez criada a tupla." | ||
] | ||
}, | ||
{ | ||
"cell_type": "markdown", | ||
"metadata": {}, | ||
"source": [ | ||
"## Sintaxe básica" | ||
] | ||
}, | ||
{ | ||
"cell_type": "markdown", | ||
"metadata": {}, | ||
"source": [ | ||
"Tuplas começam e terminam com `( )`, e seus elementos são separados com vírugla (`,`) assim como nas listas." | ||
] | ||
}, | ||
{ | ||
"cell_type": "code", | ||
"execution_count": 1, | ||
"metadata": {}, | ||
"outputs": [ | ||
{ | ||
"name": "stdout", | ||
"output_type": "stream", | ||
"text": [ | ||
"(10, 50, 40, 65, 90, 70, 30, 156)\n" | ||
] | ||
} | ||
], | ||
"source": [ | ||
"tupla_de_numeros = (10, 50, 40, 65, 90, 70, 30, 156)\n", | ||
"print(tupla_de_numeros)" | ||
] | ||
}, | ||
{ | ||
"cell_type": "markdown", | ||
"metadata": {}, | ||
"source": [ | ||
"### Operações em comum entre listas e tuplas" | ||
] | ||
}, | ||
{ | ||
"cell_type": "markdown", | ||
"metadata": {}, | ||
"source": [ | ||
"Tuplas e listas são bem parecidas em vários aspectos, os quais não vou detalhar tanto aqui, considerando que você já os aprendeu no capítulo de listas.\n", | ||
"\n", | ||
"Tanto listas quanto tuplas utilizam indexação começando em 0. Isso significa que o primeiro elemento está no índice 0, o segundo no índice 1, e assim por diante. A indexação permite acessar elementos individuais diretamente." | ||
] | ||
}, | ||
{ | ||
"cell_type": "code", | ||
"execution_count": 3, | ||
"metadata": {}, | ||
"outputs": [ | ||
{ | ||
"name": "stdout", | ||
"output_type": "stream", | ||
"text": [ | ||
"O produto camiseta tem o ID 123 e custa R$29.99\n" | ||
] | ||
} | ||
], | ||
"source": [ | ||
"produto = (123, \"camiseta\", 29.99)\n", | ||
"identificador = produto[0]\n", | ||
"nome = produto[1]\n", | ||
"preco = produto[2]\n", | ||
"\n", | ||
"print(f\"O produto {nome} tem o ID {identificador} e custa R${preco}\")" | ||
] | ||
}, | ||
{ | ||
"cell_type": "markdown", | ||
"metadata": {}, | ||
"source": [ | ||
"O fatiamento com a sintaxe `variavel[start:step:stop]` que vimos em strings e lista funciona exatamente da mesma forma com tuplas.\n", | ||
"\n", | ||
"Dado que tuplas também são sequências, podemos medir seu comprimento com a função `len()`." | ||
] | ||
}, | ||
{ | ||
"cell_type": "code", | ||
"execution_count": 4, | ||
"metadata": {}, | ||
"outputs": [ | ||
{ | ||
"name": "stdout", | ||
"output_type": "stream", | ||
"text": [ | ||
"3\n" | ||
] | ||
} | ||
], | ||
"source": [ | ||
"produto = (123, \"camiseta\", 29.99)\n", | ||
"print(len(produto))" | ||
] | ||
}, | ||
{ | ||
"cell_type": "markdown", | ||
"metadata": {}, | ||
"source": [ | ||
"## Qual a diferença entre listas e tuplas afinal de contas?" | ||
] | ||
}, | ||
{ | ||
"cell_type": "markdown", | ||
"metadata": {}, | ||
"source": [ | ||
"Direto e reto: **tuplas são imutáveis e listas são mutáveis**. \n", | ||
"\n", | ||
"Se você se recorda, ao longo do capítulo de listas, vimos que existem vários métodos de inserção (`append`, `extend` e `insert`), deleção (`remove`, `pop` e `clear`), ordenação (`sort` e `reverse`) e ainda podemos sobrescrever valores de uma lista. \n", | ||
"\n", | ||
"Pois bem, uma vez que tuplas são imutáveis, não existem métodos que permitam tais modificações em tuplas. Tuplas, portanto, tem bem menos métodos e operações do que uma lista por conta desta característica. Os únicos métodos que existem em tuplas são `index` e `count` para fins de consulta. Observem abaixo:" | ||
] | ||
}, | ||
{ | ||
"cell_type": "code", | ||
"execution_count": 14, | ||
"metadata": {}, | ||
"outputs": [ | ||
{ | ||
"name": "stdout", | ||
"output_type": "stream", | ||
"text": [ | ||
"Métodos de lista\n", | ||
"['append', 'clear', 'copy', 'count', 'extend', 'index', 'insert', 'pop', 'remove', 'reverse', 'sort']\n", | ||
"\n", | ||
"Métodos de tuplas\n", | ||
"['count', 'index']\n" | ||
] | ||
} | ||
], | ||
"source": [ | ||
"lista = [1, 2, 3, 4]\n", | ||
"tupla = (1, 2, 3, 4)\n", | ||
"\n", | ||
"print(\"Métodos de lista\")\n", | ||
"print([metodo for metodo in dir(lista) if not metodo.startswith(\"__\")])\n", | ||
"\n", | ||
"print(\"\\nMétodos de tuplas\")\n", | ||
"print([metodo for metodo in dir(tupla) if not metodo.startswith(\"__\")])" | ||
] | ||
}, | ||
{ | ||
"cell_type": "markdown", | ||
"metadata": {}, | ||
"source": [ | ||
"```{admonition} Nota (código desconhecido)\n", | ||
":class: note\n", | ||
"\n", | ||
"No código do exemplo acima, você pode não ter visto ainda `for`, `if`, `if not`, `for` dentro de listas e nem a função `dir`. O objetivo do código acima não é demonstrar tais conceitos, mas sim mostrar quais são os métodos de listas e tuplas para fins comparativos.\n", | ||
"\n", | ||
"Conforme você vai avançando no livro, você vai começar a se deparar cada vez mais com essa situação na qual \"código que é novo para você\", tipo o exemplo acima. Isso é bastante comum inclusive no mundo real. Foque no objetivo principal do tema que você está estudando e aprenda algo novo com o código desconhecido sem perder de vista o foco principal.\n", | ||
"\n", | ||
"Uma dica pra você que gosta sempre de ir além: a função `dir` imprime na tela todos os métodos disponíveis de um objeto, incluindo alguns métodos especiais que começam com `__`. Estes são bem mais avançados, por isso eu os removi do `print` usando o filtro `if not metodo.startswith(\"__\")`, deixando apenas os métodos não especiais.\n", | ||
"```\n", | ||
"\n", | ||
"*Ah, mas se tuplas tem menos operações, então deve ser pior né? Vou sempre usar listas então!*. Calma, não é bem por aí. Flexiblidade de listas é bom, mas nem sempre.\n", | ||
"\n", | ||
"As vezes você de fato não quer mudar a quantidade de elementos na sua sequencia, ou que os elementos sejam alterados. Quer um exemplo prático?" | ||
] | ||
}, | ||
{ | ||
"cell_type": "code", | ||
"execution_count": 5, | ||
"metadata": {}, | ||
"outputs": [ | ||
{ | ||
"name": "stdout", | ||
"output_type": "stream", | ||
"text": [ | ||
"('jan', 'fev', 'mar', 'abr', 'mai', 'jun', 'jul', 'ago', 'set', 'out', 'nov', 'dez')\n" | ||
] | ||
} | ||
], | ||
"source": [ | ||
"meses = (\"jan\", \"fev\", \"mar\", \"abr\", \"mai\", \"jun\", \"jul\", \"ago\", \"set\", \"out\", \"nov\", \"dez\")\n", | ||
"print(meses)" | ||
] | ||
}, | ||
{ | ||
"cell_type": "markdown", | ||
"metadata": {}, | ||
"source": [ | ||
"Você, no caso acima em uma sequencia de meses, iria em algum momento:\n", | ||
"- acrescentar ou remover algum mês?\n", | ||
"- trocar a ordem dos meses?\n", | ||
"- modificar um mês existente (não vale pensar em sacanear o coleguinha aqui hein!)?\n", | ||
"\n", | ||
"Se a resposta para todas as perguntas for **não**, então não há porque você usar listas! E, aliás, usar tuplas neste caso é bem mais sensato porque sua sequência será imutável. Vejamos:" | ||
] | ||
}, | ||
{ | ||
"cell_type": "code", | ||
"execution_count": 6, | ||
"metadata": { | ||
"tags": [ | ||
"raises-exception" | ||
] | ||
}, | ||
"outputs": [ | ||
{ | ||
"ename": "TypeError", | ||
"evalue": "'tuple' object does not support item assignment", | ||
"output_type": "error", | ||
"traceback": [ | ||
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", | ||
"\u001b[1;31mTypeError\u001b[0m Traceback (most recent call last)", | ||
"Cell \u001b[1;32mIn[6], line 3\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[38;5;66;03m# Não é possível alterar nenhum mês\u001b[39;00m\n\u001b[0;32m 2\u001b[0m meses \u001b[38;5;241m=\u001b[39m (\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mjan\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mfev\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmar\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mabr\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmai\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mjun\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mjul\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mago\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mset\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mout\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mnov\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mdez\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m----> 3\u001b[0m \u001b[43mmeses\u001b[49m\u001b[43m[\u001b[49m\u001b[38;5;241;43m0\u001b[39;49m\u001b[43m]\u001b[49m \u001b[38;5;241m=\u001b[39m \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmes inexistente\u001b[39m\u001b[38;5;124m\"\u001b[39m\n", | ||
"\u001b[1;31mTypeError\u001b[0m: 'tuple' object does not support item assignment" | ||
] | ||
} | ||
], | ||
"source": [ | ||
"# Não é possível alterar nenhum mês\n", | ||
"meses = (\"jan\", \"fev\", \"mar\", \"abr\", \"mai\", \"jun\", \"jul\", \"ago\", \"set\", \"out\", \"nov\", \"dez\")\n", | ||
"meses[0] = \"mes inexistente\"" | ||
] | ||
}, | ||
{ | ||
"cell_type": "code", | ||
"execution_count": 7, | ||
"metadata": { | ||
"tags": [ | ||
"raises-exception" | ||
] | ||
}, | ||
"outputs": [ | ||
{ | ||
"ename": "AttributeError", | ||
"evalue": "'tuple' object has no attribute 'append'", | ||
"output_type": "error", | ||
"traceback": [ | ||
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", | ||
"\u001b[1;31mAttributeError\u001b[0m Traceback (most recent call last)", | ||
"Cell \u001b[1;32mIn[7], line 3\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[38;5;66;03m# Não temos nenhum método de inserção, deleção e ordenação\u001b[39;00m\n\u001b[0;32m 2\u001b[0m meses \u001b[38;5;241m=\u001b[39m (\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mjan\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mfev\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmar\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mabr\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmai\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mjun\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mjul\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mago\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mset\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mout\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mnov\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mdez\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m----> 3\u001b[0m \u001b[43mmeses\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mappend\u001b[49m(\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmes inexistente\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n", | ||
"\u001b[1;31mAttributeError\u001b[0m: 'tuple' object has no attribute 'append'" | ||
] | ||
} | ||
], | ||
"source": [ | ||
"# Não temos nenhum método de inserção, deleção e ordenação\n", | ||
"meses = (\"jan\", \"fev\", \"mar\", \"abr\", \"mai\", \"jun\", \"jul\", \"ago\", \"set\", \"out\", \"nov\", \"dez\")\n", | ||
"meses.append(\"mes inexistente\")" | ||
] | ||
}, | ||
{ | ||
"cell_type": "code", | ||
"execution_count": 8, | ||
"metadata": { | ||
"tags": [ | ||
"raises-exception" | ||
] | ||
}, | ||
"outputs": [ | ||
{ | ||
"ename": "AttributeError", | ||
"evalue": "'tuple' object has no attribute 'sort'", | ||
"output_type": "error", | ||
"traceback": [ | ||
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m", | ||
"\u001b[1;31mAttributeError\u001b[0m Traceback (most recent call last)", | ||
"Cell \u001b[1;32mIn[8], line 2\u001b[0m\n\u001b[0;32m 1\u001b[0m meses \u001b[38;5;241m=\u001b[39m (\u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mjan\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mfev\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmar\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mabr\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mmai\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mjun\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mjul\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mago\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mset\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mout\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mnov\u001b[39m\u001b[38;5;124m\"\u001b[39m, \u001b[38;5;124m\"\u001b[39m\u001b[38;5;124mdez\u001b[39m\u001b[38;5;124m\"\u001b[39m)\n\u001b[1;32m----> 2\u001b[0m \u001b[43mmeses\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43msort\u001b[49m()\n", | ||
"\u001b[1;31mAttributeError\u001b[0m: 'tuple' object has no attribute 'sort'" | ||
] | ||
} | ||
], | ||
"source": [ | ||
"meses = (\"jan\", \"fev\", \"mar\", \"abr\", \"mai\", \"jun\", \"jul\", \"ago\", \"set\", \"out\", \"nov\", \"dez\")\n", | ||
"meses.sort()" | ||
] | ||
}, | ||
{ | ||
"cell_type": "markdown", | ||
"metadata": {}, | ||
"source": [ | ||
"Em resumo, a nossa sequencia de meses está totalmente protegida de modificações indesejadas. E é exataente isso que queremos!" | ||
] | ||
} | ||
], | ||
"metadata": { | ||
"kernelspec": { | ||
"display_name": ".venv", | ||
"language": "python", | ||
"name": "python3" | ||
}, | ||
"language_info": { | ||
"codemirror_mode": { | ||
"name": "ipython", | ||
"version": 3 | ||
}, | ||
"file_extension": ".py", | ||
"mimetype": "text/x-python", | ||
"name": "python", | ||
"nbconvert_exporter": "python", | ||
"pygments_lexer": "ipython3", | ||
"version": "3.12.2" | ||
} | ||
}, | ||
"nbformat": 4, | ||
"nbformat_minor": 2 | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters