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


resposta 1:

A partir de agora, o mundo Python é basicamente dividido em duas facções, uma que ainda está trabalhando no Python 2.7 e uma que começou a migrar para 3.x ou começou a usar 3.x sem nenhum conhecimento ou experiência em 2.7

De qualquer forma, o Python 2.7 não será suportado no futuro e em breve ficará desatualizado. Contagem regressiva do Python 2.7

Portanto, a questão de saber quais são as diferenças entre 3.xe 2.7 é uma pergunta incômoda, porque, diferentemente de outras atualizações, o Python 3.x não apenas possui novos recursos, mas também a filosofia e o design embutidos. E seria melhor chamar o Python 3.x como uma linguagem Python amadurecida, em vez de apenas uma atualização do 2.7

A seguir, estão algumas diferenças importantes em 2.7 e 3.x

  1. Manipulação de str e unicode:

No python 2.7, existem cadeias normais, cadeias de bytes e cadeias unicode. Mas, na verdade, bytes e normal são essencialmente a mesma coisa no python 2.7.

my_str = 'exemplo'
byte_str = b'example '
uni_str = u'example '
print (type (my_str) # Saídas 
print (type (byte_str) # Saídas 
print (type (uni_str) # Saídas 

Não há nada como o tipo bytes ou, em outras palavras, a string normal se comporta como o tipo codificado com apenas caracteres ascii. Exemplo (Python 2.7)

>>> my_str = 'für' # char especial trema, não um char ascii
>>> my_str
'f \ xfcr'
>>> impressão (my_str)
pele

No exemplo acima, o caractere não ascii em my_str é alterado para ascii char em segundo plano, mas print (my_str) imprimiu a sequência correta. Isso está acontecendo porque internamente python2.7 está codificando o my_str. Portanto, você não pode chamar um método de codificação em my_str ou python2.7 str. Mas, decodificação pode ser chamada, pois já é codificada por python.

my_str.encode ('latin-1')
Gera UnicodeDecodeError, porque my_str já está codificado.

my_str.decode ('latin-1') # retorna uma string unicode.

Mas no python 3.x, o unicode é chamado como string (tipo str) e os bytes são do tipo byte. Isso significa que todas as strings, por padrão, são strings unicode e não existe uma string normal. Somente unicode e bytes são os tipos de string no python 3.

my_str = 'exemplo'
byte_str = b'example '
uni_str = u'example '
print (type (my_str) # Saídas 
print (type (byte_str) # Saídas 
print (type (uni_str) # Saídas 

Isso significa que, por padrão, você pode digitar ou manter qualquer caractere não ascii também com o tipo str / unicode. Ao contrário do python2.7, o python3.x não codifica uma sequência internamente e trata o caractere conforme o estilo unicode. Por exemplo

>>> my_str = 'für' # char especial trema, não um char ascii
>>> my_str
'pele'
>>> impressão (my_str)
pele

>>> b'für '# tentando ter uma string de bytes com caracteres não ascii.
Gera erro, dizendo que bytes só podem conter caracteres ASCII.

Mas você pode decodificá-lo ou convertê-lo tipicamente, fornecendo o esquema de codificação

>>> s1 = bytes (minha_str, 'utf-8')
>>> s2 = my_str.encode ('utf-8')
>>> s1
b'f \ xfcr '
>>> s2
b'f \ xfcr '
# Mesmo resultado

>>> s1.decode ('utf-8')
'für' # unicode string

2. Quase tudo é gerador no Python 3.x

A maior e mais importante mudança no Python 3.x, em comparação com o python 2.7, é que tudo se tornou gerador. Os geradores em Python estão tendo uma vantagem da utilização eficaz da memória. Por que desperdiçar memória com n itens, quando você pode obter um item por vez.

No python2.7, existe o método range e xrange, em que xrange é um gerador e range fornece uma lista de itens.

>>> intervalo (5)
[1, 2, 3, 4, 5]

>>> xrange (5)
xrange (5) # um objeto iterador, gerando um número por vez quando necessário

No Python 3.x, não há xrange, o próprio intervalo se comporta como o xrange do Python 2.7

Da mesma forma, qualquer chamada ou objeto que estava retornando uma lista de itens no python2.7 é substituído por um objeto gerador no Python 3.x

Exemplos

Python 2.7
>>> intervalo (5)
[1, 2, 3, 4, 5]

Python 3.x
>>> intervalo (5)
objeto gerador do intervalo (5) #


Python 2.7
>>> zip ([1,2,3], [4,5,6])
[(1, 4), (2, 5), (3, 6)]

Python 3.x
>>> zip ([1,2,3], [4,5,6])
objeto zip # objeto gerador de zip


Python 2.7
>>> mapa (lambda x: x * x, [1,2,3,4,5])
[1, 4, 9, 16, 25]

Python 3.x
>>> mapa (lambda x: x * x, [1,2,3,4,5])
objeto de mapa # objeto de gerador de mapa


Python 2.7
>>> d1 = {'a': 1, 'b': 2, 'c': 3}
>>> d1.items ()
[('a', 1), ('b', 2), ('c', 3)]

Python 3.x
>>> d1 = {'a': 1, 'b': 2, 'c': 3}
>>> d1.items ()
objeto dict_items # objeto gerador dict_items
# objetos semelhantes para d1.values ​​() e d1.keys () também

Esses e quase todos os tipos de funcionalidade que estavam retornando uma lista no Python2.7 agora retornarão o objeto gerador no Python 3.6

Além disso, diferentemente do Python 2.7, que contém itens no dicionário de maneira não ordenada, o dicionário Python 3.6 mantém valor na forma ordenada.

3. Definindo funções com o tipo de dados do parâmetro esperado e retornando o tipo de dados no Python 3.x

def myfunc (num: int) -> int:
passar

Essas convenções não digitam fortemente seu valor, é apenas uma convenção para mostrar que ele espera um tipo de dados específico, mas qualquer outro valor não gera nenhum erro / exceção.

Mais sobre esse ponto pode ser encontrado em minha outra resposta na resposta de Vivek Keshore para Como faço para escrever o parâmetro de função de tipo forte no Python 3?

4. Vazamento de namespace global no Python2.7

Vamos entender o vazamento global de namespace com um exemplo.

>>> i = 10
>>> imprimir i
10
>>> l1 = [i para i no intervalo (5)]
>>> imprimir l1
>>> [0, 1, 2, 3, 4]
>>> i
4

No exemplo acima, você pode observar que a variável global 'i' é alterada dentro do contexto local de compreensão da lista, o que idealmente não deve acontecer.

Enquanto no Python 3.x, o vazamento de namespace global não ocorre. A variável com o mesmo nome no contexto local não terá nenhum efeito na variável global de mesmo nome.

>>> i = 10
>>> imprimir i
10
>>> l1 = [i para i no intervalo (5)]
>>> imprimir l1
>>> [0, 1, 2, 3, 4]
>>> i
10

Além de todas essas alterações, existem algumas pequenas alterações, como

  • print statement (2.7) e print () method (3.x) input () & raw_input () em 2.7 e only input () em 3.xresult of division '/' operador em 2.7 e 3.xuse de 'as' while manipulação de exceção em 3.6, como exceto ValueError como arredondamento do erBanker em 3.x, ao contrário de 2.7, por exemplo, em 2.7 round (14.5) -> 15 e round (15.5) -> 16, mas no python 3.x round (14.5) —-> 15 e também redondo (15.5) —-> 15

resposta 2:

Para saber mais sobre a diferença entre o Python 3 e o Python 2.7, você pode visitar o Servidor Wiki da Python Software Foundation, uma vez que se aprofunda nas diferenças entre o Python 2.7 e o 3.3, dizendo que há benefícios para cada um. Realmente depende do que você está tentando alcançar. Mas, em suma: “Python 2.x é legado, Python 3.x é o presente e o futuro da linguagem.”

Existem diferenças sutis entre os dois. Mas a maior diferença é a declaração impressa.

O QUE É DIFERENTE SOBRE A DECLARAÇÃO DE IMPRESSÃO

Retirado de uma discussão sobre Stack Overflow,

“A mais visível (diferença) é provavelmente a maneira como a instrução“ print ”funciona. É diferente o suficiente para que o mesmo script não possa ser executado nas duas versões ao mesmo tempo, mas escolha uma e você ficará bem. ”Você pode aprender mais sobre isso ingressando em uma boa escola de programação chamada Holberton School e saber mais sobre versões do Python e outras importantes linguagens de programação. “A principal vantagem do 3.x é que ele está na vanguarda, portanto todos os novos recursos serão implementados lá, em vez de serem adicionados ao 2.x. A outra coisa que você pode querer considerar é que é o python comum do futuro; portanto, olhando alguns anos depois, esse será o ramo maduro para o qual as pessoas vão. ”


resposta 3:

Para saber mais sobre a diferença entre o Python 3 e o Python 2.7, você pode visitar o Servidor Wiki da Python Software Foundation, uma vez que se aprofunda nas diferenças entre o Python 2.7 e o 3.3, dizendo que há benefícios para cada um. Realmente depende do que você está tentando alcançar. Mas, em suma: “Python 2.x é legado, Python 3.x é o presente e o futuro da linguagem.”

Existem diferenças sutis entre os dois. Mas a maior diferença é a declaração impressa.

O QUE É DIFERENTE SOBRE A DECLARAÇÃO DE IMPRESSÃO

Retirado de uma discussão sobre Stack Overflow,

“A mais visível (diferença) é provavelmente a maneira como a instrução“ print ”funciona. É diferente o suficiente para que o mesmo script não possa ser executado nas duas versões ao mesmo tempo, mas escolha uma e você ficará bem. ”Você pode aprender mais sobre isso ingressando em uma boa escola de programação chamada Holberton School e saber mais sobre versões do Python e outras importantes linguagens de programação. “A principal vantagem do 3.x é que ele está na vanguarda, portanto todos os novos recursos serão implementados lá, em vez de serem adicionados ao 2.x. A outra coisa que você pode querer considerar é que é o python comum do futuro; portanto, olhando alguns anos depois, esse será o ramo maduro para o qual as pessoas vão. ”