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

S01 - Atividade de Aprendizagem (2 de 2): Chamando Funções

Como a maioria dos programas de computador úteis é muito grande, os programadores costumam dividi-los em partes. Isso facilita a escrita, a correção de erros e a compreensão do código. Em Python, é possível dividir um programa em módulos, classes e funções. Nesta aula, você vai aprender a chamar funções já existentes; na próxima, aprenderá a criar suas próprias funções.

Conceitos

Estes são os conceitos e tópicos de programação em Python que você deve aprender durante esta aula.

O que é uma Função?

Uma função é um grupo de instruções (comandos de computador) que juntas executam uma tarefa. Em termos gerais, existem quatro tipos de funções em Python:

  1. Funções embutidas
  2. Funções da biblioteca padrão
  3. Funções de terceiros
  4. Funções definidas pelo usuário

Um programador (você) pode economizar muito tempo usando funções existentes. Nesta aula, você aprenderá como usar ou chamar os dois primeiros tipos de funções. Na semana 3, você aprenderá como instalar módulos de terceiros e chamar funções de terceiros. Na próxima aula, você aprenderá a escrever e chamar funções definidas pelo usuário.

Funções embutidas

Python inclui muitas funções embutidas, como: input, int, float, str, len, range, abs, round, list, dict, open e print. Elas são chamadas de funções embutidas porque você não precisa importar nenhum módulo para usá-las. São simplesmente uma parte embutida da linguagem Python. Você pode ler sobre as funções embutidas na seção Funções Embutidas da referência online oficial do Python.

Como Chamar uma Função

Programadores usam uma função ao chamá-la (também conhecido como "invocar"). Chamar uma função significa instruir o computador a executar as instruções contidas nela. Independentemente do tipo de função (embutida, padrão, de terceiros ou definida pelo usuário), uma função é chamada escrevendo seu nome seguido por um conjunto de parênteses ( ). Durante o CSE 110 e 111, você frequentemente escreveu código que chamava as funções embutidas input e print, como neste exemplo:

nome = input("Por favor, digite seu nome: ")
print(f"Olá, {nome}")
> python exemplo_1.py
Por favor, digite seu nome: Milena
Olá, Milena

Observe no exemplo de código anterior que, para chamar a função input, o programador escreveu o nome da função, input, seguido de parênteses. O programador fez o mesmo para chamar a função print.

Para chamar uma função, você deve saber as três coisas a seguir:

  1. O nome da função
  2. Os parâmetros que a função aceita
  3. O que a função faz

Essas três informações normalmente estão disponíveis em documentação online. Por exemplo, na referência online de Python para a função input, pode-se ler o seguinte:

input(prompt)
Escreva o valor do parâmetro prompt na janela do terminal, leia uma linha digitada pelo usuário na janela do terminal, converta essa entrada para uma string e a retorne.

A partir desta breve descrição, sabemos o seguinte:

  1. O nome da função é input.
  2. A função aceita um parâmetro chamado prompt.
  3. A função exibe o prompt no terminal, lê a entrada do usuário e retorna essa entrada para a função que a chamou.

Um parâmetro é um dado que uma função precisa para concluir sua tarefa. Na referência online da função input, é possível observar que a função input tem um parâmetro chamado prompt.

Um argumento é o valor que é passado através de um parâmetro para uma função. Isso significa que os parâmetros são listados na documentação de uma função e os argumentos são listados ao chamar uma função.

Para criar código que chama uma função, normalmente você deve fazer o seguinte:

  1. Crie uma variável e use o operador de atribuição (=) para indicar qual valor ela vai armazenar.
  2. Digite o nome da função seguido de um conjunto de parênteses.
  3. Entre parênteses, digite os argumentos que serão passados para a função por meio de seus parâmetros.

Por exemplo, o código a seguir chama a função embutida input e passa a string "Por favor, digite seu nome: " como argumento para o parâmetro prompt.

nome = input("Por favor, digite seu nome: ")

Quando uma função tem mais de um parâmetro e um programador escreve código para chamar essa função, os argumentos quase sempre serão escritos na mesma ordem dos parâmetros. Considere a descrição da função embutida round:

round(numero, ndigitos)
Retorna um numero arredondado com precisão de ndigitos após a casa decimal. Se ndigitos for omitido ou for definido como None, a função round retornará o número inteiro mais próximo.

Agora considere este código em Python que obtém um número de um usuário, arredonda esse número para dois dígitos depois do decimal e então exibe o número arredondado.

n = float(input("Por favor, digite um número: "))
r = round(n, 2)
print(r)
> python exemplo_2.py
Por favor, digite um número: 95.716
95.72

No exemplo anterior:

Argumentos Opcionais

Ao chamar uma função ou método, alguns argumentos são opcionais. Considere novamente a descrição da função embutida round:

round(numero, ndigitos)
Retorna um numero arredondado com precisão de ndigitos após a casa decimal. Se ndigitos for omitido ou for definido como None, a função round retornará o número inteiro mais próximo de numero.

Na descrição, lemos que o segundo argumento é opcional. Se o programador não digitar um segundo argumento, o valor no parâmetro numero será arredondado para um número inteiro. O próximo exemplo de código é semelhante ao anterior. A única diferença é que na linha 2 do próximo exemplo, o programador digitou apenas um argumento para a função round. Como o programador omitiu o segundo argumento, a função round arredondará o número em seu primeiro parâmetro para um inteiro, conforme mostrado na saída abaixo.

n = float(input("Por favor, digite um número: "))
r = round(n)
print(r)
> python exemplo_3.py
Por favor, digite um número: 95.716
96

Argumentos Nomeados

Em alguns casos, certos parâmetros são opcionais e, quando usados, precisam ser passados como argumentos nomeados, ou seja, precedidos pelo nome do parâmetro correspondente. Por exemplo, na função print:

print(*objects, sep=" ", end="\n", file=sys.stdout, flush=False)
Essa função exibe objetos no fluxo de texto (por padrão, a tela), separados por sep e finalizados por end. Os parâmetros sep, end, file e flush, são opcionais e, se fornecidos, precisam ser passados como argumentos nomeados.

Observe que a função print pode receber muitos objetos que serão exibidos. Opcionalmente, ela pode receber parâmetros chamados sep, end, file e flush, que devem ser nomeados quando usados. Por exemplo, este código chama a função print para exibir três palavras, todas separadas por uma barra vertical (|). Observe os argumentos nomeados sep e flush.

x = "sol"
y = "lua"
z = "estrelas"
print(x, y, z, sep="|", flush=True)
> python exemplo_4.py
sol|lua|estrelas

Como chamar uma função que está dentro de um módulo

Um módulo em Python é uma coleção de funções relacionadas. A biblioteca padrão do Python inclui muitos módulos que contêm mais funções, como o módulo math — que inclui as funções floor, ceil e sqrt; e o módulo random — que inclui as funções randint, choice e shuffle. Considere a descrição da função sqrt que está no módulo padrão math:

math.sqrt(x)
Retorna a raiz quadrada de x.

A partir dessa breve descrição, sabemos o seguinte:

  1. O nome do módulo que contém a função é math.
  2. O nome da função é sqrt.
  3. A função aceita um parâmetro chamado x.
  4. A função calcula e retorna a raiz quadrada do número que está em x.

Para usar qualquer código que esteja em um módulo, você deve importar o módulo no seu programa e preceder o nome da função com o nome do módulo. Por exemplo, se você quiser chamar a função math.sqrt, deve primeiro importar o módulo math e depois digitar math. antes de sqrt, assim:

import math
r = math.sqrt(71)
print(r)
> python exemplo_5.py
8.426149773176359

Na função math.sqrt(x), x é o parâmetro definido na função, e o argumento que será passado para esse parâmetro quando a função for chamada será 71. A função math.sqrt calculará a raiz quadrada de 71 e retornará o valor resultante, que será então armazenado na variável r. Você pode ler mais sobre os módulos padrão na documentação oficial da Biblioteca Padrão do Python.

Como Chamar um Método

Python é uma linguagem orientada a objetos e usa muitos métodos — que são funções ligadas a classes ou objetos. Embora este curso não aborde classes e objetos, chamar métodos em Python é algo comum e simples. Para isso, basta digitar o nome do objeto, seguido de um ponto e do nome do método.

Considere o exemplo 6, que obtém uma string do usuário, exibe a quantidade de caracteres e a mostra em maiúsculas.

# Exemplo 6
# Obtém uma string do usuário.
texto1 = input("Digite uma frase motivacional: ")
# Chama a função embutida len para obter
# o número de caracteres no texto.
comprimento = len(texto1)
# Chama o método string upper para converter
# texto1 em letras maiúsculas.
texto2 = texto1.upper()
# Chama a função embutida print para exibir
# o comprimento do texto e o texto em
# letras maiúsculas para o usuário ver.
print(comprimento, texto2)
> python exemplo_6.py
Digite uma frase motivacional: Levanta-te, toma o teu leito e anda.
36 LEVANTA-TE, TOMA O TEU LEITO E ANDA.

Na linha 6, o código chama a função integrada len; na linha 9, chama o método upper de uma string.
Funções como len são chamadas pelo nome, seguido de parênteses com os argumentos. Já métodos, como upper, exigem o nome do objeto (texto1), um ponto, o nome do método e, se houver, os argumentos entre parênteses.

Um método pode receber argumentos, assim como uma função. No exemplo 6, linha 9, o método upper é chamado sem argumentos — por isso, os parênteses estão vazios. Mesmo assim, eles precisam ser digitados para que o método seja executado corretamente.

Em outras palavras, se você tentar chamar o método upper sem os parênteses, o Python não executará o método, como neste caso:

texto2 = texto1.upper  # NÃO chama o método upper

Em vez disso, o computador vai apenas guardar o método upper na variável texto2, sem executá-lo. Esse tipo de comportamento só fará sentido quando você estudar programação funcional — por enquanto, o que você quer é chamar o método, não apenas referenciá-lo.

Como Armazenar Um Valor Retornado

Todos os exemplos anteriores neste conteúdo de preparação usam o operador de atribuição (=) para armazenar o valor retornado de uma função em uma variável. Por exemplo:

texto = input("Digite uma frase motivacional: ")

Embora geralmente seja uma boa prática, não é obrigatório armazenar o valor retornado de uma função em uma variável. Às vezes, você o verá usado diretamente, como mostrado no exemplo 7, nas linhas 7, 10 e 12.

# Exemplo 7
import math
# Obtém um número do usuário.
numero = float(input("Digite um número: "))
# Chama a função math.sqrt e
# exibe imediatamente o valor retornado.
print(math.sqrt(numero))
# Chama a função math.sqrt novamente e
# usa seu valor retornado em uma instrução if.
if math.sqrt(numero) < 100:
    print(f"A raiz quadrada é menor que 100.")
elif math.sqrt(numero) > 100:
    print(f"A raiz quadrada é maior que 100.")
else:
    print(f"A raiz quadrada é exatamente 100.")
> python exemplo_7.py
Digite um número: 675
25.98076211353316
A raiz quadrada é menor que 100.

Observe o exemplo 7 contém três instruções que chamam a função math.sqrt. Toda vez que o computador chama uma função, ele executa o código que está dentro dessa função. No exemplo 7, como o argumento é o mesmo em todas as três vezes que a função é chamada, o resultado retornado será o mesmo em todos os casos. Portanto, seria mais rápido salvar o resultado em uma variável e reutilizá-la, como mostrado no exemplo 8.

# Exemplo 8
import math
# Obtém um número do usuário.
numero = float(input("Digite um número: "))
# Chama a função math.sqrt e armazena seu
# valor retornado em uma variável para usar depois.
raiz = math.sqrt(numero)
print(f"A raiz quadrada é {raiz:.2f}")
if raiz < 100:
    print(f"A raiz quadrada é menor que 100.")
elif raiz > 100:
    print(f"A raiz quadrada é maior que 100.")
else:
    print(f"A raiz quadrada é exatamente 100.")
> python exemplo_8.py
Digite um número: 675
A raiz quadrada é 25.98
A raiz quadrada é menor que 100.

Vídeo

O vídeo a seguir mostra um instrutor escrevendo um código em Python que chama funções embutidas.

Resumo

Uma função é um grupo de instruções que juntas executam uma tarefa. O computador não executará o código de uma função a menos que você escreva um código que chame essa função. Nesta aula, você aprendeu como chamar funções embutidas, funções que estão em um módulo e funções (métodos) que pertencem a um objeto.

  1. Para chamar uma função embutida, escreva um código que siga este modelo:
    nome_da_variavel = nome_da_funcao(arg1, arg2, … argN)
    
  2. Para chamar uma função de um módulo, importe o módulo e escreva o código que segue este modelo:
    import nome_do_modulo
    nome_da_variavel = nome_do_modulo.nome_da_funcao(arg1, arg2, … argN)
    
  3. Para chamar um método, escreva um código que siga este modelo:
    nome_da_variavel = nome_do_objeto.nome_do_metodo(arg1, arg2, … argN)
    

Atividade

Objetivo

Avaliar seu conhecimento sobre como chamar funções embutidas do Python e funções que estão em um módulo padrão do Python.

Declaração do Problema

Em nossa economia mundial moderna, muitos itens são fabricados em grandes fábricas, depois embalados em caixas e enviados para centros de distribuição e lojas de varejo. Uma pergunta comum entre funcionários que embalam produtos é “de quantas caixas precisamos?”

Tarefa

Uma empresa de manufatura precisa de um programa que ajude seus funcionários a empacotar itens fabricados em caixas para envio. Escreva um programa em Python chamado caixas.py que solicite ao usuário dois números inteiros:

  1. o número de itens fabricados
  2. o número de itens que o usuário empacotará por caixa

Seu programa deve calcular e exibir o número de caixas necessárias para armazenar os itens. Esse número deve ser inteiro. Observe que a última caixa pode conter menos itens do que as demais.

Documentação Útil

Procedimento de Teste

Verifique se seu programa funciona corretamente seguindo cada etapa deste procedimento de teste:

  1. Execute seu programa e digite as entradas mostradas abaixo. Certifique-se de que a saída do seu programa corresponda à saída abaixo.
    > python caixas.py
    Digite o número de itens fabricados: 8
    Digite o número de itens por caixa: 5
    
    Para 8 itens, empacotando 5 itens por caixa, você precisará de 2 caixas.
    > python caixas.py
    Digite o número de itens fabricados: 25
    Digite o número de itens por caixa: 4
    
    Para 25 itens, empacotando 4 itens por caixa, você precisará de 7 caixas.

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

Durante esta tarefa, você escreveu um código que chama a função math.ceil(). O que a função math.ceil() fez no seu programa? Se a função math.ceil() não existisse, teria sido mais difícil de concluir esta tarefa?

Envio

Quando terminar, informe seu progresso no questionário do Canvas correspondente a esta atvidade.

Envio

Links Úteis: