Diferenças Entre Python 2 e Python 3
Quais as diferenças entre Python 2 e Python 3?
Python 3 é a versão atual e ativa da linguagem, enquanto Python 2 foi oficialmente descontinuado em 1 de janeiro de 2020. Se você está começando a programar, use Python 3 sem hesitação. Este artigo existe para ajudar quem encontra código antigo em Python 2 ou precisa entender as diferenças por contexto histórico.
Breve histórico
Python 3.0 foi lançado em dezembro de 2008, mas a transição foi lenta porque Python 3 não era compatível com Python 2. Muitas bibliotecas importantes demoraram anos para se adaptar. A Python Software Foundation manteve o Python 2 em paralelo até 2020, dando à comunidade mais de uma década para migrar.
Hoje, praticamente todas as bibliotecas relevantes suportam apenas Python 3. Não há motivo para usar Python 2 em projetos novos.
Principais diferenças
Print: função vs declaração
A mudança mais visível e que mais identifica código antigo:
# Python 2
print "Ola, mundo!"
print "Nome:", nome
# Python 3
print("Ola, mundo!")
print("Nome:", nome)
Em Python 3, print é uma função e requer parênteses. Isso também permite recursos como end e sep:
# Apenas em Python 3
print("Processando", end="... ")
print("Concluido!")
# Saida: Processando... Concluido!
print("a", "b", "c", sep=" -> ")
# Saida: a -> b -> c
Divisão inteira
# Python 2
print 5 / 2 # Resultado: 2 (divisao inteira!)
print 5.0 / 2 # Resultado: 2.5
# Python 3
print(5 / 2) # Resultado: 2.5 (divisao real)
print(5 // 2) # Resultado: 2 (divisao inteira explicita)
Em Python 2, a divisão entre dois inteiros retornava um inteiro, descartando o resto. Isso causava bugs sutis e difíceis de encontrar. Python 3 corrigiu esse comportamento, fazendo a divisão retornar um float por padrão.
Strings e Unicode
Esta é a mudança mais importante internamente:
# Python 2
texto = "Ola" # tipo str (bytes)
texto_unicode = u"Ola" # tipo unicode
# Python 3
texto = "Ola" # tipo str (unicode por padrao!)
texto_bytes = b"Ola" # tipo bytes (explicito)
Em Python 2, strings eram sequências de bytes por padrão, e caracteres especiais como acentos causavam problemas frequentes. Python 3 tornou todas as strings Unicode por padrão, resolvendo décadas de problemas com codificação de caracteres.
Para brasileiros, isso significa que acentos e caracteres especiais como “ã”, “ç” e “é” funcionam sem configuração adicional em Python 3:
# Python 3 - funciona perfeitamente
nome = "João da Conceição"
print(nome.upper()) # JOAO DA CONCEICAO
Input
# Python 2
nome = raw_input("Seu nome: ") # Retorna string
numero = input("Um numero: ") # Avalia a expressao (perigoso!)
# Python 3
nome = input("Seu nome: ") # Sempre retorna string
numero = int(input("Um numero: ")) # Converter explicitamente
Em Python 2, input() executava o que o usuário digitasse como código Python, o que era um risco de segurança. Python 3 unificou o comportamento: input() sempre retorna uma string.
Range
# Python 2
range(10) # Cria uma lista [0, 1, 2, ..., 9] na memoria
xrange(10) # Gera valores sob demanda (lazy)
# Python 3
range(10) # Gera valores sob demanda (equivalente ao xrange)
list(range(10)) # Se precisar da lista explicitamente
Python 3 tornou range() preguiçoso (lazy) por padrão, economizando memória. O xrange() não existe mais.
Exceções
# Python 2
try:
algo()
except ValueError, e: # Sintaxe antiga
print e
# Python 3
try:
algo()
except ValueError as e: # Sintaxe com 'as'
print(e)
Python 3 também introduziu encadeamento de exceções com raise ... from ...:
try:
valor = int(texto)
except ValueError as e:
raise RuntimeError("Formato invalido") from e
Dicionários
# Python 2
d = {"a": 1, "b": 2}
d.keys() # Retorna lista
d.values() # Retorna lista
d.items() # Retorna lista de tuplas
# Python 3
d = {"a": 1, "b": 2}
d.keys() # Retorna view (nao cria lista)
d.values() # Retorna view
d.items() # Retorna view
Views são mais eficientes em memória e refletem mudanças no dicionário em tempo real. Se precisar de uma lista, use list(d.keys()).
Outra mudança importante: em Python 3.7+, dicionários mantêm a ordem de inserção. Em Python 2, a ordem era arbitrária.
Type hints
Python 3.5+ introduziu type hints, que não existem em Python 2:
# Python 3
def calcular_media(notas: list[float]) -> float:
return sum(notas) / len(notas)
def buscar_usuario(id: int) -> dict | None:
# ...
pass
F-strings
Outra funcionalidade exclusiva do Python 3.6+:
# Python 2
nome = "Python"
print("Linguagem: %s" % nome)
print("Linguagem: {}".format(nome))
# Python 3.6+
nome = "Python"
print(f"Linguagem: {nome}")
print(f"2 + 2 = {2 + 2}")
Walrus operator
Python 3.8 introduziu o operador :=:
# Python 3.8+
if (n := len(dados)) > 10:
print(f"Lista grande com {n} elementos")
Como identificar código Python 2
Sinais claros de que o código é Python 2:
printsem parênteses:print "texto"raw_input()em vez deinput()xrange()em vez derange()except Erro, e:em vez deexcept Erro as e:#!/usr/bin/env pythonno topo (em vez depython3)- Uso frequente de
u"string"para Unicode
Migrando de Python 2 para 3
Se você precisa migrar código antigo, use a ferramenta 2to3:
# Ver as mudancas sugeridas
2to3 meu_script.py
# Aplicar as mudancas automaticamente
2to3 -w meu_script.py
A ferramenta 2to3 converte a maioria das diferenças sintáticas automaticamente, mas pode não cobrir diferenças semânticas mais sutis.
Conclusão
Python 3 é a versão definitiva do Python. Todas as diferenças em relação ao Python 2 foram melhorias: Unicode por padrão, divisão consistente, print como função, type hints e f-strings. Se você encontrar material didático que use Python 2, procure uma versão atualizada. Todo projeto novo deve usar Python 3, e projetos antigos em Python 2 devem ser migrados, pois não recebem mais correções de segurança desde 2020.