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)

Command-line interface
Screenshot of a sample Bash session in GNOME Terminal 3, Fedora 15

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)

Flowchart
Um fluxograma simples padrão ANSI mostrando como lidar com uma lâmpada que não funciona.

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)

graph TD; A[Início] --> B[Ler primeiro número]; B --> C[Ler segundo número]; C --> D[Validar conversões]; D --> E[Somar]; E --> F[Mostrar resultado]; F --> G[Fim]

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.

Questão 1

Qual é a forma básica correta de definir uma função em Python que recebe parâmetros e retorna um valor?

Questão 2

Como documentar corretamente uma função para que seja acessível via help() e pela propriedade __doc__?

Questão 3

Qual prática é adequada ao ler entrada do usuário com input() para obter um inteiro com tratamento de erros?

Questão 4

Qual prática é recomendada para formatar mensagens de saída de forma legível e eficiente em Python?

Questão 5

Qual prática favorece a testabilidade e a reutilização de código em Python?