Exercício Resolvido e Funções em Python
João começou a desenvolver um programa para cálculos de contabilidade em Python. Após algum tempo, ele verificou que partes de seu código eram redundantes – um mesmo conjunto de linhas de código, que realizavam uma mesma operação, aparecia várias vezes em seu programa.
Pesquisando na Internet, João verificou que é comum em linguagens de programação o uso de funções. Elas ajudam a modularizar e organizar melhor o programa, permitindo que determinados trechos pré-definidos possam ser invocados e executados quando necessário. Para treinar o uso de funções, João fez os seguintes programas. Para cada situação, indique o que será exibido na tela quando o programa for executado. Caso o interpretador encontre algum erro, indique o motivo e em qual linha ele ocorre.
e.
def inverte_lista(l):
for i in range(1, l):
l[i] = -l[i]
print(l)
return l
l = [8, 2, 7]
inverte_lista(l.copy())
print(l)
Para resolvermos este exercício, precisaremos simular o código feito por João para descobrirmos o que será exibido na tela.
Neste exemplo de código, é muito mais interessante começarmos analisando o trecho que está fora da função inverte_lista() definida. Fazemos isso justamente pois este trecho que é executado quando rodarmos o programa.
Dessa forma, temos que a linha que será inicialmente executada é a seguinte:
l = [8, 2, 7]
Ou seja, está sendo criada uma lista com o nome l composta por 3 elementos. Temos então que:
l[0]=8
l[1]=2
l[2]=7
Vamos para a próxima linha:
inverte_lista(l.copy())
Ou seja, está sendo enviado l.copy() como argumento para a função inverte_lista(). Mas o que é exatamente l.copy()?
O argumento l.copy() corresponde a uma cópia da lista l. Mas por que não foi simplesmente enviada a lista l como argumento?
Quando enviamos uma lista diretamente para uma função, temos o problema de que não podemos alterar um valor da lista no interior da função sem prejudicar a lista original.
Por outro lado, se enviamos uma cópia da lista como argumento para a função, evitamos este problema.
Vamos então analisar o que é feito dentro da função inverte_lista:
def inverte_lista(l):
Note que a função é definida justamente esperando receber 1 argumento. Portanto, temos que o valor de l no interior da função será igual a l.copy().
Note aqui que a alteração de qualquer valor na lista dentro da função não alterará a lista fora da função. Portanto a lista l que está dentro da função não é a mesma lista l fora da função (atenção às cores das variáveis).
Então, temos que:
l[0]=8
l[1]=2
l[2]=7
Vamos para a próxima linha:
for i in range(1, l):
Aqui, está sendo criado um laço do tipo for que gera uma variável i para percorrer valores inteiros de 1 até l (não inclui o limite superior).
Mas note que l não é um número inteiro, afinal l é uma lista. Portanto, temos que o programa apresentará mensagem de erro e terá sua execução imediatamente interrompida, afinal range() espera receber somente valores inteiros, e não listas.
Resposta esperada: O programa apresentará mensagem de erro. Isso ocorre pois l não pode ser interpretado como um valor inteiro.