O que mudou no Python 3?

Uma das primeiras coisas que alguém que vai testar o Python 3.x ao invés do Python 2.x percebe é a mudança do print(), que deixou de ser um comando e passou a ser uma função. O primeiro impacto disso é que o tradicional “Hello, world!” muda. O “Hello World” com Python 3 fica:

print("Hello, world!")

Muita gente, quando pensa em mudar pro Python 3, já lembra de cara dessa diferença. Mas, existem várias outras mudanças que são bem importantes. Vou listar aqui as que considero que vão ter maior impacto na maioria dos programadores.

Operador de divisão inteira

A partir do Python 3, 3/2 resulta em 1.5, e não mais em 1. Ou seja, o operador / não é mais dependente dos tipos dos operados. No Python 2.x, o resultado de uma divisão de dois números inteiros era também um número inteiro, arredondado para baixo, sempre.

O operador // foi inserido no Python 3 para representar a divisão inteira. Assim, podemos ver alguns exemplos abaixo:

>>> 3 / 2
1.5
>>> 3 // 2
1
>>> -3 // 2
-2

(se você ficou confuso com o resultado da última expressão, clique aqui e entenda o porquê)

Assim, programas Python 2.x que dependiam do arredondamento do operador /, não irão mais funcionar corretamente na versão 3.x. Fique de olho!

True, False agora são palavras reservadas (finalmente!)

Em Python 2.x, era possível fazermos coisas bizarras como:

>>> True = "Hello"
>>> False = "Hello"
>>> True == False
True

Ou então, tão estranho quanto:

>>> False = True
>>> True == False
True

Felizmente, em Python 3 isso não é mais possível. Veja uma tentativa:

>>> True = "Hello"
SyntaxError: assignment to keyword

xrange() se foi

A função xrange() deixou de existir no Python 3. Lembra que, no Python 2, range() retornava uma lista e xrange() retornava um objeto iterável? O impacto disso era que, para grandes sequências numéricas, xrange() acabava sendo mais eficiente do que range(), pois usava muito menos espaço em memória para gerar a sequência (leia mais aqui).

No Python 3, só existe a função range(), que retorna uma espécie de iterável (assim como xrange() fazia).

map, filter e zip também mudaram

As funções map, filter e zip, assim como range(), também retornavam uma lista com os valores de resultado. A partir do Python 3, elas passaram a retornar objetos iteráveis, ao invés de gerar listas enormes em memória. Isso impacta bastante em código Python 2.x, visto que coisas simples deixam de funcionar, como o exemplo abaixo:

>>> len(map(lambda x: x*x, [1, 2, 3]))
TypeError: object of type 'map' has no len()

Isso pode ser corrigido com uma “conversão” do iterável retornado pelo map() para lista:

>>> len(list(map(lambda x: x*x, [1,2,3])))
3

E o mesmo vale para as funções zip e filter também. Ah, outra mudança forte é que a função reduce() foi “rebaixada” para o módulo functools, deixando de ser uma função global do Python.

has_key não existe mais nos dicionários

Em Python 2.x, era comum verificar se um determinado elemento já era chave em um dicionário usando o método has_key():

>>> d = {'nome': 'jose', 'idade': 18}
>>> d.has_key('nome')
True
>>> d.has_key('email')
False

Em Python 3.x, para fazer a mesma verificação, usamos o operador in:

>>> 'nome' in d
True
>>> 'email' in d
False

Ainda falando sobre dicionários, os métodos que em Python 2.x retornavam listas, agora retornam espécies de iteráveis (na verdade, são views dinâmicas, sobre as quais pretendo falar em um próximo post).

Toda string é unicode

Em Python 3.x, só existe um tipo de String: as strings unicode. Assim, não é mais preciso especificar em uma string literal que ela é do tipo unicode. Em Python 2.x, um literal unicode era declarado como:

>>> string_unicode = u"olá mundo"

(repare no ‘u’ precedendo o literal)

Em Python 3.x, isso não é preciso, pois toda string é unicode:

>>> string_unicode = "olá mundo"

Agora só existe input()

Em Python 2.x, existiam duas funções para fazer a leitura de valores do teclado: input() e raw_input(). A primeira lia valores numéricos e a segunda lia strings.

Em Python 3.x, só existe uma função: input(). Ela lê uma string do teclado, que então pode ser convertida para o tipo apropriado. Por exemplo, para ler um valor numérico inteiro:

>>> idade = int(input('Digite sua idade:'))
Digite sua idade:10
>>> type(idade)
builtins.int

Por fim…

Além das modificações apresentadas acima, foram feitas inúmeras outras, principalmente na reestruturação de bibliotecas, deixando-as com interfaces mais consistentes. Até agora, achei muito interessantes as alterações feitas da versão 2 para a 3, pois elas deixaram tudo mais Pythônico e consistente.

Para portar aquele seu programa escrito usando Python 2 para Python 3, foi criada uma ferramenta bem interessante chamada de 2to3, que pega seu código legado e o transforma em código compatível com a versão 3 da linguagem.

Por exemplo, o programa hello.py:

print "hello, world!"

Pode ser convertido usando o 2to3:

$ 2to3 -w hello.py

O resultado é o programa hello.py, agora pronto pra versão 3:

print("hello, world!")

😀

Leia mais

10 comentários sobre “O que mudou no Python 3?

  1. Bem legal… no meu curso eles usam o python 2.7 e em casa eu uso o 3.3 e sempre que eu trazia o código ele não executava aqui. Eu já sabia dos () no print, mas não sabia que tinha que especificar o tipo do ‘input’ e isso era o que estava dando errado. Muito obrigado, seu texto ajudou muito !!

  2. Texto extremamente útil! Já sabia de algumas mudanças, mas nem todas eu conhecia.

    Mas legal mesmo foi o True e False, e eu nunca tinha tentado definir uma variável com algum desses dois nomes (talvez por estar acostumado a linguagem C, que implica várias regras =D )

  3. Parece que houve pequena alteração no nome dos módulos estava testando o Tkinter
    2.x >>> from Tkinter import *
    3.x >>> from tkinter import *
    t minúsculo

  4. Pingback: Programar em Python | DL-UAT
  5. Pingback: Referência complementar de Python | Prof. Franklin Marquezino
  6. Pingback: Como migrar seu código para PY3 – programadorlivre.com

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s