Recursos do Python 3 que vale a pena usar

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) # User Jane Doe has logged in and did an action buy. 

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) # User Jane Doe has logged in and did an action buy. 

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) # post_sub_folder path = root / 'happy_user' #    print(path.resolve()) # /home/weenkus/Workspace/Projects/DataWhatNow-Codes/how_your_python3_should_look_like/post_sub_folder/happy_user 

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") # True 

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) # 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) # Monster.ZOMBIE # Monster.WARRIOR # Monster.BEAR 

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') # Duration: 30.684099674224854s 

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') # Duration: 6.866455078125e-05s 

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) # 0 [1, 2, 3] 4 py, filename, *cmds = "python3.7 script.py -n 5 -l 15".split() print(py) print(filename) print(cmds) # python3.7 # script.py # ['-n', '5', '-l', '15'] first, _, third, *_ = range(10) print(first, third) # 0 2 

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() # 10.4 print(armor) # <__main__.Armor object at 0x7fc4800e2cf8> 

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() # 10.4 print(armor) # Armor(armor=5.2, description='Common armor.', level=2) 

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?

Source: https://habr.com/ru/post/pt452564/


All Articles