S02 - Atividade de Aprendizagem (2 de 2): Detalhes da Função
Durante esta aula, você aprenderá detalhes adicionais sobre como escrever e chamar funções. Esses detalhes incluem escopo de variáveis, valores de parâmetros padrão e argumentos opcionais e ajudarão você a entender melhor as funções e escrevê-las de forma mais eficaz.
Escopo de Variável
O escopo de uma variável indica onde ela pode ser usada e por quanto tempo existe. Em Python, existem dois tipos de escopo: local e global. Uma variável tem escopo local quando é definida dentro de uma função, e escopo global quando é definida fora de todas as funções.
# g é uma variável global porque
# é definida fora de todas as funções.
g = 25
def main():
# x é uma variável local porque
# é definida dentro de uma função.
x = 1
Conforme mostrado na tabela a seguir, uma variável local é definida dentro de uma função, existe enquanto a função estiver em execução e só pode ser usada dentro dela. Uma variável global é definida fora de todas as funções, existe durante toda a execução do programa e pode ser usada em qualquer função.
| Escopo de Variáveis em Python | ||
|---|---|---|
| Escopo Local | Escopo Global | |
| Onde Definir | Dentro de uma função | Fora de todas as funções |
| Proprietário | A função onde a variável é criada | O arquivo Python onde a variável é criada |
| Duração | Enquanto a função estiver em execução | Durante toda a execução do programa |
| Onde é Utilizável | Apenas dentro da função onde foi criada | Em todas as funções do programa |
O exemplo de código Python a seguir contém parâmetros e variáveis. Os parâmetros têm escopo local porque são definidos no cabeçalho de uma função e existem enquanto a função estiver em execução. A variável nFormas é global porque é definida fora de todas as funções, podendo ser usada em qualquer função do programa.
Dentro da função area_quadrado, o parâmetro comprimento e a variável area têm escopo local.
Dentro da função area_retangulo, os parâmetros largura e comprimento, assim como a variável area, têm escopo local.
nFormas = 0
def area_quadrado(comprimento):
area = comprimento * comprimento
return area
def area_retangulo(largura, comprimento):
area = largura * comprimento
return area
As variáveis locais existem apenas dentro da função onde são definidas. Assim, você pode usar o mesmo nome em funções diferentes sem conflitos. Por exemplo, area_quadrado e area_retangulo têm um parâmetro chamado comprimento e uma variável chamada area. Cada uma é independente, pois seu escopo é restrito à função onde foi definida.
É recomendado usar variáveis locais sempre que possível e recorrer a variáveis globais apenas quando necessário, pois variáveis globais podem tornar o código mais difícil de entender e aumentar a chance de erros.
Se for necessário usar uma variável global, todas as funções podem ler seu valor diretamente. No entanto, para alterar o valor de uma variável global dentro de uma função, é preciso declará-la explicitamente como global dentro dessa função.
Erro Comum
Um erro comum é presumir que uma variável local pode ser usada em outra função. No exemplo 3, a função main define a variável raio, mas ela não pode ser acessada por area_circulo, pois variáveis locais só existem dentro da função onde foram criadas.
# Exemplo 3
import math
def main():
raio = float(input("Digite o raio de um círculo: "))
area = area_circulo()
print(f"area: {area:.1f}")
def area_circulo():
# Erro! Não há nenhuma variável chamada raio
# definida dentro desta função, então a variável
# raio não pode ser usada nesta função.
area = math.pi * raio * raio
return area
main()
Observação: Embora seja possível colocar a interface do VS Code em português, como mostramos neste vídeo, o Python e as mensagens de erro continuarão em inglês. Se não entender alguma mensagem, use um tradutor.
> python example_3.py
Digite o raio de um círculo: 4.17
Traceback (most recent call last):
File "c:\Users\cse111\example_3.py", line 13, in
main()
File "c:\Users\cse111\example_3.py", line 5, in main
area = area_circulo()
File "c:\Users\cse111\example_3.py", line 11, in area_circulo()
area = math.pi * raio * raio
^^^^
NameError: name 'raio' is not defined
A maneira correta de corrigir o erro no exemplo 3 é adicionar um parâmetro à função area_circulo
e passar o raio da função main para a função area_circulo, conforme mostrado no exemplo 4.
# Exemplo 4
import math
def main():
raio = float(input("Digite o raio de um círculo: "))
area = area_circulo(raio)
print(f"area: {area:.1f}")
def area_circulo(raio):
area = math.pi * raio * raio
return area
main()
> python example_4.py
Digite o raio de um círculo: 4.17
area: 54.6
Valores de Parâmetros Padrão e Argumentos Opcionais
O Python permite definir valores padrão para parâmetros de função. Quando um parâmetro tem um valor padrão, o argumento correspondente torna-se opcional. Se a função for chamada sem esse argumento, o parâmetro assume o valor padrão.
No exemplo 5, o parâmetro raio não tem valor padrão, mas graus tem, definido como 360 na linha 14. Assim, ao chamar comprimento_arco_ com apenas um argumento (linha 6), graus usa o valor padrão. Já na linha 13, a chamada fornece dois argumentos: 4.7 e 270, então graus assume o valor informado (270).
# Exemplo 5
import math
def main():
# Chama a função comprimento_arco_ com apenas um argumento
# mesmo que a função comprimento_arco_ tenha dois parâmetros.
comp1 = comprimento_arco_(4.7)
print(f"comp1: {comp1:.1f}")
# Chama a função comprimento_arco_ novamente, mas
# desta vez com dois argumentos.
comp2 = comprimento_arco_(4.7, 270)
print(f"comp2: {comp2:.1f}")
# Define uma função com dois parâmetros. O
# segundo parâmetro tem um valor padrão de 360.
def comprimento_arco_(raio, graus=360):
"""Calcula e retorna o comprimento do arco de um círculo"""
circunferencia = 2 * math.pi * raio
comprimento = circunferencia * graus / 360
return comprimento
main()
> python example_5.py comp1: 29.5 comp2: 22.1
Design de Função
Quais são as propriedades de uma boa função?
Há muitas coisas a considerar ao escrever uma função, e muitos autores escreveram sobre conceitos de design que tornam as funções mais fáceis de entender e menos propensas a erros. Nos futuros cursos na BYU-Idaho, você estudará alguns desses conceitos de design. Para o CSE 111, a lista a seguir contém algumas propriedades que você deveria incorporar em suas funções.
-
Uma boa função é compreensível por outros programadores. Para isso, use uma docstring no início da função explicando sua finalidade, seus parâmetros e seu valor de retorno, além de comentários no corpo da função, conforme necessário.
-
Uma boa função executa uma única tarefa, fácil de descrever, e seu nome reflete essa tarefa.
-
Uma boa função é relativamente curta, idealmente com menos de 20 linhas.
-
Uma boa função tem o mínimo possível de pontos de decisão (
ife loops), o que reduz erros e facilita os testes. -
Uma boa função é reutilizável. Funções que usam parâmetros e retornam valores são mais reutilizáveis do que aquelas que recebem entrada do usuário.
Ao ler o código de exemplo no CSE 111, observe como as funções de exemplo se ajustam a essas boas propriedades e, ao escrever programas para o CSE 111, faça o melhor que puder para escrever funções que tenham essas boas propriedades.
Resumo
Durante esta aula, você estudará o escopo de variáveis, valores de parâmetros padrão e argumentos opcionais. Uma variável que é definida dentro de uma função tem escopo local e pode ser usada somente dentro da função onde ela é definida. Os parâmetros sempre têm escopo local.
Um parâmetro pode ter um valor padrão como o parâmetro graus neste cabeçalho de função:
def comprimento_arco_(raio, graus=360):
⋮
Quando o parâmetro de uma função tem um valor padrão, você pode escrever uma chamada para essa função sem passar um argumento para o parâmetro, dessa forma:
comprimento = comprimento_arco_(3.5)
Em outras palavras, o argumento para um parâmetro que tem um valor padrão é opcional.
Atividade
Objetivo
Avalie seu conhecimento de parâmetros, argumentos e escopo de variáveis locais corrigindo um programa que não é executado porque o programador tentou usar variáveis que foram definidas em uma função diferente.
Documentação Útil
-
O conteúdo de preparação do primeiro exercício de preparação desta semana explica o que é um parâmetro.
-
O conteúdo de preparação para a aula 2 explica o que é um argumento.
-
O conteúdo de preparação para esta aula contém um programa de exemplo com um erro semelhante ao erro que está no programa de exemplo abaixo.
Declaração do Problema
O exemplo de programa a seguir deve solicitar ao usuário o raio e a altura de um cone circular reto e, então, calcular e exibir o volume desse cone. O código está quase correto, mas contém um erro comum. O programador que o escreveu presumiu que a função volume_cone poderia usar as variáveis de raio e altura definidas na função main. Isso é incorreto pois, como explica o conteúdo de preparação, variáveis definidas dentro de uma função têm escopo local e podem ser usadas somente dentro da função que as contém.
"""Calcula e exiba o volume de um cone circular reto"""
# Importa módulo math padrão para que
# math.pi possa ser usado neste programa.
import math
def main():
# Chama a função volume_cone para calcular o volume
# de um cone, exemplificando como o programa funciona.
ex_raio = 2.8
ex_altura = 3.2
ex_vol = volume_cone()
# Exibe várias linhas que descrevem este programa.
print("Este programa calcula o volume de um cone circular reto.")
print(f"Por exemplo, se o raio de um cone é {ex_raio} e")
print(f"a altura é {ex_altura} então o volume é {ex_vol:.1f}")
print()
# Obtém o raio e a altura do cone do usuário.
raio = float(input("Por favor, digite o raio do cone: "))
altura = float(input("Por favor, digite a altura do cone: "))
# Chama a função volume_cone para calcular o volume
# para o raio e a altura que vieram do usuário.
vol = volume_cone()
# Imprime o raio, a altura e
# volume para o usuário ver.
print(f"Raio: {raio}")
print(f"Altura: {altura}")
print(f"Volume: {vol:.1f}")
def volume_cone():
"""Calcula e retorna o volume de um cone circular reto"""
volume = math.pi * raio**2 * altura / 3
return volume
# Inicia este programa
# chamando a função main.
main()
Tarefa
Faça o seguinte:
-
Usando o VS Code, abra um novo arquivo. Copie e cole todo o programa de exemplo acima no novo arquivo. Salve o novo arquivo como
volume_cone.py -
Execute seu programa
volume_cone.py. Que mensagem de erro você vê em seu terminal? Lembre-se: use um tradutor, se necessário, para entendê-la. -
Corrija a função
volume_coneque começa na linha 36 adicionando dois parâmetros ao seu cabeçalho. Quais nomes de parâmetros você deveria usar?
Dica: os nomes dos parâmetros na linha 36 e os nomes das variáveis na linha 38 devem ser os mesmos. -
Corrija a chamada para a função
volume_coneque está emmainna linha 13, adicionando dois argumentos. Como a funçãovolume_conetem dois parâmetros (você adicionou os dois parâmetros na etapa anterior), cada chamada para a funçãovolume_conedeve ter dois argumentos. Quais nomes de variáveis você deveria usar para os argumentos?
Dica: as únicas variáveis que você pode usar devem ser definidas dentro demainacima da linha 13. -
Corrija a chamada para a função
volume_coneque está emmainna linha 36, adicionando dois argumentos. Quais nomes de variáveis você deveria usar para os argumentos?
Dica: as únicas variáveis que você pode usar devem ser definidas dentro demainacima da linha 27. -
Salve seu programa e execute-o novamente. Funcionou corretamente? Caso contrário, corrija os erros até que tudo funcione corretamente.
Procedimento de Teste
Verifique se seu programa funciona corretamente seguindo cada etapa deste procedimento de teste:
-
Após concluir as etapas desta tarefa, execute seu programa e insira as entradas mostradas abaixo. Certifique-se de que a saída do seu programa corresponda à saída abaixo.
> python volume_cone.py Este programa calcula o volume de um cone circular reto. Por exemplo, se o raio de um cone é 2.8 e a altura é 3.2, então o volume é 26.3 Por favor, digite o raio do cone: 5 Por favor, digite a altura do cone: 8.2 Raio: 5.0 Altura: 8.2 Volume: 214.7
Exemplo de Solução
Quando terminar seu programa, consulte o exemplo de solução para comparar com o seu.
Primeiro, procure concluir o programa sem olhar o exemplo de solução. No entanto, se já tiver trabalhado nele por bastante tempo e ainda estiver com dificuldades, sinta-se à vontade para usá-lo como apoio para finalizar seu programa.
Ponderar
O programa original que você copiou e colou para iniciar esta tarefa não funcionou porque o programador tentou usar as variáveis de raio e altura dentro da função volume_cone. Entretanto, as variáveis raio e altura são definidas dentro da função main e, portanto, têm escopo local e não podem ser usadas fora de main. Para corrigir o programa, você adicionou dois parâmetros à função volume_cone e então adicionou dois argumentos a cada chamada da função volume_cone.
Por que o escopo de variáveis locais foi inventado por cientistas da computação? Como o escopo de variáveis locais torna um programa mais fácil de escrever e entender?
Envio
Quando terminar, reporte seu progresso no questionário Canvas correspondente a esta atvidade.
Links Úteis:
- Voltar para: Visão Geral da Semana | Página Inicial