Одной из сильных сторон языка программирования Python является то, что начинающим легко учиться и в то же время очень полезно для продвинутых пользователей.
Классы данных – это классы с единственной целью выступать в качестве контейнеров данных. Обычно они не содержат бизнес -логики внутри них.
Python предоставляет @dataclass
Декоратор, который при добавлении в класс автоматически генерирует несколько полезных методов, поэтому вам не нужно выписывать их вручную. К ним относятся __init__
Метод генерации конструктора, __str__
и __repr__
Для генерации строковых представлений и __eq__
Для проверки экземпляров класса для равенства.
Определить класс данных просто.
@dataclass() class Article: title: str author: str published_on: datetime views: int likes: int
При желании вы также можете установить значения по умолчанию для переменных.
@dataclass() class Article: title: str = "John Doe" author: str = "Unknown" published_on: datetime = datetime.now() views: int = 0 likes: int = 0
Для полного списка автоматически сгенерированных методов вы можете проверить Официальная документация Анкет
Иногда вам нужно проверить несколько условий перед выполнением действия, например, в Если
утверждение. Python предоставляет логическое и
и или
Операторы для оценки таких логических выражений. Однако, когда в игре есть очень большое количество условий, ваше заявление может начать выглядеть немного громоздко.
любой ()
и All ()
Методы – это просто более короткий и более читаемый способ оценки большого количества логических выражений одновременно. любой ()
эквивалентен серии или
Операции, в то время как All ()
эквивалентен серии и
операции.
Предположим, вам предоставлен список отметок, который забил определенный студент …
marks = [67, 85, 48, ] passing_marks = 33
… и вы хотите проверить, соответствует ли студент, чтобы быть повышенным до следующего года. Один из способов сделать это – просто присоединиться к каждому сравнению с и
оператор:
if marks[0] > passing_marks and marks[1] > passing_marks and marks[2] > passing_marks: promoted = True else: promoted = False
Вы можете сделать этот код немного более читабельным, используя All ()
Функция:
if all([marks[0] > passing_marks, marks[1] > passing_marks, marks[2] > passing_marks]): promoted = True else: promoted = False
Наконец, вы можете объединить его с пониманием списка, чтобы получить сладкое, краткое решение:
if all([subject_marks > passing_marks for subject_marks in marks]): promoted = True else: promoted = False
Возможности этих двух функций могут быть дополнительно расширены, объединив их с не
оператор.
Ниже приводится краткое изложение этих методов.
любой ()
: ВозвращаетИстинный
Если хотя бы один из аргументов оценивается на истинуAll ()
: ВозвращаетВерно
Если все аргументы оцениваются в истинномнет ()
: ВозвращаетВерно
Если ни один из аргументов не оценивается в истинномНе все ()
: ВозвращаетВерно
Если по крайней мере один из аргументов оценивается на ложь
Оператор среза обычно используется для доступа к определенным частям списка или строки.
string = "Python is awesome!" string[3] # 'h' string[4:7] # 'on '
У этого также есть еще много продвинутых употреблений. Например, отрицательные индексы могут использоваться для срезов с конца вместо начала.
string[-2] # 'e'
Вы также можете указать «шаг», чтобы пропустить определенное количество элементов во время нарезки.
string[2:9:2] # 'to s'
Значение шага может быть отрицательным. Это приводит к нарезанию списка/строки в обратном направлении.
string[9:2:-2] # ' inh'
Общий ярлык, чтобы отменить массив или список, – это нарезать его [::-1]
Анкет
string[::-1] # '!emosewa si nohtyP'
*
и **
являются специальными операторами, которые позволяют упаковать несколько элементов в (или распаковывать) одну переменную.
Вы могли бы увидеть слова *args
и ** Kwargs
присутствует в определениях функций. Когда присутствует в контексте определения функции, *
Оператор объединяет несколько аргументов в один кортеж, в то время как **
Оператор объединяет несколько аргументов ключевых слов в словаре.
def product(*args): res = 1 for arg in args: res *= arg return res product(3, 4, 5) def print_dict(**kwargs): for key in kwargs: print(f"{key}: {kwargs[key]}") print_dict(firstname="Bikramjeet", lastname="Singh")
С другой стороны, когда он присутствовал в контексте функции Позвоните , они делают наоборот – *
Оператор распространяет содержимое списка/корзины в отдельные аргументы, в то время как **
Оператор распространяет содержимое словаря в отдельные аргументы ключевых слов.
list_of_nums = [3, 4, 5] product(*list_of_nums) d = {"firstname": "Bikramjeet", "lastname": "Singh"} print_dict(**d)
В функциях, которые имеют большое количество параметров, часто удобно собирать их в словарь, прежде чем передавать их функции.
def my_function(arg1, arg2, arg3, arg4 ... ): ... params = {'arg1': ...} my_function(**params)
Другое использование этих операторов – это объединение списков и словари.
combined_list = [*l1, *l2] combined_dict = {**d1, **d2}
Python поддерживает Функции более высокого порядка – Функции, которые могут принимать и вернуть другие функции. Концепция функций более высокого порядка является центральной для нескольких других функций Python, таких как декораторы.
Functools Пакет предоставляет полезные вспомогательные функции, когда вы работаете с функциями более высокого порядка. Давайте посмотрим на некоторые из них.
частичный
Есть случаи, когда вы можете создать «специализированную» версию существующей, более обобщенной функции. Это делается путем «замораживания» значений некоторых параметров базовых функций.
Рассмотрим простую функцию, которая вычисляет NTH мощность числа:
def pow(base, exp): res = 1 for i in range(exp): res *= base return res pow(2, 3) # returns 8
Работа в квадрате числа достаточно распространена, что стоит создать для него выделенную функцию, чтобы нам не приходилось каждый раз передавать 2 в качестве аргумента. Однако вместо переписывания нашего Пау
Функция, мы можем просто повторно использовать его с помощью functools.partial
метод
square = functools.partial(pow, exp=2) square(4) # returns 16, equivalent to pow(4, 2)
Точно так же мы также можем создать функцию куба:
cube = functools.partial(pow, exp=3) cube(5) # returns 125, equivalent to pow(5, 3)
cached_property
Это декоратор, который позволяет вам кэшировать возвратные значения потенциально дорогих методов. Например, вызовы в базе данных, как правило, являются относительно длительными операциями, поэтому это хорошая идея, чтобы кэшировать их, если вы не ожидаете, что их значения будут очень часто меняться.
@functools.cached_property def my_expensive_method(): ... return result
Метод оценивается в полном объеме при первом вызове, и его возвращаемое значение кэшируется. В следующий раз, когда будет вызван тот же метод, его результат может быть просто извлечен из кэша.
Обратите внимание, что cached_property
Декоратор доступен только начиная с Python 3.8. Для нижних версий Python есть Отдельные пакеты доступный.
total_ordering
Когда вы определяете пользовательский класс, особенно тот, который является контейнером для количественных данных какого -то рода, полезно определить методы сравнения __eq__
(равно), __gt__
(больше, чем), __ge__
(больше или равно), __lt__
(меньше) & __le__
(меньше или равно) для облегчения сравнения объектов этих классов.
class Distance: km: int # Kilometers m: int # Meters def __init__(self, km, m): self.km = km self.m = m def __eq__(self, other): return self.km == other.km and self.m == other.m def __gt__(self, other): if self.km > other.km: return True elif self.km < other.km: return False elif self.m > other.m: return True else: return False
Однако определение всех этих методов может быть громоздким и привести к большому количеству кода шаблона, тем более что их 5. К счастью, вам не нужно! Учитывая логику __eq__
И любой из __gt__
, __ge__
, __lt__
или __le__
, все остальные методы сравнения могут быть получены.
Например, в примере выше, __le__
метод может быть получен как
def __le__(self, other): return not self > other
Это то, что @total_ordering
Декоратор делает. При нанесении на класс, который определяет хотя бы __eq__
И еще один метод сравнения, он получает все остальные для вас.
@functools.total_ordering class Distance: ...
Методы Dunder (Double Underscore)-это специальные методы, которые позволяют вам использовать встроенные операторы Python и ключевые слова, такие как +
, *
, Лен
и т. Д. В пользовательских классах. Это очень полезно для того, чтобы сделать код более кратким и читаемым. Вы можете прочитать больше о методах Dunder в моей предыдущей статье, Здесь Анкет
Изображение по Пол Бреннан от Pixabay
Оригинал: “https://dev.to/bikramjeetsingh/6-nifty-python-language-features-you-might-not-know-about-6mi”