Рубрики
Без рубрики

6 изящных функций языка питона, о которых вы, возможно, не знаете

Одной из сильных сторон языка программирования Python является то, что начинающим легко учиться … Tagged с Python, Codenewbie.

Одной из сильных сторон языка программирования 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”