/ #História #Linguagens de programação 

Evolução da Linguagem: o porquê de Python 2 e Python 3

Ao conferir a seção de downloads do site oficial da linguagem de programação Python, você logo se depara com duas opções disponíveis: Python 2 e Python 3. Neste artigo, irei te explicar a razão pela qual te apresentam essas duas versões da linguagem e também vou abordar algumas diferenças entre elas.

Após desenvolver e lançar um software é necessário realizar a sua manutenção. Manutenção é uma fase do processo de desenvolvimento de software em que são realizadas correções e melhorias de uso. Você deve estar acostumado a observar este processo como usuário, pois frequentemente temos que atualizar algum programa de computador ou aplicativo de celular. Na verdade, a maior parte do ciclo de vida de um bom programa é a fase de manutenção, pois isso significa que ele continua em uso por bastante tempo e, naturalmente, é preciso ajustá-lo às necessidades de seus usuários com periódicas modificações. Um programa sem manutenção acaba caindo em desuso e, por outro lado, um programa que ninguém usa não tem porque receber investimentos em manutenção.

Uma linguagem de programação também está constantemente evoluindo. As mudanças mais aparentes podem demorar um pouco a serem notadas, pois geralmente percebemos a adição de novas funcionalidades, mudanças no nome ou mudanças no uso de funções e componentes da biblioteca padrão da linguagem. Assim, as constantes correções de vulnerabilidades, otimizações de desempenho e outras melhorias internas ao funcionamento da linguagem e que estão constantemente sendo implementadas não são tão percebidas.

Se você olhar a lista de downloads disponíveis da linguagem Python (Figura 1), vai perceber que as versões são especificadas por 3 números separados por pontos. O primeiro número indica a versão principal e os demais, versão secundária e terciária, respectivamente. Existem alguns padrões para se realizar versionamento de software, mas esse não é o objeto deste artigo, o que você deve entender é que se a versão principal muda, é porque ocorreram mudanças maiores, mais significativas.

Terminal de comando mostrando o resultado do mv
Figura 1: Relação (incompleta) de versões disponíveis para download em python.org


Evolução da Linguagem

Com o tempo e maturidade de uma linguagem, verifica-se a necessidade de serem realizadas mudanças mais estruturais, correções ligadas às decisões de projeto da linguagem e que podem até não ser compatíveis com a estrutura adotada na versão corrente. É geralmente neste ponto que nasce uma nova versão principal como Python 3.

Mas pera aí…então existiu “Python 1”? Sim! A linguagem de programação Python teve sua primeira implementação disponibilizada em 1991, embora a versão Python 1.0 tenha sido disponibilizada apenas em 1994. Python 2.0, por sua vez, surgiu no ano 2000. Oito anos depois, em 2008, da necessidade de modernizar a linguagem de uma forma que nem tudo seria compatível com a versão anterior, surge Python 3.


Ok, mas se Python 3 lançou em 2008, por que ainda posso baixar Python 2 no site oficial?

Como há muitos programas escritos em Python 2, a transição não pode ocorrer de uma hora para a outra. Em 2011, quando eu comecei a programar em Python, já havia a opção de trabalhar com Python 3. Contudo, muitos pacotes que eu precisaria utilizar para executar diversas tarefas não tinham versões atualizadas em Python 3 ainda. É necessário que as pessoas tenham tempo de atualizar seus programas e que os principais pacotes desenvolvidos e mantidos em Python 2 disponibilizem versões atualizadas em Python 3. Hoje, em 2017, já temos uma grande quantidade de pacotes atualizados para Python 3 e, por conta disso, considero que é mais importante que você aprenda Python 3 e depois, se for necessário, aprenda as diferenças de Python 2. Portar um código bem escrito em Python 2 para Python 3 não será uma tarefa tão complicada se você souber bem Python 3.

A título de conhecimento, a partir de 2020, não mais haverá manutenção em Python 2.


Tá, mas o que é que tem de diferente?

Algumas das diferenças entre as duas versões da linguagem são difíceis de serem notadas por quem não tem muito conhecimento de programação e de termos técnicos de computação. Por exemplo, o recurso de function annotations foi uma das novidade que eu achei muito interessante, mas acho difícil alguém valorizá-lo sem a experiência, por exemplo, de lidar com software sem documentação ou saber avaliar vantagens e desvantagens de tipagem estática ou dinâmica. Contudo, selecionei 5 exemplos que podem ser notados e facilmente compreendidos por alguém sem muita experiência.


1. Divisão entre números inteiros

Em Python 3, a divisão (operador /) entre dois números inteiros resulta em um número fracionário, tal como vemos na calculadora. Se quisermos saber o resultado da divisão inteira entre 2 números, devemos usar o operador // para o quociente e % para o resto.

>>>7/10
0.7

Já em Python 2, a divisão entre dois números inteiros, por padrão, resulta apenas no quociente da operação.

>>> 7/10
0

Para obtermos o mesmo comportamento apresentado em Python 3, é necessário adicionar a seguinte linha no início do arquivo:

from __future__ import division 

Estranho né? Uma outra forma de realizar a divisão exata é forçar que um dos operandos não seja inteiro, por exemplo, escrevendo 7.0 ao invés de 7 ou multiplicando um dos operandos por 1.0 antes da divisão, caso os valores estejam representados por variáveis. Contudo, este tipo de solução não é robusta e pode gerar bugs facilmente em um programa.


2. Comportamento e uso de print

Em Python 3, print é uma função e comporta-se como tal. Sua notação requer o uso de parênteses onde são inseridos os argumentos necessários para execução.

>>> Print("Olá Mundo") 
Olá Mundo 

Em Python 2, print não era tratado como função, mas como uma instrução especial da linguagem. Uma parte da implicação desta mudança é interna ao funcionamento e organização da linguagem, contudo essa diferença se reflete na sintaxe de uso do print, que podia ser feito sem parênteses, por exemplo:

>>>Print "Olá Mundo" 
Olá Mundo 

Embora o uso de parênteses não seja prejudicial em Python 2, se você esquecê-los em Python 3, receberá um erro de sintaxe.


3. Texto em formato unicode por padrão

Essa é uma diferença um pouco mais técnica, mas que é muito sentida, principalmente por nós que somos de um país cuja língua não é o inglês. Há vários padrões para se representar caracteres em um computador. Em Python 2, o tipo string, utilizado para representar texto, era codificado segundo a especificação ASCII (American Standard Code for Information Interchange) ou Código Padrão Americano para Troca de Informações. Se você observar a tabela ASCII, perceberá que ela não possui, por exemplo, representação de letras acentuadas (tipo é, ô, a…). Para representar caracteres de sistemas de escrita como o nosso ou mesmo os orientais, precisamos de um sistema de codificação mais abrangente como o Unicode e em Python 2 era necessário indicar o uso de unicode explicitamente. Em Python 3, temos unicode como a codificação padrão dos caracteres. Programas que manipulam textos em português, por exemplo, podem usufluir desse fato.

Python 3 também passou a aceitar caracteres Unicode em nomes de identificadores. Em Python 2, se tentássemos nomear uma variável utilizando acentos, receberíamos uma mensagem de erro:

>>>número = 14
File "<stdin>", line 1
número = 14
 ^
SyntaxError: invalid syntax 

Já em Python 3, isso não é um problema — embora eu não recomende essa prática:

>>> número = 14
>>> print(número)
14


4. Comparações quando não há ordem bem definida

Em Python 2, era válido realizar operações de comparação entre valores que não tinham uma ordem definida entre si, apenas recebia-se um False como resposta:

# Python 2
>>> 7 > 'a'
False 

Em Python 3, esse comportamento foi modificado de modo que expressões como a do exemplo acima não são mais válidas. Recebemos uma mensagem de erro ao tentar executar alguma operação como essa:

# Python 3 
>>> 7 > 'a' 
Traceback (most recent call last): 
 File "<stdin>", line 1, in <module> 
TypeError: '>' not supported between instances of 'int' and 'str' 


5. Comportamento da funçao Input

Em Python 2, a função input era capaz de ler outros tipos de dados além da string. Observe:

>>> num = input('Digite um número: ") 
Digite um número: 7 
>>> type(num) 
<type 'int'> 

Em Python 3, a função input retorna o valor lido sempre como uma string:

>>> num = input('Digite um número: ") 
Digite um número: 7 
>>> type(num) 
<class 'str'> 

Na verdade, o que a função input faz em Python 2 é avaliar e executar a expressão digitada como entrada, o que pode ser perigoso, pois da poder a um usuário mal intencionado de executar trechos de código que podem causar efeitos indesejados, como por exemplo deletar um arquivo importante. Para se obter em Python 2 o mesmo comportamento observado com a função input em Python 3, é necessário utilizar a função raw_input.


##Conclusão

“Python 2.x é legado, Python 3 é o presente e futuro da linguagem”

Essa é a resposta curta disponível em python.org e com a qual eu concordo. Fique à vontade para compartilhar sua experiência, seu ponto de vista ou expor suas dúvidas!

Author

Hallison Paz

Sonhador | Engenheiro de computação - pretende explorar outros corpos celestes