From dbfe797905208f00cfc86d8a886b2366733850ce Mon Sep 17 00:00:00 2001 From: Henrique Branco Date: Wed, 24 Jul 2024 08:38:08 -0300 Subject: [PATCH] =?UTF-8?q?feat:=20in=C3=ADcio=20cap=C3=ADtulo=20tuplas?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- book/06-estruturas-de-dados/02-listas.ipynb | 2 +- book/06-estruturas-de-dados/03-tuplas.ipynb | 342 ++++++++++++++++++++ book/_toc.yml | 1 + 3 files changed, 344 insertions(+), 1 deletion(-) create mode 100644 book/06-estruturas-de-dados/03-tuplas.ipynb diff --git a/book/06-estruturas-de-dados/02-listas.ipynb b/book/06-estruturas-de-dados/02-listas.ipynb index 7a7e2b4..c2258b9 100644 --- a/book/06-estruturas-de-dados/02-listas.ipynb +++ b/book/06-estruturas-de-dados/02-listas.ipynb @@ -1203,7 +1203,7 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "Aqui, a linha `nomes[0] = \"Fernando\"` é responsável por substituir no índice 0 o nome existente `João` pelo `Fernando`. " + "Aqui, a linha `nomes[0] = \"Fernando\"` é responsável por substituir no índice 0 o nome existente `João` pelo `Fernando`." ] } ], diff --git a/book/06-estruturas-de-dados/03-tuplas.ipynb b/book/06-estruturas-de-dados/03-tuplas.ipynb new file mode 100644 index 0000000..965d9f7 --- /dev/null +++ b/book/06-estruturas-de-dados/03-tuplas.ipynb @@ -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 +} diff --git a/book/_toc.yml b/book/_toc.yml index fd8ba75..bb71a55 100644 --- a/book/_toc.yml +++ b/book/_toc.yml @@ -40,6 +40,7 @@ parts: chapters: - file: 06-estruturas-de-dados/01-strings.ipynb - file: 06-estruturas-de-dados/02-listas.ipynb + - file: 06-estruturas-de-dados/03-tuplas.ipynb - caption: Pratique chapters: