Muitos programadores começaram a mudar da segunda versão do Python para a terceira devido ao fato de que em breve o suporte ao Python 2 será 
descontinuado . O autor do artigo, cuja tradução publicamos, observa que a maior parte do código Python 3 que ele viu se parece com um código entre colchetes, escrito em Python 2. Segundo ele, ele mesmo peca 
algo assim . Aqui ele fornece exemplos de alguns dos ótimos recursos disponíveis apenas para quem usa o Python 3. Ele espera que esses recursos facilitem a vida de quem aprender sobre eles.

Todos os exemplos deste artigo foram escritos usando o Python 3.7. A descrição de cada recurso contém informações sobre a versão mínima do Python necessária para seu uso.
Formatar strings (3.6+)
Sem strings, é difícil escrever algo útil em qualquer linguagem de programação. Mas, para um trabalho eficaz com seqüências de caracteres, um desenvolvedor precisa de ferramentas convenientes. Tais ferramentas que permitem operar com estruturas complexas sem perder a tranqüilidade. A maioria dos desenvolvedores de Python usa o método 
format :
 user = "Jane Doe" action = "buy" log_message = 'User {} has logged in and did an action {}.'.format( user, action ) print(log_message)  
O Python 3, junto com o método 
format , suporta strings de formato (strings de 
f, strings de f). Eles são uma ferramenta flexível para executar várias manipulações de strings. Aqui está a aparência do exemplo anterior, reescrito usando cadeias de formato:
 user = "Jane Doe" action = "buy" log_message = f'User {user} has logged in and did an action {action}.' print(log_message)  
Módulo Pathlib (3.4+)
As strings de formato são uma ótima tecnologia, mas ferramentas especiais foram criadas para trabalhar com algumas linhas, como caminhos de arquivo, o que simplifica bastante a manipulação delas. O Python 3 possui um módulo 
pathlib , que é uma abstração conveniente para trabalhar com caminhos de arquivo. Se você ainda não tem certeza da utilidade deste módulo para resolver seus problemas, dê uma olhada 
neste material.
 from pathlib import Path root = Path('post_sub_folder') print(root)  
Anotações de tipo (3.5+)
Qual é o melhor - digitação estática ou dinâmica? Talvez quase todo programador tenha sua própria resposta para essa pergunta difícil. Deixo ao leitor como exatamente eles tipificam seus programas. Mas acho que é bom que todos saibam que o Python 3 suporta 
anotações de tipo .
 def sentence_has_animal(sentence: str) -> bool: return "animal" in sentence sentence_has_animal("Donald had a farm without animals")  
Transferências (3.4+)
O Python 3 suporta, graças à classe 
Enum , um mecanismo simples para trabalhar com 
enumerações . As enumerações são convenientes para armazenar listas de constantes. As constantes, caso contrário, são espalhadas aleatoriamente no código.
 from enum import Enum, auto class Monster(Enum):   ZOMBIE = auto()   WARRIOR = auto()   BEAR = auto()  print(Monster.ZOMBIE)  
Na 
documentação do Python 3, você pode descobrir que uma enumeração é uma coleção de nomes simbólicos (membros) vinculados a valores únicos e imutáveis. Os membros de uma única listagem podem ser comparados quanto à identidade. As enumerações podem ser ignoradas.
 for monster in Monster:   print(monster)  
Cache LRU embutido (3.2+)
Atualmente, os mecanismos de cache são usados em quase todos os sistemas de software e hardware. O Python 3 simplifica bastante o armazenamento em cache com o decorador 
lru_cache , que implementa o algoritmo de armazenamento em cache LRU ( 
Menos Utilizado Recentemente ).
Abaixo está uma função que calcula os números de Fibonacci. Essa função é forçada várias vezes a executar as mesmas operações durante chamadas recursivas. Como resultado, verifica-se que seu desempenho pode ser aprimorado através do cache.
 import time def fib(number: int) -> int:   if number == 0: return 0   if number == 1: return 1     return fib(number-1) + fib(number-2) start = time.time() fib(40) print(f'Duration: {time.time() - start}s')  
