Os comentários em Python são fundamentais para criar código legível e profissional. Se você está começando a programar, dominar o uso correto de comentários é essencial para desenvolver bons hábitos desde o início e facilitar a manutenção do seu código.
Neste guia completo, você aprenderá tudo sobre comentários Python: desde a sintaxe básica com #
até docstrings avançadas, com exemplos práticos que você pode aplicar imediatamente em seus projetos.
Aprenda Comentários Python na Prática
Antes de mergulharmos nos conceitos, veja esta explicação didática sobre Python básico e boas práticas:
Créditos: Curso em Vídeo - Professor Gustavo Guanabara
O que são Comentários em Python?
Comentários em Python são textos explicativos incluídos no código fonte que são ignorados pelo interpretador Python durante a execução. Eles servem para documentar, explicar e tornar o código mais compreensível para outros programadores e para você mesmo no futuro.
Características dos Comentários Python:
- Não executam: São ignorados pelo interpretador
- Documentam: Explicam o propósito do código
- Facilitam manutenção: Tornam mudanças mais fáceis
- Melhoram legibilidade: Código fica mais claro
# Este é um comentário simples
nome = "Python" # Comentário ao lado do código
print(f"Olá, {nome}!") # Isso será executado normalmente
💡 Dica: Se você ainda está aprendendo sobre variáveis em Python, nosso guia completo pode ajudar a entender melhor como documentar variáveis no código.
Tipos de Comentários em Python
1. Comentários de Linha Única
O tipo mais comum usa o símbolo #
para criar comentários de uma linha:
# Este é um comentário de linha única
print("Hello, World!")
# Você pode usar múltiplas linhas
# cada uma com seu próprio #
# para explicações mais longas
2. Comentários Inline (Na Mesma Linha)
Comentários podem ser adicionados ao lado do código na mesma linha:
idade = 25 # Idade do usuário em anos
preco = 19.99 # Preço em reais com desconto aplicado
ativo = True # Status do usuário no sistema
3. Comentários de Múltiplas Linhas
Embora Python não tenha comentários de múltiplas linhas dedicados, você pode usar várias opções:
# Opção 1: Múltiplas linhas com #
# Este é um comentário
# que ocupa várias linhas
# para explicar algo complexo
"""
Opção 2: String multilinha (não é tecnicamente um comentário)
Mas pode ser usada como comentário
quando não está atribuída a uma variável
"""
'''
Opção 3: Aspas simples triplas
Também funciona da mesma forma
que as aspas duplas triplas
'''
Docstrings: Comentários Especiais
Docstrings são strings de documentação que descrevem módulos, classes, métodos ou funções em Python. Elas são acessíveis programaticamente e seguem convenções específicas.
Sintaxe de Docstrings
def calcular_imc(peso, altura):
"""
Calcula o Índice de Massa Corporal (IMC).
Args:
peso (float): Peso em quilogramas
altura (float): Altura em metros
Returns:
float: Valor do IMC calculado
Examples:
>>> calcular_imc(70, 1.75)
22.86
"""
return peso / (altura ** 2)
# Acessando a docstring
print(calcular_imc.__doc__)
Estilos de Docstrings
# Estilo Google
def somar(a, b):
"""Soma dois números.
Args:
a (int): Primeiro número
b (int): Segundo número
Returns:
int: A soma dos dois números
"""
return a + b
# Estilo NumPy
def multiplicar(a, b):
"""
Multiplica dois números.
Parameters
----------
a : int
Primeiro número
b : int
Segundo número
Returns
-------
int
O produto dos dois números
"""
return a * b
# Estilo Sphinx
def dividir(a, b):
"""
Divide dois números.
:param a: Primeiro número
:type a: float
:param b: Segundo número
:type b: float
:returns: Resultado da divisão
:rtype: float
:raises ZeroDivisionError: Se b for zero
"""
if b == 0:
raise ZeroDivisionError("Divisão por zero não é permitida")
return a / b
Quando e Como Usar Comentários
1. Explicando Código Complexo
# Aplicando algoritmo de ordenação bubble sort
for i in range(len(lista)):
for j in range(0, len(lista) - i - 1):
# Troca elementos se estiverem na ordem errada
if lista[j] > lista[j + 1]:
lista[j], lista[j + 1] = lista[j + 1], lista[j]
2. Documentando Decisões de Negócio
# Taxa de desconto progressiva baseada no valor da compra
if valor_compra > 1000:
desconto = 0.15 # 15% para compras acima de R$ 1000
elif valor_compra > 500:
desconto = 0.10 # 10% para compras entre R$ 500-1000
else:
desconto = 0.05 # 5% para compras até R$ 500
3. Explicando Fórmulas e Cálculos
def calcular_juros_compostos(principal, taxa, tempo):
"""
Calcula juros compostos usando a fórmula:
M = P(1 + i)^n
Onde: M=montante, P=principal, i=taxa, n=tempo
"""
# Conversão da taxa percentual para decimal
taxa_decimal = taxa / 100
# Aplicação da fórmula de juros compostos
montante = principal * (1 + taxa_decimal) ** tempo
return montante
4. Comentários TODO e FIXME
# TODO: Implementar validação de email
def cadastrar_usuario(nome, email):
# FIXME: Verificar se email já existe no banco
usuario = {
'nome': nome,
'email': email,
'ativo': True
}
return usuario
# HACK: Solução temporária até refatoração da API
# XXX: Este código precisa ser revisado
Boas Práticas para Comentários
1. Comentários Claros e Concisos
# ❌ Ruim - obvio demais
x = x + 1 # Incrementa x em 1
# ✅ Bom - explica o propósito
x = x + 1 # Move para próxima posição no array
# ❌ Ruim - muito verboso
# Esta função vai receber dois parâmetros que são números
# e vai retornar a soma desses dois números para o usuário
def somar(a, b):
return a + b
# ✅ Bom - conciso e informativo
def somar(a, b):
"""Retorna a soma de dois números."""
return a + b
2. Mantenha Comentários Atualizados
# ❌ Ruim - comentário desatualizado
def calcular_desconto(valor):
"""Aplica desconto de 10% sobre o valor.""" # Mentira! Agora é 15%
return valor * 0.85
# ✅ Bom - comentário sempre atual
def calcular_desconto(valor):
"""Aplica desconto de 15% sobre o valor."""
return valor * 0.85
3. Use Comentários para Explicar “Por quê”, não “O quê”
# ❌ Ruim - explica o que já é óbvio
lista.sort() # Ordena a lista
# ✅ Bom - explica por que está sendo feito
lista.sort() # Ordenação necessária para busca binária ser eficiente
Exemplos Práticos com Comentários
1. Sistema de Validação de CPF
def validar_cpf(cpf):
"""
Valida um número de CPF brasileiro.
Args:
cpf (str): CPF com ou sem formatação
Returns:
bool: True se válido, False caso contrário
"""
# Remove caracteres especiais (pontos e hífen)
cpf_numeros = ''.join(filter(str.isdigit, cpf))
# CPF deve ter exatamente 11 dígitos
if len(cpf_numeros) != 11:
return False
# Verifica se todos os dígitos são iguais (CPF inválido)
if cpf_numeros == cpf_numeros[0] * 11:
return False
# Cálculo do primeiro dígito verificador
soma = sum(int(cpf_numeros[i]) * (10 - i) for i in range(9))
primeiro_digito = (soma * 10) % 11
if primeiro_digito == 10:
primeiro_digito = 0
# Cálculo do segundo dígito verificador
soma = sum(int(cpf_numeros[i]) * (11 - i) for i in range(10))
segundo_digito = (soma * 10) % 11
if segundo_digito == 10:
segundo_digito = 0
# Verifica se os dígitos calculados coincidem
return (primeiro_digito == int(cpf_numeros[9]) and
segundo_digito == int(cpf_numeros[10]))
# Teste da função
cpf_teste = "123.456.789-09"
print(f"CPF {cpf_teste} é válido: {validar_cpf(cpf_teste)}")
2. Calculadora de Salário Líquido
def calcular_salario_liquido(salario_bruto, dependentes=0):
"""
Calcula o salário líquido com base nas deduções legais.
Args:
salario_bruto (float): Salário bruto mensal
dependentes (int): Número de dependentes
Returns:
dict: Detalhamento do cálculo com valores
"""
# Cálculo do INSS (2023)
if salario_bruto <= 1302.00:
inss = salario_bruto * 0.075 # 7.5%
elif salario_bruto <= 2571.29:
inss = salario_bruto * 0.09 # 9%
elif salario_bruto <= 3856.94:
inss = salario_bruto * 0.12 # 12%
else:
inss = salario_bruto * 0.14 # 14% até o teto
# Limita INSS ao teto máximo
inss = min(inss, 713.10)
# Base de cálculo para IR (após INSS)
base_ir = salario_bruto - inss
# Dedução por dependente
deducao_dependentes = dependentes * 189.59
base_ir_final = base_ir - deducao_dependentes
# Cálculo do Imposto de Renda (2023)
if base_ir_final <= 1903.98:
ir = 0 # Isento
elif base_ir_final <= 2826.65:
ir = base_ir_final * 0.075 - 142.80 # 7.5%
elif base_ir_final <= 3751.05:
ir = base_ir_final * 0.15 - 354.80 # 15%
elif base_ir_final <= 4664.68:
ir = base_ir_final * 0.225 - 636.13 # 22.5%
else:
ir = base_ir_final * 0.275 - 869.36 # 27.5%
# Garante que IR não seja negativo
ir = max(ir, 0)
# Cálculo final
salario_liquido = salario_bruto - inss - ir
return {
'salario_bruto': salario_bruto,
'inss': inss,
'ir': ir,
'dependentes': dependentes,
'deducao_dependentes': deducao_dependentes,
'salario_liquido': salario_liquido
}
# Exemplo de uso
resultado = calcular_salario_liquido(5000.00, 2)
print(f"Salário líquido: R$ {resultado['salario_liquido']:.2f}")
Comentários em Estruturas de Dados
1. Comentando Dicionários Python
# Configurações do sistema com valores padrão
config_sistema = {
'debug': True, # Modo debug ativo em desenvolvimento
'timeout': 30, # Timeout em segundos para requisições
'max_tentativas': 3, # Número máximo de tentativas de conexão
'email_admin': '[email protected]', # Email para notificações críticas
'cache_enabled': False # Cache desabilitado em desenvolvimento
}
2. Documentando Classes
class ContaBancaria:
"""
Representa uma conta bancária simples.
Attributes:
numero (str): Número da conta
titular (str): Nome do titular
saldo (float): Saldo atual da conta
ativa (bool): Status da conta
"""
def __init__(self, numero, titular, saldo_inicial=0):
"""
Inicializa uma nova conta bancária.
Args:
numero (str): Número da conta
titular (str): Nome do titular
saldo_inicial (float, optional): Saldo inicial. Default é 0.
"""
self.numero = numero
self.titular = titular
self.saldo = saldo_inicial
self.ativa = True # Conta criada sempre ativa
def depositar(self, valor):
"""Deposita um valor na conta."""
if valor > 0 and self.ativa:
self.saldo += valor
return True
return False
def sacar(self, valor):
"""Saca um valor da conta se houver saldo suficiente."""
if valor > 0 and valor <= self.saldo and self.ativa:
self.saldo -= valor
return True
return False
Ferramentas para Documentação
1. Gerando Documentação com help()
def area_circulo(raio):
"""Calcula a área de um círculo."""
import math
return math.pi * raio ** 2
# Visualizando a documentação
help(area_circulo)
print(area_circulo.__doc__)
2. Anotações de Tipo com Comentários
from typing import List, Dict, Union
def processar_vendas(vendas: List[Dict[str, Union[str, float]]]) -> float:
"""
Processa uma lista de vendas e calcula o total.
Args:
vendas: Lista de dicionários com dados das vendas
Cada dicionário deve conter 'produto' (str) e 'valor' (float)
Returns:
Total das vendas processadas
Example:
>>> vendas = [{'produto': 'Notebook', 'valor': 2500.00}]
>>> processar_vendas(vendas)
2500.0
"""
total = 0.0 # Inicializa contador para soma
for venda in vendas: # Itera sobre cada venda
# Adiciona valor da venda ao total (com validação)
if 'valor' in venda and isinstance(venda['valor'], (int, float)):
total += float(venda['valor'])
return total
Vídeo Complementar: Python para Iniciantes
Para complementar seus estudos sobre Python, veja este tutorial sobre fundamentos:
Créditos: Curso em Vídeo - Professor Gustavo Guanabara
Comentários vs. Código Limpo
O Dilema: Comentar ou Não Comentar?
# ❌ Ruim - código obscuro que precisa de comentário
# Calcula a média ponderada dos últimos 30 dias
m = sum(v*p for v,p in zip(vals[-30:], pesos[-30:])) / sum(pesos[-30:])
# ✅ Melhor - código autodocumentado
def calcular_media_ponderada_30_dias(valores, pesos):
"""Calcula média ponderada dos últimos 30 dias."""
valores_recentes = valores[-30:]
pesos_recentes = pesos[-30:]
soma_ponderada = sum(valor * peso for valor, peso in zip(valores_recentes, pesos_recentes))
soma_pesos = sum(pesos_recentes)
return soma_ponderada / soma_pesos
Quando NÃO usar Comentários
# ❌ Comentários desnecessários
x = 5 # Atribui 5 à variável x
y = x + 1 # Adiciona 1 ao valor de x e atribui a y
print(y) # Imprime o valor de y
# ✅ Código limpo sem comentários óbvios
idade_minima = 18
idade_usuario = idade_minima + 1
print(f"Idade do usuário: {idade_usuario}")
Links Úteis sobre Comentários Python
Artigos Brasileiros Recomendados
- DevMedia: Boas Práticas de Programação
- Python Academy: O Guia de Estilos PEP8 do Python
- DevMedia: Python Tutorial - Introdução à Linguagem
- Trybe: Clean Code - Boas Práticas de Programação
Documentação Oficial e Recursos
Posts Relacionados no Blog
Continue aprendendo Python com nossos outros guias:
- Variáveis em Python: Guia Completo
- Funções em Python: Guia Completo
- Estruturas de Repetição for em Python
Exercícios Práticos
Exercício 1: Documentando uma Função
def calcular_idade_aposentadoria(idade_atual, contribuicao_anos):
"""
Calcula quando uma pessoa pode se aposentar.
Args:
idade_atual (int): Idade atual da pessoa
contribuicao_anos (int): Anos de contribuição
Returns:
dict: Informações sobre aposentadoria
"""
# Regras de aposentadoria (simplificadas)
idade_minima = 65 # Idade mínima para aposentadoria
contribuicao_minima = 35 # Anos mínimos de contribuição
# Verifica se já pode se aposentar
pode_aposentar = (idade_atual >= idade_minima and
contribuicao_anos >= contribuicao_minima)
if pode_aposentar:
anos_restantes = 0
else:
# Calcula anos restantes para cada critério
anos_idade = max(0, idade_minima - idade_atual)
anos_contrib = max(0, contribuicao_minima - contribuicao_anos)
anos_restantes = max(anos_idade, anos_contrib)
return {
'pode_aposentar': pode_aposentar,
'anos_restantes': anos_restantes,
'idade_aposentadoria': idade_atual + anos_restantes
}
# Teste da função
resultado = calcular_idade_aposentadoria(55, 30)
print(f"Pode aposentar: {resultado['pode_aposentar']}")
print(f"Anos restantes: {resultado['anos_restantes']}")
Exercício 2: Comentando um Algoritmo
def busca_binaria(lista_ordenada, item_procurado):
"""
Implementa busca binária em lista ordenada.
Args:
lista_ordenada (list): Lista ordenada para busca
item_procurado: Item a ser encontrado
Returns:
int: Índice do item ou -1 se não encontrado
"""
# Inicializa ponteiros para início e fim da lista
inicio = 0
fim = len(lista_ordenada) - 1
# Continua dividindo até encontrar ou esgotar opções
while inicio <= fim:
# Calcula posição do meio (evita overflow)
meio = inicio + (fim - inicio) // 2
# Verifica se encontrou o item
if lista_ordenada[meio] == item_procurado:
return meio # Retorna índice encontrado
# Se item procurado é menor, busca na metade esquerda
elif lista_ordenada[meio] > item_procurado:
fim = meio - 1
# Se item procurado é maior, busca na metade direita
else:
inicio = meio + 1
# Item não foi encontrado
return -1
# Teste do algoritmo
numeros = [1, 3, 5, 7, 9, 11, 13, 15, 17, 19]
posicao = busca_binaria(numeros, 7)
print(f"Número 7 encontrado na posição: {posicao}")
Perguntas Frequentes (FAQ)
1. Como fazer comentários em Python?
Use #
para comentários de linha única. Para múltiplas linhas, use #
em cada linha ou strings triplas.
2. O que são docstrings em Python?
Docstrings são strings de documentação usando aspas triplas que descrevem módulos, classes e funções.
3. Qual diferença entre # e docstring?
#
cria comentários simples ignorados pelo Python. Docstrings são acessíveis via __doc__
e usadas por ferramentas.
4. Como acessar docstrings programaticamente?
Use funcao.__doc__
ou help(funcao)
para visualizar docstrings. Também funcionam para classes e módulos.
5. Devo comentar código óbvio?
Não. Comente o “porquê”, não o “o quê”. Explique lógica complexa, decisões e algoritmos, não código óbvio.
6. Como fazer comentários TODO em Python?
Use # TODO:
, # FIXME:
, # XXX:
ou # HACK:
seguido da descrição para marcar pontos de atenção no código.
7. Existe limite de caracteres para comentários?
Não há limite técnico, mas recomenda-se até 79 caracteres por linha seguindo PEP 8 para boa legibilidade.
8. Como comentar múltiplas linhas rapidamente?
Na maioria dos editores, selecione as linhas e use Ctrl+/ (Windows/Linux) ou Cmd+/ (Mac) para comentar/descomentar.
9. Comentários afetam performance do Python?
Não. Comentários são removidos durante parsing e não afetam performance de execução do código Python.
10. Como seguir padrões de docstring?
Siga PEP 257 e escolha um estilo (Google, NumPy ou Sphinx). Mantenha consistência no projeto todo.
Conclusão
Os comentários em Python são uma ferramenta essencial para criar código profissional e manutenível. Eles não apenas ajudam outros desenvolvedores a entenderem seu código, mas também facilitam sua própria vida quando você precisar revisitar projetos antigos.
Principais pontos que aprendemos:
- Como usar
#
para comentários simples e inline - A importância das docstrings para documentação formal
- Diferentes estilos de documentação (Google, NumPy, Sphinx)
- Boas práticas: comentar o “porquê”, não o “o quê”
- Quando evitar comentários desnecessários
Lembre-se: comentários de qualidade são um investimento no futuro. Eles economizam tempo, reduzem erros e tornam a colaboração em equipe muito mais eficiente.
Próximos passos: Continue aprendendo sobre boas práticas de programação Python, explore ferramentas de documentação automatizada como Sphinx, e sempre mantenha seus comentários atualizados junto com o código!