Nomear bem,
refatorar melhor
Um nome de função é documentação viva. Hoje aprendemos a nomear funções de forma semântica em snake_case e a transformar um código "tudo junto" em uma biblioteca de utilidades.
Um nome de função é documentação viva. Hoje aprendemos a nomear funções de forma semântica em snake_case e a transformar um código "tudo junto" em uma biblioteca de utilidades.
Três semanas construindo as estruturas de dados que sustentam programas reais. Hoje fechamos a unidade — e abrimos a porta para a programação modular.
Listas, índices, percurso e busca em uma dimensão.
Estruturas 2D, agregações por linha e coluna, modelagem de tabuleiros.
Encapsular, nomear bem e refatorar. Encerramento da Unidade 4.
A3Nomear funções de forma semântica, usando a convenção snake_case do Python
A3Distinguir as convenções de nomeação e saber onde cada uma se aplica
A4Refatorar um código de vetor "tudo junto" em funções pequenas com responsabilidade única
A4Usar if __name__ == "__main__" para tornar o código uma biblioteca reutilizável
def nome(parâmetros)return devolve um valor a quem chamou; uma função com retorno gera um resultadoreturn útilUm bom nome de função explica a intenção do código antes mesmo de você ler o corpo dela. Compare: qual destes dois trechos você entende sem precisar abrir a função?
# Nomes ruins — o que isso faz?
def cm(n1, n2):
return (n1 + n2) / 2
def proc(l):
for x in l:
print(x)
# Na hora de usar... mistério:
r = cm(8, 6)
proc(turma)
# Nomes semânticos — lê-se como frase
def calcular_media(nota1, nota2):
return (nota1 + nota2) / 2
def exibir_alunos(lista_alunos):
for aluno in lista_alunos:
print(aluno)
# Na hora de usar... transparente:
media = calcular_media(8, 6)
exibir_alunos(turma)
calcular_media, adicionar_musicas_de_rock, exibir_alunos. Só de ler o nome, você sabe o que esperar do retorno e do efeito.
O nome importa; o estilo de escrever o nome também. Cada linguagem adota convenções. Em Python, a recomendação oficial (PEP 8) é clara:
camelCase — primeira palavra minúscula, demais com inicial maiúscula, sem espaços.
comum em Java / JavaScriptPascalCase — todas as palavras com inicial maiúscula. Em Python, reservado para nomes de classes.
classes em Pythonsnake_case — tudo minúsculo, palavras separadas por _. O padrão Python para funções e variáveis.
UPPER_CASE_SNAKE_CASE — tudo maiúsculo. Em Python, reservado para constantes (valores que não mudam).
constantes em Pythonsnake_case para funções e variáveis, PascalCase para classes, UPPER_CASE para constantes. Consistência vale mais que preferência pessoal — o time inteiro lê o mesmo estilo.
Em Python, qual das convenções de nomeação é a mais recomendada para escrever os nomes de funções e variáveis?
minhaVariavel (camelCase)MinhaVariavel (PascalCase)minha_variavel (snake_case) ✓MINHA_VARIAVEL (UPPER_CASE_SNAKE_CASE)snake_case para funções e variáveis. UPPER_CASE fica reservado para constantes, e PascalCase para nomes de classes. As outras opções são convenções de outras linguagens.
Já sabemos nomear funções de forma que se leiam como frases. Mas nomear bem é metade da história. A outra metade é quebrar um programa grande em funções pequenas, cada uma com uma única responsabilidade. Vamos pegar um código de vetor "tudo junto" e refatorá-lo em uma biblioteca de utilidades: funções reutilizáveis que leem, exibem e calculam — separadas e testáveis.
__main__Uma biblioteca é só um conjunto de funções úteis que outros arquivos podem importar e reutilizar. Mas há um problema: se o arquivo tem testes no fim, eles rodam ao importar. A solução é o bloco if __name__ == "__main__".
# utilidades.py — a biblioteca
def calcular_soma(vetor):
return sum(vetor)
def calcular_media(vetor):
if len(vetor) == 0:
return 0
return sum(vetor) / len(vetor)
# Teste só roda se executar ESTE arquivo
if __name__ == "__main__":
dados = [10, 20, 30]
print("Soma:", calcular_soma(dados))
print("Média:", calcular_media(dados))
Quando você executa utilidades.py diretamente, o Python define __name__ == "__main__" e os testes rodam.
Quando outro arquivo importa a biblioteca, __name__ vira "utilidades" — e o bloco de teste não roda.
# app.py — reutiliza, sem disparar testes
from utilidades import calcular_media
print(calcular_media([7, 8, 9]))
# imprime só 8.0 — nada do bloco de teste
__main__, importar a biblioteca dispararia todos os print de teste — efeitos colaterais indesejados. Com ele, as funções viram peças reutilizáveis sem "barulho".
__main__?Qual a principal vantagem de colocar o código de teste de um módulo dentro do bloco if __name__ == "__main__"?
import funcionar em Python.if __name__ == "__main__" só roda quando o arquivo é executado diretamente. Ao ser importado por outro arquivo, esse bloco é ignorado — as funções ficam disponíveis sem disparar os testes. Não tem nada a ver com velocidade nem é obrigatório para import.
O mesmo programa — ler um vetor, exibi-lo e calcular soma, média e maior valor — escrito de duas formas. À esquerda, tudo no nível principal. À direita, dividido em funções com responsabilidade única.
# ANTES — tudo junto, no nível principal
vetor = []
n = int(input("Quantos números? "))
for _ in range(n):
vetor.append(float(input("Valor: ")))
print("Vetor:", vetor)
soma = 0
for v in vetor:
soma += v
print("Soma:", soma)
media = soma / len(vetor) # quebra se vazio!
print("Média:", media)
maior = vetor[0]
for v in vetor:
if v > maior:
maior = v
print("Maior:", maior)
# DEPOIS — biblioteca de funções
def ler_vetor():
vetor = []
n = int(input("Quantos números? "))
for _ in range(n):
vetor.append(float(input("Valor: ")))
return vetor
def exibir_vetor(vetor): # sem retorno
print("Vetor:", vetor)
def calcular_soma(vetor): # com retorno
return sum(vetor)
def calcular_media(vetor): # trata vazio
if len(vetor) == 0:
return 0
return calcular_soma(vetor) / len(vetor)
def encontrar_maior(vetor):
if len(vetor) == 0:
return None
return max(vetor)
if __name__ == "__main__":
dados = ler_vetor()
exibir_vetor(dados)
print("Soma:", calcular_soma(dados))
print("Média:", calcular_media(dados))
print("Maior:", encontrar_maior(dados))
calcular_media, sempre cheque if len(vetor) == 0 antes de dividir. Sem isso, uma lista vazia causa ZeroDivisionError. A versão "antes" tem exatamente esse bug — a refatoração é a chance de corrigi-lo.
Refatore um código "tudo junto" que opera sobre um vetor, separando-o em funções pequenas com responsabilidade única. Durante a aula.
Identifique os blocos do código: leitura, exibição e cálculos.
Crie uma função para ler e retornar o vetor.
Crie uma função para exibir o vetor.
Crie funções para soma, média e maior valor.
Organize o programa principal usando chamadas de função.
Teste com diferentes tipos de vetores.
Pegue um programa que já funciona e melhore seus nomes: renomeie as funções com nomes claros em snake_case, ajuste variáveis e reorganize para maior clareza.
Execute o código e entenda o que ele faz.
Comente o que cada função faz.
Renomeie as funções com nomes claros (snake_case).
Garanta funções com e sem retorno.
Melhore nomes de variáveis e reorganize.
Teste com lista normal e lista vazia.
Salve o programa final em .py.
Escreva um breve relato das melhorias.
Dois vídeos curtos que aprofundam os temas de hoje — nomeação e subrotinas.
YouTube, 7 jul. 2022. Sobre nomear com clareza e consistência.
YouTube, 23 jun. 2022. Lógica de programação aplicada a funções.
calcular_media diz mais que cmPascalCase para classes, UPPER_CASE para constantesreturn geram valores (cálculos); sem retorno organizam ações (exibição, interação)if __name__ == "__main__" → evita efeitos colaterais ao importar; testes só rodam ao executar o arquivo diretamenteCom funções, fechamos a unidade de estruturas de dados e programação modular. A próxima unidade abre uma nova etapa do componente — partindo de tudo que você já sabe encapsular e reutilizar.
PYTHON SOFTWARE FOUNDATION. PEP 8 — Style Guide for Python Code. Disponível em: peps.python.org/pep-0008. Acesso em: 30 mai. 2026. · PEP 257 — Docstring Conventions: peps.python.org/pep-0257.
PYTHON SOFTWARE FOUNDATION. Modules — The Python Tutorial. Disponível em: docs.python.org/3/tutorial/modules.html. Acesso em: 30 mai. 2026.
GOOGLE. Google Python Style Guide. Disponível em: google.github.io/styleguide/pyguide.html. Acesso em: 30 mai. 2026.
FOWLER, M. Refatoração: aperfeiçoando o design de códigos existentes. 2. ed. São Paulo: Novatec, 2020. · HUNT, A.; THOMAS, D. O programador pragmático. Porto Alegre: Bookman, 2010.
IBICT. #9 Boas práticas na nomeação dos arquivos para compartilhamento. YouTube, 7 jul. 2022: youtube.com/watch?v=I6tXlHPMxHg. · BÓSON TREINAMENTOS. Subrotinas (funções e procedimentos). YouTube, 23 jun. 2022: youtube.com/watch?v=9kJrgn-9PFY. · GEEKSFORGEEKS. What does if __name__ == "__main__" do?: geeksforgeeks.org.
Base institucional: SEDUC-SP. Educação Profissional Paulista — Técnico em Desenvolvimento de Sistemas. Componente 1, Unidade 4, Semana 13 (SISANO1C1B2S13A3 e SISANO1C1B2S13A4).
Identidade visual · adaptação para apresentação HTML por Guilherme Antunes