Funções
Contratos, retorno, argumentos, âmbito léxico, efeitos e decomposição de problemas.
Definição e contrato
def quadrado(x):define uma função com parâmetrox;quadrado(5)chama-a com argumento 5. Definir não executa o corpo.- O contrato indica entradas, pré-condições e resultado, incluindo casos limite. Uma docstring documenta o contrato, sem o validar.
returntermina a chamada e entrega um valor;printescreve e devolveNone. Sair do corpo semreturntambém devolveNone.
def e_primo(n):
if n < 2:
return False
for divisor in range(2, n):
if n % divisor == 0:
return False
return True
e_primo(1)éFalsepela guarda inicial;e_primo(2)éTrueporque o percurso é vazio;e_primo(9)éFalseno divisor 3. Um divisor basta para rejeitar; aceitar exige excluir todos.
Âmbito e argumentos
- Uma lista escreve-se
[1, 2];[]é a lista vazia.xs.append(9)altera a própria lista;xs + [y]cria outra sem alterarxs. - Cada chamada tem os seus nomes locais. A procura segue o âmbito léxico: local, funções envolventes, módulo e nomes predefinidos. Não consulta as variáveis locais do chamador.
- Atribuir a um nome no corpo torna-o local. Lê-lo antes da atribuição causa
UnboundLocalError.globalpermite reassociar um nome do módulo; parâmetros e retorno evitam essa dependência. - O parâmetro refere o objeto recebido, sem cópia. Reatribuir o parâmetro só muda o nome local;
xs.append(9)altera a lista partilhada com o chamador. - Uma função interior pode conservar acesso ao contexto envolvente depois do retorno: uma closure.
valor = 10
def dobrar(valor):
return 2 * valor
print(dobrar(4), valor) # 8 10
Valores por defeito
def potencia(base, expoente=2):admitepotencia(3)epotencia(base=3, expoente=4). Os valores por defeito calculam-se quandodefexecuta, não em cada chamada.- Uma lista por defeito fica partilhada entre chamadas. Usa
Nonecomo sinal e cria a lista no corpo:
def juntar(valor, valores=None):
if valores is None:
valores = []
return valores + [valor]
juntar(1)ejuntar(2)devolvem[1]e[2]. A concatenação conserva qualquer lista recebida;is Noneé o teste de identidade apropriado aqui.