CSE 111: Programação com Funções

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.

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

Declaração do Problema

Diagrama de um cone circular reto com raio r e altura h
Um cone circular reto com raio r e altura h

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:

  1. 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
  2. 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.
  3. Corrija a função volume_cone que 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.
  4. Corrija a chamada para a função volume_cone que está em main na linha  13, adicionando dois argumentos. Como a função volume_cone tem dois parâmetros (você adicionou os dois parâmetros na etapa anterior), cada chamada para a função volume_cone deve 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 de main acima da linha  13.
  5. Corrija a chamada para a função volume_cone que está em main na 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 de main acima da linha  27.
  6. 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:

  1. 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: