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;
listas de 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 4, 7, 3, 6
, a saída do programa (o que o programa imprime) deve ser a sequência 6, 3, 7, 4
.
Para visualizar o funcionamento passo a passo de programas em Python vamos usar o visualizador do CS Circles disponibilizado pela Universidade de Waterloo. Para dar um passo para frente ou para trás na execução do programa, com relação a linha que está iluminada, basta clicar em Forward >
ou < Back
.
Para esse exemplo, clique em Forward >
até que chegar na linha 27, que chama a função main()
. Continue clicando em Forward >
até chegar na linha 7, que cria a lista vazia nova
, que é uma estrutura dentro da função main()
. Observe que o Python atualiza o estado do programa após cada instrução, mostrando as variáveis e seus conteúdos.
A constante VELHA
contém a lista que será copiada para uma nova lista nova
.
Continue clicando em Forward >
e observe no lado direito da janela a lista nova
sendo criada e carregada, elemento a elemento.
Observe também que a saída do programa, resultado dos comandos print
, aparecem em uma área Program output
abaixo do código.
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, já que cria uma nova lista e não altera a lista de entrada.
Uma função inverta_mutadora()
é mostrada abaixo. Observe que ela retorna None
ao invés de uma lista nova.
None
é um objeto do Python que representa algo sem valor. Essa função deve retornar None
pois a própria lista de entrada é modificada.
Estude o comportamento dessa função clicando no botão Forward >
.
4.4. Fatias de listas#
O uso de fatias (slices) em Python é uma forma eficaz de trabalhar com strings e listas. Em uma lista, você pode obter um subconjunto de elementos usando o operador :
. Por exemplo, para uma lista seq = [10,20,30,40,50]
, o comando seq[1:3]
irá retornar a lista [20,30]
, ou seja, com início fechado no índice 1 (inclui o elemento de índice 1) e fim aberto no índice 3 (até mas não inclui o elemento de índice 3).
Uma fatia retorna uma cópia da sublista com os elementos definidos pelo intervalo.
Caso o início e fim não sejam definidos, o Python considera o índice zero como início e vai até último elemento. Assim, uma forma simples de criar uma cópia de uma lista em Python é usar seq[:]
. Mas cuidado, a fatia copia apenas o primeiro nível da lista e não vai funcionar para listas de listas por exemplo.
Além do ínicio e fim, você também pode especificar um passo, usando mais um :
e um terceiro valor, como em seq[::2]
para obter apenas os elementos de índice par da lista, ou [10,30,50]
.
Assim, uma forma simples de criar uma cópia invertida da lista é usar seq[::-1]
.
Além disso, o operador de fatia pode também ser usado para atribuir valores a uma parte específica de uma lista. Por exemplo, após a seguinnte atribuição seq[1:3] = [-1]
, a lista seq
conterá [10,-1,40,50]
.
Execute o código a seguir para testar o uso de fatias com listas e edite o código para testar outros exemplos.
4.5. Listas de listas#
As listas em Python são estruturas muito poderosas e flexíveis pois podem combinar elementos de qualquer tipo, inclusive outras listas como, por exemplo, seq=[ [1,2,3], [4,5,6] ]
. 😲
Um conceito importante relacionado ao entendimento de funções mutadoras é o de referência
.
Quando criamos uma lista e o associamos a uma variável, dizemos que a variável faz referência à lista armazenada na memória (também é comum dizer que a variável aponta para a lista e por isso a variável é um apontador ou ponteiro). O uso de referência é muito útil pois evita desperdício de memória, mas pode criar resultados inesperados quando ignoramos que as listas de listas guardam referências (também chamados de ponteiros ou apontadores) as suas listas internas. 🤤
Como é que é? 😕 Estude com atenção o código a seguir, executando-o passo a passo:
Em particular, observe como o CS Circles exibe o conteúdo de seq
e por que quando alteramos o conteúdo de var_c
os conteúdos de var_a
e seq
são também alterados. 👀
4.6. 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 "Uma string"
ou apóstrofes como 'outra string'
.
Essa flexibilidade permite colocar aspas ou apóstrofes nas strings, como "string com 'apóstrofes' entre aspas."
. Pergunta, ao usar essa string em um comando print()
, as aspas que delimitam a string são ou não impressas? 🤔
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 Forward >
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.7. Exercícios#
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.
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.Escreva uma função que recebe uma string
texto
e retorna uma lista contendo as palavras dotexto
. Uma palavra é uma sequência de caracteres separada por um ou mais caracteres da listaSEPARADORES = ["\n", "\t", " ", ",", ".", ";"]
.Escreva uma função que recebe dois inteiros
nl
enc
, e um valorv
qualquer, e cria e retorna uma matriz (lista de listas) comnl
linhas enc
colunas, com todos os seus elementos carregados inicalmente comv
.
4.8. 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.
Nas próximas aulas vamos tratar de alguns fundamentos, como recursão e abstração de dados, que vão permitir você resolver problemas cada vez mais complexos e entender conceitos de algoritmos que vão permitir você discutir que soluções são mais eficientes.
4.9. Para saber mais#
Para saber mais sobre Python:
Como Pensar como um Cientista da Computação - Aprendendo com Python: Edição interativa que é uma tradução do livro How to Think Like a Computer Scientist - Learning with Python: Interactive Edition.
Estudo dirigido: aulas interativas do curso de Introdução à Computação em Python.