quinta-feira, 3 de dezembro de 2020

Diferenças importantes entre Python 2 e Python 3 com exemplos

  • Operador de divisão
  • função print
  • Unicode
  • xrange
  • Manipulação de erros
  • módulo _future_

Operador de divisão

Se estivermos portando nosso código ou executando o código python 3.x em python 2.x, pode ser perigoso se as alterações na divisão inteira passarem despercebidas (já que não gera nenhum erro). É preferível usar o um valor de ponto flutuante (como 7.0/5 ou 7/5.0) para obter o resultado esperado ao portar nosso código.

print 7 / 5 
  
print -7 / 5     

Saída:

Saída em Python 2.x  
  
1  
  
-2  
  
Saída em Python 3.x :  
  
1.4  
  
-1.4  

# Consulte o link abaixo para obter detalhes  
# https://www.geeksforgeeks.org/division-operator-in-python/  

função print

Esta é a mudança mais conhecida. Nesse caso, a palavra-chave print no Python 2.x é substituída pela função print() no Python 3.x. No entanto, os parênteses funcionam no Python 2 se um espaço for adicionado após a palavra-chave print porque o interpretador o avalia como uma expressão.

print 'Olá, Geeks'      # Python 3.x não suporta
  
print('Espero que você goste desses fatos')

Saída:

Saída em Python 2.x :  
  
Olá, Geeks  
  
Espero que você goste desses fatos  
  
Saída em Python 3.x :  
  
File "a.py", line 1  
  
    print 'Olá, Geeks'  
  
                       ^  
  
SyntaxError: invalid syntax  

Consulte o link abaixo para obter detalhes
https://www.geeksforgeeks.org/g-fact-25-print-single-multiple-variable-python/  

Como podemos ver, se usarmos parênteses em python 2.x, não haverá problema, mas se não usarmos parênteses em python 3.x, obteremos SyntaxError.

Unicode

No Python 2, o tipo de string implícito é ASCII. Mas no Python 3.x o tipo de string implícito é Unicode.

print(type('default string '))  
  
print(type(b'string with b '))  

Saída:

Saída em Python 2.x (Bytes é o mesmo que str)  
  
<type 'str'>
  
<type 'str'>

Output in Python 3.x (Bytes e str são diferentes)  
  
<class 'str'>
  
<class 'bytes'>

Python 2.x também oferece suporte a Unicode

print(type('string padrão'))  
  
print(type(u'string com b '))

Saída:

  
Saída em Python 2.x (Unicode e str são diferentes)  
  
<type 'str'>  
  
<type 'unicode'>  

Saída em Python 3.x (Unicode e str são o mesmo)  
  
<class 'str'>
  
<class 'str'>>

xrange

xrange() do Python 2.x não existe no Python 3.x. No Python 2.x, range retorna uma lista, ou seja, range(3) retorna [0, 1, 2] enquanto xrange retorna um objeto xrange i. e., xrange(3) retorna um objeto iterador que funciona de forma semelhante ao iterador Java e gera um número quando necessário.

Se precisarmos iterar na mesma sequência várias vezes, preferimos range(), pois range fornece uma lista estática. xrange() reconstrói a sequência todas as vezes. xrange() não oferece suporte a fatias e outros métodos de lista. A vantagem de xrange() é que ele economiza memória quando a tarefa é iterar em um grande intervalo.

No Python 3.x, a função range agora faz o que xrange faz no Python 2.x, então, para manter nosso código portátil, podemos preferir usar range. Portanto, a função de intervalo do Python 3.x é xrange do Python 2.x.

for x in xrange(1, 5):  
  
    print(x),  

for x in range(1, 5):  
  
    print(x),

Saída:

Saída em Python 2.x  
  
1 2 3 4 1 2 3 4  

Saída em Python 3.x  
  
NameError: name 'xrange' is not defined

Manipulação de erros

Há uma pequena mudança no tratamento de erros em ambas as versões. No python 3.x, a palavra-chave "as" é necessária.

try:  
  
    trying_to_check_error  
  
except NameError, err:  
  
    print err, 'Error Caused'   # Não funcionaria em Python 3.x

Saída:

Saída em Python 2.x:  
  
name 'trying_to_check_error' is not defined Error Caused  

Saída em Python 3.x :  
  
File "a.py", line 3  
  
    except NameError, err:  
  
                    ^  
  
SyntaxError: invalid syntax  
try:  
  
     trying_to_check_error  
  
except NameError as err: # 'as' é necessário em python 3.x  
  
     print (err, 'Error Caused')

Saída:

Saída em Python 2.x:
  
(NameError("name 'trying_to_check_error' is not defined",), 'Error Caused')  

Saída em Python 3.x :

name 'trying_to_check_error' is not defined Error Caused

Módulo __future__

Basicamente, isso não é uma diferença entre as duas versões, mas é útil mencionar aqui. A ideia do módulo __future__ é ajudar a migrar para o Python 3.x.

Se estamos planejando ter suporte para Python 3.x em nosso código 2.x, podemos usar importe _future_ em nosso código.

Por exemplo, no código Python 2.x abaixo, usamos o comportamento de divisão de inteiro do Python 3.x usando o módulo __future__.

# No código python 2.x abaixo, a divisão funciona
# assim como em Python 3.x porque usamos __future__  
  
from __future__ import division  

print 7 / 5 
  
print -7 / 5 

Saída:

1.4
-1.4

Outro exemplo em que usamos colchetes no Python 2.x usando o módulo __future__:

from __future__ import print_function      

print('Acervo Lima')  

Saída:

Acervo Lima

Consulte isso para obter mais detalhes do módulo __future__.

Traduzido por Acervo Lima de Important differences between Python 2.x and Python 3.x with examples
Artigo escrito por priteshkanani, lalitshankarch

0 comentários:

Postar um comentário