Python é uma linguagem de programação altamente versátil e interpretada, de alto nível, de uso geral. Foi criada por Guido van Rossum e lançada pela primeira vez em 1991. A filosofia de design de Python enfatiza a legibilidade do código e a facilidade de utilização. Desde então, Python tem crescido em popularidade e é uma excelente escolha em scripting e desenvolvimento rápido de aplicações.

Muitas aplicações antigas ainda são escritas em Python 2. As empresas que enfrentam uma migração para Python 3 requerem o conhecimento das diferenças tanto na sintaxe como no comportamento. O objectivo deste artigo é delinear as diferenças entre Python 2 e Python 3. Com exemplos, verá como as funções têm o mesmo aspecto sintáctico numa versão mas comportam-se completamente diferentes noutra versão.

Versão Python Mais Utilizada

A versão mais recente de Python é 3.7 foi lançada em 2018. A próxima versão 3.8 está actualmente em desenvolvimento e será lançada em 2024. Embora Python 2.7 ainda seja amplamente utilizado. A adopção do Python 3 está a crescer rapidamente. Em 2016, 71,9% dos projectos utilizaram Python 2.7, mas em 2017, tinha caído para 63,7%.

Que Versão Devo Utilizar?

Dependente das suas necessidades e do que pretende fazer, escolha a versão que mais o ajudará. Se consegue fazer exactamente o que quer com Python 3.x, então óptimo! No entanto, existem algumas desvantagens tais como:

  • Suporte de biblioteca ligeiramente pior
  • algumas distribuições actuais de Linux e Macs ainda usam 2.x como padrão

desde que Python 3.x esteja instalado nos computadores dos seus utilizadores (o que na maioria dos casos se deve ao facto de a maioria das pessoas que lêem isto estarem a desenvolver algo para si próprias ou num ambiente que controlam) e esteja a escrever coisas em que não sabe que nenhum dos módulos Python 2.x é necessário, é uma excelente escolha. Também a maioria das distribuições Linux já tem o Python 3.x instalado e quase todas têm-no disponível para os utilizadores finais. Uma advertência pode ser se o Red Hat Enterprise Linux (através da versão 7) onde o Python 3 existe no repositório EPEL, mas alguns utilizadores podem não ser autorizados a instalar nada a partir de localizações adicionais ou não seguras. Também algumas distribuições estão a eliminar o Python 2 como a sua antiga instalação padrão.

Os instrutores devem introduzir o Python 3 a novos programadores, mas discutindo as diferenças em Python 2.

Evite iniciar qualquer novo desenvolvimento em Python 2 porque a partir de Janeiro de 2020, Python 2 será EOL (“End of Life”), o que significa que todo o suporte oficial cessará.

Qual é a diferença entre Python 2 e 3?

A principal diferença é que algumas coisas terão de ser importadas de locais diferentes a fim de lidar com o facto de terem nomes diferentes em Python 2 e Python 3. Consequentemente, o pacote de seis compatibilidades é uma utilidade chave para suportar Python 2 e Python 3 numa única base de código.

Discutiremos as principais diferenças em cada secção deste artigo e daremos exemplos de imagens de consola tanto em Python 2 como em Python 3.

Bibliotecas: Python 2 vs Python 3

Do ponto de vista da biblioteca, as bibliotecas são extremamente diferentes em Python 2 vs Python 3. Muitas bibliotecas desenvolvidas para Python 2 não são compatíveis em Python 3. Os criadores das bibliotecas usadas em Python 3 têm bons padrões e têm melhorado as bibliotecas Machine Learning e Deep Learning.

Integer Division em Python 2 e 3

Integer division is the division of two numbers less the fractional part. Em Python 2, obtém-se exactamente o que a divisão de números inteiros foi definida para fazer.

Exemplo 1. Divisão Inteira em Python 2.

Na imagem de ecrã da consola abaixo, vê-se a divisão de dois números inteiros. O resultado em Python 2 é também um número inteiro. Falta a parte fracionada.

Exemplo 2. Divisão Inteira em Python 3.

Na imagem de ecrã da consola abaixo, vê-se a divisão de dois inteiros em Python 3. O resultado é um número de ponto flutuante que inclui a parte fracional que falta em Python 2.

Se a parte fracional for necessária em Python 2, pode especificar um dos números inteiros que está a dividir como um número de ponto flutuante. Dessa forma, força o resultado a ser um número de ponto flutuante.

Print Statement Syntaxes Python 2 vs 3

Em Python 2, imprimir é uma declaração que leva uma série de argumentos. Imprime os argumentos com um espaço no meio. Em Python 3, imprimir é uma função que também leva uma série de argumentos.

Exemplo 3. Imprimir declaração em Python 2

Neste exemplo, utilizamos a declaração impressa com três argumentos. Note-se que Python 2 imprime os três argumentos separados por um espaço. A seguir, utilizamos a declaração impressa com parênteses redondos em torno dos três argumentos. O resultado é um tuple de três elementos.

Exemplo 4. Função de impressão em Python 3.

Neste exemplo, utilizamos a função de impressão com três argumentos e obtemos o mesmo resultado que no Exemplo 3 com Python 2. Contudo, quando queremos imprimir o tuple, temos de rodear o tuple com outro conjunto de parênteses arredondados.

Para obter o mesmo resultado em Python 2 que em Python 3, podemos utilizar a futura directiva para orientar o compilador a utilizar uma funcionalidade disponível numa futura versão.

Exemplo 5. Futura Directiva em Python 2.

Suporte Unicode em Python 2 vs Python 3

Em Python 2 quando se abre um ficheiro de texto, a função open() retorna uma cadeia de texto ASCII. Em Python 3, a mesma função open() retorna uma cadeia de caracteres unicode. As cadeias de caracteres unicode são mais versáteis do que as cadeias ASCII. Quando se trata de armazenamento, é necessário adicionar um “u” se se quiser armazenar cadeias de caracteres ASCII como Unicode em Python 2.

Exemplo 6. Cordas em Python 2

Exemplo 7. Cordas em Python 3.

Em Python 2, há dois tipos diferentes de objectos que podem ser usados para representar uma corda. Estes são ‘str’ e ‘unicode’. Instâncias de ‘str’ são representações de bytes enquanto que com unicode, são inteiros de 16 ou 32 bits. As cadeias unicode podem ser convertidas em cadeias de bytes com a função encode().

Em Python 3, há também dois tipos diferentes de objectos que podem ser usados para representar uma cadeia de caracteres. Estes são ‘str’ e ‘bytes’. A ‘str’ corresponde ao tipo ‘unicode’ em Python 2. Pode declarar uma variável como ‘str’ e armazenar uma string nela sem a pré-fixar com um ‘u’, porque agora é padrão. O ‘bytes’ corresponde ao tipo ‘str’ em Python 2. É um formato de serialização binário representado por uma sequência de inteiros de 8 bits que é óptimo para enviar através da Internet ou para armazenar no sistema de ficheiros.

Error Handling Python 2 vs Python 3

Error handling in Python consiste em levantar excepções e fornecer manipuladores de excepções. A diferença em Python 2 vs Python 3 é principalmente sintáctica. Vejamos alguns exemplos.

Exemplo 8. Levantar erros em Python 2.

Na imagem de ecrã da consola abaixo, tentamos levantar erros em ambos os formatos e funciona.

Exemplo 9. Levantar erros em Python 3.

Na imagem da consola abaixo, levantar erros não funciona em Python 3 como funcionava em Python 2.

Com manipuladores de excepção, a sintaxe mudou ligeiramente em Python 3.

Exemplo 10. Tenta e bloco de excepção em Python 2.

Na imagem de ecrã da consola abaixo, especificamos um bloco de tentativa com um manipulador de excepções. Provocamos propositadamente um erro ao especificar um nome indefinido na ‘try’.

Exemplo 11. Bloco Try and Exception em Python 3.

Na captura de ecrã da consola abaixo, especificamos o mesmo código que o exemplo anterior em Python 2. Repare na nova sintaxe em Python 3, exigindo-nos a utilização da palavra ‘as’.

Comparando tipos não ordenáveis

Em Python 2, foi possível comparar tipos não ordenáveis como uma lista com uma string.

Exemplo 12. Comparando uma lista com uma string.

Exemplo 13. Comparando uma lista com uma string em Python 3.

Novo em Python 3, um TypeError é levantado se tentar comparar uma lista com uma string.

XRange em Python 2 vs Python 3

Em Python 2, existe a função range() e a função xrange(). A função range() irá retornar uma lista de números enquanto que a função xrange() irá retornar um objecto.

Em Python 3, existe apenas a função range() e não a função xrange(). A razão pela qual não há função xrange() é porque a função range() comporta-se como a função xrange() em Python 2. Por outras palavras, a função range() devolve o objecto range.

Exemplo 14. A função Range() e XRange() em Python 2.

Na imagem de ecrã da consola abaixo, vemos que a função range() retorna uma lista contendo 5 elementos porque passámos ‘5’ como argumento. Quando usamos xrange(), recebemos um objecto de volta em vez disso.

Exemplo 15. A função Range() em Python 3.

Como se pode ver na imagem de ecrã da consola abaixo, entrar na função range() com ‘5’ como argumento faz com que um objecto seja devolvido. Contudo, quando tentamos usar a função xrange(), vemos que Python 3 não gosta dela porque é indefinida.

Em Python 2, havia uma série de funções que retornam listas. Em Python 3, foi feita uma alteração para devolver objectos iteráveis em vez de listas. Isto inclui as seguintes funções:

  • zip()
  • map()
  • filter()
  • método .key() do dicionário
  • método .values() do dicionário
  • Dictionary’s .items() method

Future Module in Python 2 vs 3

Se estiver a planear o suporte Python 3 para o seu código Python 2 então talvez queira adicionar o módulo __future__. Por exemplo, a divisão inteira tinha mudado de Python 2 para 3 mas se quiser que o seu código Python 2 se comporte como Python 3, tudo o que tem de fazer é adicionar esta linha:

“de __futuro__ divisão de importação”

Agora no seu código Python 2, a divisão de dois inteiros resultará num número de ponto flutuante.

Exemplo 16. Importando do módulo __futuro__.

Como pode ver abaixo, quando dividimos 2 / 3, obtemos 0 que é do tipo inteiro. Mas depois de importarmos a divisão do módulo __futuro__, 2 / 3 tipo retornado número de ponto flutuante.

Há outras coisas que pode especificar para facilitar as suas futuras migrações. Elas incluem:

  • Geradores
  • Division
  • Absolute_importar
  • With_statement
  • Print_function
  • Unicode_literals

Este post foi modificado pela última vez a 6 de Junho de 2020 9:20 am

Categorias: Articles

0 comentários

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *