Многие люди начинают переезжать с версии 2 на 3 из-за Python EOL (Поддержка Python 2.7 прекратиться с 2020 года). К сожалению, часто Python 3 выглядит как Python 2 со скобками. В статье я покажу несколько примеров существующих функций, которыми вы можете пользоваться только в Python 3, с надеждой на то, что это поможет решать ваши текущие и будущие задачи.
Есть вопросы по Python?
На нашем форуме вы можете задать любой вопрос и получить ответ от всего нашего сообщества!
Паблик VK
Одно из самых больших сообществ по Python в социальной сети ВК. Видео уроки и книги для вас!
Все примеры написаны в Python 3.7 и каждая функция содержит минимальную версию Python для этой функции.
F-строки (Python 3.6+)
Сложно делать что-либо без строк в Python и чтобы сохранить адекватность, вам нужно иметь структурированный способ работы со строками. Большая часть людей, работающих с Python, предпочитают метод format python.
1 2 3 4 5 6 7 8 9 10 |
user = "Андрей" action = "покупка" log_message = 'Пользователь {} зашел на сайт и выполнил действие: {}'.format( user, action ) print(log_message) # Пользователь Андрей зашел на сайт и выполнил действие: покупка |
Наряду с format
, Python 3 предоставляет гибкий способ выполнения интерполяции строк через f-строки. Тот же код, что и показанный выше, с использованием f-strings выглядит так:
1 2 3 4 5 6 7 |
user = "Юрий" action = "продажа" log_message = f'Пользователь {user} зашел на сайт и выполнил действие: {action}' print(log_message) # Пользователь Юрий зашел на сайт и выполнил действие: продажа |
Pathlib (Python 3.4+)
F-строки — это отличное решение, но некоторые строки, такие как пути файлов, имеют свои собственные библиотеки, которые заметно упрощают работу. Python 3 предоставляет pathlib в качестве удобной абстракции для работы с путями файлов.
1 2 3 4 5 6 7 8 9 10 11 |
from pathlib import Path root = Path('post_sub_folder') print(root) # post_sub_folder path = root / 'happy_user' # Делаем путь абсолютным print(path.resolve()) # /home/weenkus/post_sub_folder/happy_user |
Подсказки типов | Ожидание типа | Type hinting (Python 3.5+)
Спор о том, какое типизирование python лучше — статическое или динамическое — не умолкают и по сей день и у каждого есть свое мнение на этот счет. Это личное дело читателя — когда ему нужно вписывать типы, но мне кажется что вы как минимум должны знать о том, что Python 3 поддерживает подсказки типов.
1 2 3 4 |
def sentence_has_animal(sentence: str) -> bool: return "animal" in sentence print(sentence_has_animal("У Ивана есть своя собственная Bitcoin ферма")) # True |
Перечисления enum (Python 3.4+)
Python 3 поддерживает простой способ написания перечислений через класс Enum. Этот класс можно назвать удобным способом инкапсуляции списка констант, чтобы они не были разбросаны по всему коду без структуры.
1 2 3 4 5 6 7 8 9 10 |
from enum import Enum, auto class Monster(Enum): ZOMBIE = auto() WARRIOR = auto() BEAR = auto() print(Monster.ZOMBIE) # Monster.ZOMBIE |
Перечисление — это набор символических имен (членов), связанных уникальным, постоянным значением. С перечислением, члены можно сравнить по идентичности, а само перечисление может повторяться.
1 2 3 4 5 6 |
for monster in Monster: print(monster) # Monster.ZOMBIE # Monster.WARRIOR # Monster.BEAR |
Встроенный LRU кэш (Python 3.2+)
Кэш содержится практически в любом горизонтальном отрезке программного обеспечения, которым мы пользуемся сегодня. Python 3 делает их использование очень простым, предоставляя кэш LRU (Least Recently Used) в качестве декоратора под названием lru_cache
.
Внизу показана простая функция Фибоначчи, которая, как мы знаем, выиграет от кэширования, так как выполняет одну и ту же работу несколько раз через рекурсию.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
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') # Длительность: 30.684099674224854s |
Теперь мы можем использовать lru_cache
для оптимизации (эта техника оптимизации называется меморизация). Время выполнения варьирует от секунд до наносекунд.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
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') # Длительность: 6.866455078125e-05s |
Повторяемая расширенная распаковка (Python 3.0+)
Здесь код будет говорить сам за себя (документация):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
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 |
Классы данных (Python 3.7+)
Python 3 представляет классы данных, которые не имеют большого количества ограничений и могут быть использованы для сокращения стандартного кода, так как декоратор автоматически генерирует специальные методы, такие как __init__()
и __repr()__
. Из официального заявления, они описываются как “изменяемые названные кортежи со значениями по умолчанию”.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
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> |
Та же реализация класса Armor
при помощи классов данных.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
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) |
Пространства имен (Python 3.3+)
Один из способов структуризации кода Python заключается в пакетах (папки с файлом __init__.py
). Пример ниже предоставлен официальной документацией Python.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
sound/ Пакет верхнего уровня __init__.py Инициализировать звукового пакета 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 ... |
В Python 2, каждая папка выше должна иметь файл __init__.py
, который делает папку пакетом Python. В Python 3, с появлением неявных пакетов пространств имен, эти файлы больше не нужны.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
sound/ Пакет верхнего уровня __init__.py Инициализировать звукового пакета 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 ... |
Впрочем, как многие пользователи заметили, это может быть не так просто, как я указал в этом разделе. Согласно спецификации 420 в PEP — файл __init__.py
все еще может понадобиться для обычных пакетов, удаление его из структуры папки превратит его в пакет пространства имен, который включает в себя дополнительные ограничения, официальная документация нативных пакетов пространств имен показывают хорошие примеры тому, а также в них озвучиваются названия всех ограничений.
Подведем итоги
Как и практически любой другой список в интернете, этот нельзя назвать завершенным. Надеюсь в этой статье вы нашли хотя бы одну функцию Python 3, которой вы ранее не пользовались, и это поможет вам писать более чистый и интуитивный код.
Являюсь администратором нескольких порталов по обучению языков программирования Python, Golang и Kotlin. В составе небольшой команды единомышленников, мы занимаемся популяризацией языков программирования на русскоязычную аудиторию. Большая часть статей была адаптирована нами на русский язык и распространяется бесплатно.
E-mail: vasile.buldumac@ati.utm.md
Образование
Universitatea Tehnică a Moldovei (utm.md)
- 2014 — 2018 Технический Университет Молдовы, ИТ-Инженер. Тема дипломной работы «Автоматизация покупки и продажи криптовалюты используя технический анализ»
- 2018 — 2020 Технический Университет Молдовы, Магистр, Магистерская диссертация «Идентификация человека в киберпространстве по фотографии лица»