Введение:
Python — это мощный язык программирования, который широко используется в инженерии данных и науке о данных. В этом сообщении блога мы обсудим несколько передовых концепций Python, которые обычно используются в обработке данных. Эти концепции включают генераторы, декораторы, лямбда-функции, понимание списка, отображение и сокращение. Мы объясним, что представляет собой каждая концепция, и приведем примеры того, как их можно использовать в вашем коде. Кроме того, мы покажем, как эти концепции можно комбинировать для создания эффективного и читаемого кода. Мы будем использовать реальный пример генерации списка дат между двумя заданными датами, преобразования их в строковый формат, нахождения общего количества дней, а также преобразования генератора в список с помощью функции декоратора. Эти концепции помогут вам писать более эффективный и удобный для сопровождения код, а также облегчат понимание того, что делает код.
- Генераторы:
Генератор — это особый тип итератора в Python, который позволяет программисту перебирать последовательность элементов, но без необходимости одновременного хранения всей последовательности элементов в памяти. Вместо этого генератор генерирует каждый элемент на лету по мере его запроса, используя оператор yield
.
Пример:
def date_generator(start_date, end_date): delta = end_date - start_date dayz = int(delta.days) for i in range(int(dayz)+1): yield (start_date + timedelta(days=i)).strftime("%Y-%m-%d")
Эта функция генератора принимает два аргумента, start_date
и end_date
, которые имеют тип datetime.date()
. Он вычисляет разницу между start_date
и end_date
в днях, используя оператор вычитания и присваивая ее переменной delta
. Затем он использует цикл for для генерации даты для каждого дня между start_date
и end_date
, добавляя переменную цикла к start_date
и используя функцию timedelta
для увеличения ее на день. Затем дата форматируется как строка с использованием метода strftime()
и выдается.
2. Декораторы:
Декоратор — это функция, которая принимает другую функцию в качестве входных данных и возвращает новую функцию, которая обычно каким-то образом расширяет поведение входной функции.
Пример:
def date_list(func): def wrapper(*args): list = [i for i in func(*args)] return list return wrapper
Эта функция-декоратор принимает функцию генератора func
в качестве входных данных и возвращает новую функцию wrapper
. wrapper
Функция принимает любое количество аргументов, используя функцию *args syntax and calls the input function
funcwith those arguments. It then uses a list comprehension to convert the generator returned by
funcinto a list. The
wrapperfunction then returns this list. The
@date_listsyntax is used to apply this decorator to the
date_generator.
3. Список понятий:
Понимание списков — это краткий способ создания списка в Python с использованием одной строки кода. Он состоит из выражения, за которым следует хотя бы одно предложение for
и, возможно, одно или несколько предложений if
.
Пример:
list = [i for i in func(*args)]
Это понимание списка создает список всех элементов, возвращаемых функцией-генератором func
при вызове с заданными аргументами *args
. Часть i for i in func(*args)
понимания списка указывает, что элементы списка будут элементами, возвращаемыми функцией генератора.
4. Лямбда-функция:
Лямбда-функции — это небольшие анонимные функции, которые определяются без имени с использованием ключевого слова lambda
. Они полезны, когда вам нужно передать небольшую функцию в качестве аргумента другой функции.
Пример:
date_generator = lambda end_date : (start_date + timedelta(days=i)).strftime("%Y-%m-%d") for i in range(int((end_date - start_date).days)+1)
Здесь date_generator
функция определяется как лямбда-функция, которая принимает один аргумент end_date
и возвращает генератор, который выдает каждую дату по одной за раз в формате «ГГГГ-ММ-ДД».
5. Сопоставление и уменьшение:
Функция map()
применяет заданную функцию ко всем элементам итерируемого объекта (например, списку, кортежу и т. д.) и возвращает итератор, который выдает результаты. Функция reduce()
применяет заданную функцию кумулятивно к элементам итерируемого объекта слева направо, чтобы сократить итерируемый объект до одного значения.
Пример:
date_list = list(map(lambda date: date.strftime("%Y-%m-%d"), date_generator(end_date))) total_days = reduce(lambda acc, date: acc + 1, date_list)
Здесь функция map()
используется для применения функции lambda date: date.strftime("%Y-%m-%d")
к каждой дате в генераторе date_generator(end_date)
, который преобразует каждую дату из объекта datetime.date
в строку в формате «ГГГГ-ММ-ДД».
Обзор:
В этом примере мы можем сгенерировать список дат между двумя заданными датами с помощью генератора, преобразовать их в строковый формат с помощью лямбда-функции и функции map()
и найти общее количество дней с помощью функции reduce()
. Все эти функции объединены и реализованы в нескольких строках кода, что делает его очень эффективным и легким для чтения. Мы также использовали функцию декоратора для преобразования генератора в список.
from functools import reduce from datetime import timedelta, date def date_list(func): def wrapper(*args): list = [i for i in func(*args)] return list return wrapper def date_generator(start_date, end_date): delta = end_date - start_date for i in range(delta.days + 1): yield start_date + timedelta(days=i) @date_list def generate_dates(start_date, end_date): return map(lambda date: date.strftime("%Y-%m-%d"), date_generator(start_date, end_date)) start_date = date(2023, 1, 12) end_date = date(2023, 2, 12) date_list = generate_dates(start_date, end_date) total_days = reduce(lambda acc, date: acc + 1, date_list) print(date_list) print("Total number of days:", total_days)
В заключение отметим, что генераторы, декораторы, лямбда-функции, понимание списков, сопоставление и сокращение — это мощные инструменты, которые могут сделать ваш код более эффективным и читабельным. Они позволяют выполнять общие задачи с меньшим количеством строк кода и упрощают понимание того, что делает код. Комбинируя эти концепции, вы можете с легкостью выполнять сложные задачи и делать свой код более удобным для сопровождения.