Agora usamos 
lru_cache para otimizar essa função (essa técnica de otimização é chamada de 
memorização ). Como resultado, o tempo de execução de uma função que foi medida anteriormente em segundos agora é medido em nanossegundos.
 from functools import lru_cache @lru_cache(maxsize=512) def fib_memoization(number: int) -> int:   if number == 0: return 0   if number == 1: return 1     return fib_memoization(number-1) + fib_memoization(number-2) start = time.time() fib_memoization(40) print(f'Duration: {time.time() - start}s')  
Descompactando objetos iteráveis (3.0+)
Ao 
descompactar objetos iteráveis, você pode usar variáveis cujos nomes são precedidos por um asterisco. Tudo o que não se encaixa em outras variáveis entra nessas variáveis. Portanto, no exemplo a seguir, o primeiro e o último valor da lista formada pelo comando 
range(5) enquadram nas variáveis 
head e 
tail . Tudo o que está entre o primeiro e o último valor entra na variável do 
body .
 head, *body, tail = range(5) print(head, body, tail)  
Classes de dados (3.7+)
O Python 3 introduziu 
classes de dados . Eles dão ao programador muita liberdade de ação. Eles podem ser usados para reduzir a quantidade de código padrão. O fato é que o decorador da 
dataclass gera automaticamente métodos especiais, como 
__init__() e 
__repr__() . No texto oficial da 
proposta correspondente 
, eles são descritos como "tuplas nomeadas mutáveis com valores padrão". Aqui está um exemplo de criação de uma classe sem usar o decorador de classe de 
dataclass :
 class Armor:     def __init__(self, armor: float, description: str, level: int = 1):       self.armor = armor       self.level = level       self.description = description                  def power(self) -> float:       return self.armor * self.level  armor = Armor(5.2, "Common armor.", 2) armor.power()  
Aqui está o mesmo, mas já escrito usando 
dataclass :
 from dataclasses import dataclass @dataclass class Armor:   armor: float   description: str   level: int = 1     def power(self) -> float:       return self.armor * self.level  armor = Armor(5.2, "Common armor.", 2) armor.power()  
Suporte à pasta de pacotes sem o arquivo __init__.py (3.3+)
Uma maneira de estruturar o código Python é usar 
pacotes (os pacotes são colocados em pastas que contêm o arquivo 
__init__.py ). Aqui está um exemplo da documentação oficial:
 sound/                                 __init__.py                 sound     formats/                                   __init__.py             wavread.py             wavwrite.py             aiffread.py             aiffwrite.py             auread.py             auwrite.py             ...     effects/                                  __init__.py             echo.py             surround.py             reverse.py             ...     filters/                                 __init__.py             equalizer.py             vocoder.py             karaoke.py             ... 
Ao usar o Python 2, cada uma das pastas mencionadas no exemplo deve ter um arquivo 
__init__.py . Graças a esse arquivo, a pasta é percebida como um pacote Python. No Python 3, com o advento do recurso 
Implicit Namespace Packages , pastas como essas não são mais necessárias.
 sound/                                 __init__.py                 sound     formats/                                   wavread.py             wavwrite.py             aiffread.py             aiffwrite.py             auread.py             auwrite.py             ...     effects/                                  echo.py             surround.py             reverse.py             ...     filters/                                 equalizer.py             vocoder.py             karaoke.py             ... 
Note-se que, de fato, nem tudo é tão simples. Ou seja, de acordo com 
esta especificação oficial, o arquivo 
__init__.py ainda é necessário para pacotes regulares. Se você removê-lo da pasta, o pacote se transformará no chamado 
pacote de namespace , ao qual se aplicarão restrições adicionais.
Sumário
Nem todos os recursos interessantes do Python 3 são abordados neste artigo, mas esperamos que você encontre algo útil aqui. Código de amostra pode ser encontrado 
neste repositório.
Caros leitores! Quais recursos do Python 3 você adicionaria à lista aqui?
