4. Mais um pouco de Python

Nessa aula vamos continuar a nossa revisão de Python e trabalhar um pouco com listas (tipo list), que é uma das principais estruturas nativas do Python.

4.1. Tópicos

  • listas (tipo list) em Python;
  • funções com listas;
  • funções mutadoras e não mutadoras; e
  • um pouco sobre strings.

4.2. Introdução

Uma lista é uma estrutura sequencial indexada que permite armazenar e manipular objetos de qualquer tipo. Para saber mais sobre listas recomendamos a leitura de Lista: estrutura sequencial indexada.

Para ilustrar o uso de listas vamos usar um programa que realiza a criação, carregamento e varrimento de uma lista em Python. Esse programa lê um inteiro n e uma sequência de n números, armazena-os em uma lista de tamanho n e imprime a sequência na ordem reversa a da leitura. Por exemplo, para n = 4 e a sequência de números 7, 5, 3, 1, a saída do programa (o que o programa imprime) deve ser a sequência 1, 3, 5, 7.

Para visualizar o funcionamento passo-a-passo de programas em Python vamos usar a ferramenta Python Tutor. Essa é uma ferramenta grátis que se sustenta por meio de anúncios. Caso, durante a simulação, seu navegador redirecione para o site do Python Tutor, você pode redimensionar a janela para “esconder” os anúncios.

A seta vermelha indica a próxima instrução a ser executada pelo Python. Clique no botão Next > até que a seta chegue ao final do arquivo, linha 22, que chama a função main(). Continue clicando em Next > até chegar na linha 5, que cria a lista vazia seq, que é uma estrutura dentro da função main(). Observe que o Python Tutor atualiza o estado do programa após cada instrução, mostrando as variáveis e seus conteúdos.

A linha 6 recebe um inteiro. O Python Tutor abre uma janelinha abaixo do código onde você pode digitar o valor desejado para n, como, por exemplo, 4. Digite esse valor e clique em Submit. Continue clicando em Next > e entrando com os valores desejados até o programa terminar. Observe também que a saída do programa, resultado dos comandos print, aparecem em uma área no topo à direita da janela do Python Tutor.

Números inteiros e reais em Python

Se você nunca programou com Python antes, procure se lembrar que o Python foi criado tendo em mente produzir resultados que sejam “naturais” para seus usuários e usuárias. Assim, a divisão 3 / 2, apesar de dividir dois inteiros, resulta no valor 1.5. Para “forçar” um resultado inteiro em Python, use o operador //, como em 3 // 2.

Outra curiosidade do Python é que a representação de números inteiros pode incluir tantos dígitos quanto necessários, sem a restrição de, por exemplo, limitar ao intervalo possível de representar com 32 ou 64 bits. Como exemplo, use a função fatorial da aula passada para calcular o 100! e veja o que acontece. Mas lembre-se que isso não acontece para números reais.

O Python, por ser uma linguagem interpretada, permite a construção de programas mais flexíveis com relação aos dados. Experimente usar, nesse exercício de somar os elementos de uma lista, as seguintes listas:

  • uma lista só com inteiros, como [1, 2, 3];
  • uma lista só com reais, como [4.5, 6.7, 8.9];
  • uma lista mista, com inteiros e reais, como [1, 2, 3.14].

Você acha que esses resultados são naturais?

4.2.2. Teste o seu conhecimento: função inverta()

Escreva uma função que recebe uma lista de elementos e retorna uma nova lista contendo os elementos em ordem reversa.

4.3. Função mutadora

Quando trabalhamos com estruturas de dados como listas, que podem ser muito muito grandes, é comum tentar “economizar” memória modificando a lista de entrada ao invés de criar uma nova. Vamos chamar essas funções de mutadoras, pois modificam a estrutura original. A função inverta(), que você escreveu anteriormente, é não mutadora.

Observe que a sua função inverta() retorna uma lista, enquanto a função inverta_mutadora(), mostrada abaixo no Python Tutor, retorna None. None é um objeto do Python que representa algo sem valor. Ela deve retornar None pois a própria lista de entrada é modificada.

Estude o comportamento dessa função clicando no botão Next >.

4.4. Um pouco sobre strings

Uma string é uma sequência com um ou mais caracteres, ou seja, é um texto, que pode inclusive ser vazio. Uma string pode ser delimitada por aspas como "Um string" ou apóstrofes como 'outra string'. Essa flexibilidade permite colocar aspas ou apóstrofes nas strings, como "string com 'apóstrofes' entre apóstrofes."

Essa sequência de caracteres se comporta como uma lista para acessar seus elementos e fatias (intervalos de elementos). Assim como listas, strings podem ser concatenadas usando o operador +.

O código a seguir ilustra como percorrer uma string pegando fatias de tamanho 10 e, ao final, concatenando as fatias em ordem reversa. Clique em `` Next > `` para executar o programa passo-a-passo.

A grande diferença com listas é que as strings são imutáveis. Assim, mesmo que você precise trocar apenas um caractere de uma string, de “gato” para “rato” por exemplo, o seguinte trecho de programa é inválido:

animal = "gato"
animal[0] = "r"
print(animal)

Nesse caso, é necessário criar uma nova string com o valor desejado.

Clique nesse link para saber mais sobre strings.

4.5. Exercícios

  1. Escreva uma função que recebe uma lista com números e, usando o comando for, procura e retorna o valor mínimo desses números e o índice onde esse valor ocorre. Por exemplo, para a lista [5, 0, 7, -3, 9], o menor valor é -3 que ocorre no índice 3.

    • Dica: em Python, para uma função retornar mais de um valor, basta separar os valores por vírgula.
  2. Escreva uma função que recebe uma lista com strings (palavras) e, usando o comando for, procura a palavra de menor ordem alfabética e retorna a palavra e o índice onde ela ocorre. Por exemplo, para a lista ["gato", "elefante", "cavalo", "formiga"], a “menor” palavra (em ordem alfabética) é “cavalo” que ocorre no índice 2 da lista.

  3. Escreva uma função que recebe uma string texto e retorna uma lista contendo as palavras do texto. Uma palavra é uma sequência de caracteres separada por um ou mais caracteres da lista SEPARADORES = ["\n", "\t", " ", ",",  ".", ";"].

4.6. Onde estamos e para onde vamos?

Continuando a nossa revisão de Python, vimos como manipular listas em Python. Lista é uma estrutura nativa do Python que permite reunir, de forma sequencial, vários elementos que podem ter tipos distintos. Vimos que funções mutadoras recebem listas e podem modificar seu conteúdo e vimos que strings são imutáveis.

Na próxima aula, começar a introdução de conceitos de Programação Orientada a Objetos. Esses conceitos permitem abstrair outras estrutura de dados para que possamos focar no uso e não na representação dessas estruturas. Como exemplo de motivação, vamos utilizar o problema de cálculo de números harmônicos.

4.7. Para saber mais

Para saber mais sobre Python: