Submódulo 4: Funções, entrada e saída: funções simples e utilitários
Site: | Lumina |
Curso: | Python para Iniciantes: Lógica e Programação |
Livro: | Submódulo 4: Funções, entrada e saída: funções simples e utilitários |
Impresso por: | Usuário visitante |
Data: | quarta-feira, 17 set. 2025, 21:05 |
Descrição
Neste submódulo consolidamos funções simples (def), parâmetros, retorno e docstrings; exploramos entrada e saída com input/print e formatação com f-strings; e apresentamos utilitários embutidos úteis como len, type, max e min. Ao final você verá como juntar essas peças em um pequeno programa que lê dois números, soma e exibe o resultado com mensagens claras.
Por que usar funções? Sintaxe básica, parâmetros e docstrings
🎯 Por que funções? Antes do código, o problema
Imagine que você está construindo um aplicativo que envia mensagens: várias partes do programa precisam montar uma saudação. Em vez de repetir o mesmo trecho em cada lugar, criamos uma função que encapsula essa lógica — assim evitamos duplicação e facilitamos manutenção. Vamos ver o porquê antes do como: funções nos permitem dividir o problema em blocos reutilizáveis e testáveis, facilitando mudanças futuras.(1)
Agora a sintaxe mínima: usamos a palavra-chave def
, nomeamos a função, declaramos parâmetros entre parênteses e terminamos com dois-pontos. O corpo tem indentação. É recomendável adicionar um docstring (uma string logo abaixo da definição) que explica em uma linha o propósito da função; essa documentação fica disponível em __doc__
e via help()
.(1)(2)
# Vamos criar uma função simples que retorna uma saudação.
def saudacao(nome):
'''Retorna uma saudação personalizada para o nome informado.'''
return f'Olá, {nome}!'
# Testes rápidos para validar comportamento esperado
assert saudacao('Ana') == 'Olá, Ana!'
print(saudacao('Mundo')) # Saída esperada: Olá, Mundo!
Explicando o código acima passo a passo: primeiro declaramos a função — saudacao
— que recebe um parâmetro nome
. A docstring (entre três aspas simples) descreve o propósito. A função retorna a string formada pela f-string. Observe que usamos return
para enviar um valor de volta ao chamador; sem return
a função retorna None
. Isso é prática comum ao projetar funções reutilizáveis.(1)(2)
Atividade: Copie a função acima e modifique para aceitar dois parâmetros: nome
e saudacao_inicial
(ex.: 'Oi', 'Olá'). Atualize a docstring e escreva 2 assertes que verifiquem saídas diferentes.
Erros comuns: muitos iniciantes esquecem a indentação dentro da função ou chamam a função antes de defini-la. Outro erro frequente é usar print
dentro da função quando você precisa que ela devolva um valor para outras partes do código — prefira return
para lógica reutilizável.(1)
Lembra dos tipos que estudamos antes? Funções trabalham sobre esses valores: strings, números e coleções — tudo pode ser passado como argumento. Isso prepara você para estruturar decisões e laços no próximo módulo.
Entrada e saída: input, print e f-strings para mensagens claras
🖥️ Ler e mostrar: por que a I/O importa
Programas úteis interagem com pessoas — seja no terminal, seja via interface. Em Python, a função input()
lê texto do usuário como string; isso significa que, quando esperamos números, precisamos converter explicitamente para int
ou float
. Se a conversão falhar, devemos tratar o erro para evitar que o programa quebre.(1)

Para exibir resultados de forma legível, usamos print()
combinado com formatted string literals (f-strings), que são concisas e legíveis desde Python 3.6.(2) O interessante das f-strings é que podemos embutir expressões diretamente: f'{valor:.2f}'
formata números; {nome}
mostra variáveis; e o operador de depuração =
(desde versões recentes) ajuda a inspecionar valores durante o desenvolvimento.(2)
# Programa: lê dois números, soma e exibe o resultado de forma amigável
def ler_numero(prompt):
'''Lê um número do usuário; repete até receber uma entrada válida.'''
while True:
entrada = input(prompt)
try:
# Tenta interpretar como inteiro primeiro, senão float
if '.' in entrada:
return float(entrada)
return int(entrada)
except ValueError:
print('Entrada inválida. Digite um número, por exemplo 3 ou 4.5.')
n1 = ler_numero('Digite o primeiro número: ')
n2 = ler_numero('Digite o segundo número: ')
resultado = n1 + n2
print(f'O resultado da soma entre {n1} e {n2} é {resultado}.')
Se executarmos com entradas 2
e 3.5
, o programa converte corretamente para int
e float
e imprime: O resultado da soma entre 2 e 3.5 é 5.5. (Mostre isso ao colega para comparar comportamentos). Lembre-se: input()
sempre retorna string — a conversão é responsabilidade do programador.(1)(3)
Atividade: Modifique o programa para que, além da soma, mostre também o tipo de cada entrada usando type()
. Escreva um assert que verifique que a soma de 2 e 3 resulta em 5.
Dica prática: Em programas reais, valide entradas e forneça mensagens específicas. Documentação oficial mostra exemplos de I/O e formatação que são boas referências ao implementar mensagens profissionais.(1)(2)
Utilitários embutidos (len, type, max, min) e um programa completo de exemplo
🧰 Ferramentas do dia a dia: len, type, max e min
O Python fornece funções embutidas que aceleram tarefas comuns: len(obj)
retorna o tamanho de sequências e coleções; type(x)
indica o tipo em tempo de execução; max()
e min()
retornam valores extremos. Essas funções são parte da biblioteca core e devem ser usadas sempre que possível para clareza e desempenho.(1)

Sobre escopo: uma variável local existe apenas dentro da função; alterar uma variável global dentro de uma função exige cuidado e, geralmente, deve ser evitado em prol de funções puras que recebem parâmetros e retornam resultados. Isso torna o código mais previsível e testável — por isso passamos valores e usamos retornos em vez de depender de globals.(2)
Vamos combinar uma função que calcula área de retângulo com um pequeno programa que soma dois números — assim vemos reutilização, testes e utilitários juntos.(1)(3)
def area_retangulo(largura, altura):
'''Retorna a área de um retângulo.'''
return largura * altura
# Testes básicos
assert area_retangulo(2, 3) == 6
assert area_retangulo(5, 0) == 0
# Programa que usa utilitários
a = 'python'
print(f"O tamanho da string 'python' é {len(a)} e seu tipo é {type(a)}.")
# Exemplo rápido com max/min
valores = [3, 7, -1, 42]
print(f'Maior: {max(valores)}, Menor: {min(valores)}')
Reflita: Você fez funções que retornam valores e validações. Como isso ajuda quando seu código cresce para 100–1000 linhas? Pense em testes: funções puras facilitam testes automatizados, algo valorizado por empregadores ao revisar seu portfólio.
Conexão prática: empresas usam essas convenções (docstrings, testes simples, tratamento de I/O) em entrevistas e projetos; escrever código assim já é um ganho no seu portfólio. A documentação oficial lista as funções built-in e explica nuances de comportamento e exceções — consulte-a quando tiver dúvida.(1)
Desafio prático: Escreva uma função somar_e_formatar(a, b)
que retorna uma string formatada com o resultado e o tipo de cada entrada, por exemplo: "2 (int) + 3.5 (float) = 5.5". Adicione asserts que validem 3 casos diferentes.
🎯 Exercícios
🎯 Exercícios: Funções, entrada e saída: funções simples e utilitários
Teste seus conhecimentos com estas questões de múltipla escolha. Cada questão tem apenas uma resposta correta.
Qual é a forma básica correta de definir uma função em Python que recebe parâmetros e retorna um valor?
Como documentar corretamente uma função para que seja acessível via help() e pela propriedade __doc__?
Qual prática é adequada ao ler entrada do usuário com input() para obter um inteiro com tratamento de erros?
Qual prática é recomendada para formatar mensagens de saída de forma legível e eficiente em Python?
Qual prática favorece a testabilidade e a reutilização de código em Python?