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?
