Voltar as Perguntas
Pergunta

Diferenças Entre Python 2 e Python 3

Resposta

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

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:

  • print sem parênteses: print "texto"
  • raw_input() em vez de input()
  • xrange() em vez de range()
  • except Erro, e: em vez de except Erro as e:
  • #!/usr/bin/env python no topo (em vez de python3)
  • 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.