Закажи экспресс-аудит своего дела онлайн всего за 199 ₽
и получи рекомендации по улучшению - Жми сюда !

5 основных концепций Python, которые необходимо знать

В этой статье мы рассмотрим пять фундаментальных концепций, которые должны быть в арсенале каждого разработчика на Python.

5 основных концепций Python, которые необходимо знать

# Введение

Почему вы используете Python? Для многих ответ сводится к «просто так», но на самом деле это не так. Python — это мощный универсальный язык программирования с простым синтаксисом, подчёркнутым «питоническим» подходом к управлению логикой и данными, который по этим причинам стал одним из основных языков в области анализа данных, машинного обучения и искусственного интеллекта. Освоить Python легко, но можно потратить много лет на совершенствование навыков и освоение основных механизмов языка, чтобы перейти от новичка к профессионалу, способному писать эффективные и поддерживаемые системы.

Исходя из этого, сегодня мы рассмотрим пять фундаментальных концепций, которые должны быть в арсенале каждого разработчика на Python.

# 1. Списковые включения и генераторные выражения

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

// Неуклюжий способ (цикл for)

Начнём с неэффективного, не соответствующего принципам Python «неуклюжего» способа решения задач:

numbers = range(1000000) squared_list = [] for n in numbers: if n % 2 == 0: squared_list.append(n ** 2)

// Метод Python (списковые включения)

Теперь давайте рассмотрим подход, характерный для Python, для решения той же задачи:

# Более лаконичное и быстрое выполнение squared_list = [n ** 2 for n in numbers if n % 2 == 0] # Важный нюанс: генераторные выражения # Если вам нужно выполнить итерацию только один раз и не нужен весь список в памяти: squared_gen = (n ** 2 for n in numbers if n % 2 == 0)

Выход:

Размер списка: 4 167 352 байта. Размер генератора: 200 байт.

Вот почему это важно, помимо того, что вам говорят: «Так это делается в Python»: списковые выражения работают быстрее, чем метод `.append()`. Генераторы (использующие скобки) являются «ленивыми» — они создают элементы по одному, что позволяет обрабатывать огромные массивы данных, не исчерпывая память системы.

Давайте посмотрим, как использовать генератор, по одному вызову за раз, используя выражение генератора:

numbers = range(1000000) squared_gen = (n ** 2 for n in numbers if n % 2 == 0) # Значения вычисляются только по запросу, а не все сразу print(next(squared_gen)) print(next(squared_gen)) print(next(squared_gen))

Выход:

0 4 16

# 2. Декораторы

Декораторы — это способ изменить поведение функции или класса без необратимого изменения его исходного кода. Рассматривайте их как обертки над другими функциями.

// Неуклюжий способ

Если вам нужно записывать время выполнения нескольких разных функций, вы можете вручную добавить код для измерения времени в каждую из них.

import time def process_data(): start = time.time() # … логика функции … end = time.time() print(f»process_data заняла {end — start:.4f}с») def train_model(): start = time.time() # … логика функции … end = time.time() print(f»train_model заняла {end — start:.4f}с») def generate_report(): start = time.time() # … логика функции … end = time.time() print(f»generate_report заняла {end — start:.4f}с»)

Обратите внимание, что повторение делает проблему очевидной: одни и те же четыре строки дублируются в каждой функции. Давайте посмотрим, как функция-декоратор может это исправить.

// По-питоновски

Вот более «питоновский» подход к решению этой задачи.

import time from functools import wraps def timer_decorator(func): @wraps(func) def wrapper(*args, **kwargs): start = time.time() result = func(*args, **kwargs) end = time.time() print(f»{func.__name__} took {end — start:.4f}s») return result return wrapper @timer_decorator def heavy_computation(): return sum(range(10**7)) heavy_computation()

Выход:

Вычисления с использованием функции heavy_computation заняли 0,0941 с.

Обратите внимание, как функция timer_decorator() «оборачивает» функцию heavy_computation(), и когда вызывается последняя, она поглощается первой и получает от неё все преимущества.

Декораторы способствуют реализации принципа «не повторяйся» (DRY). Они необходимы для логирования, аутентификации и кэширования в производственных средах.

# 3. Менеджеры контекста (с операторами)

Управление ресурсами, такими как файлы, подключения к базам данных или сетевые сокеты, является распространенной причиной ошибок. Если вы забудете закрыть файл, произойдет утечка памяти или файл будет заблокирован для других процессов.

// Неуклюжий способ

Здесь мы открываем файл, используем его и принудительно закрываем, когда он больше не нужен.

f = open(«data.txt», «w») try: f.write(«Hello World») finally: # Легко забыть! f.close()

// По-питоновски

Использование оператора `with` помогло бы нам в вышеописанном.

# Файл автоматически закрывается здесь, даже если возникает ошибка. `open(«data.txt», «w») as f: f.write(«Hello World»)`

Это не только более лаконично, но и логично, и проще для понимания — плюс вы получаете легко забываемую функцию close() бесплатно, поскольку операции «setup» и «teardown» выполняются надежно. Что касается задач обработки данных, это полезно при подключении к базам данных SQL или при обработке больших задач, связанных с вводом/выводом (IO).

#4. Освоение *args и **kwargs

Иногда неизвестно, сколько аргументов будет передано функции. Python элегантно решает эту проблему с помощью операторов «упаковки». Даже начинающий программист, который, возможно, никогда их не использовал, наверняка сталкивался с этими операторами «упаковки» в какой-то момент.

// Пример на языке Python

Вот как это можно сделать в духе Python:

  • *args (аргументы, не являющиеся ключевыми словами): Оператор «упаковки», объединяющий дополнительные позиционные аргументы в кортеж. Используется, когда неизвестно, сколько элементов будет передано в функцию.
  • **kwargs (ключевые аргументы): Оператор «упаковки», объединяющий дополнительные именованные аргументы в словарь. Используется для необязательных настроек или именованных параметров.

def make_profile(name, *tags, **metadata): # name — именованный аргумент print(f»User: {name}») # tags — кортеж print(f»Tags: {tags}») # metadata — словарь print(f»Details: {metadata}») make_profile(«Alice», «DataScientist», «Pythonist», location=»NY», seniority=»Senior»)

Выход:

Пользователь: Alice Теги: ('DataScientist', 'Pythonist') Подробности: {'location': 'NY', 'seniority': 'Senior'}

В этом и заключается секрет гибкости таких библиотек, как Scikit-Learn или Matplotlib . Она позволяет передавать произвольное количество параметров конфигурации в функцию, что делает ваш код невероятно адаптивным к меняющимся требованиям.

# 5. Методы Дандера (Магические методы)

«Dunder» означает двойное подчеркивание (например, __init__). Официально это специальные методы (но чаще их называют магическими методами), которые позволяют вашим пользовательским объектам имитировать встроенное поведение Python.

// По-питоновски

Давайте посмотрим, как использовать магические методы для добавления автоматического поведения в наши классы.

class Dataset: def __init__(self, data): self.data = data def __len__(self): return len(self.data) def __str__(self): return f»Dataset with {len(self.data)} items» # Создание экземпляра набора данных my_data = Dataset([1, 2, 3]) # Вызов __len__ print(len(my_data)) # Вызов __str__ print(my_data)

Выход:

3 Набор данных с 3 элементами

Используя встроенные функции __len__ и __str__, наш пользовательский класс получает полезную функциональность совершенно бесплатно.

Методы `dunder` являются основой объектного протокола Python. Реализовав такие методы, как `__getitem__` или `__call__`, вы можете заставить ваши классы вести себя как списки, словари или даже функции, что приводит к гораздо более интуитивно понятным API.

# Завершение

Освоение этих пяти концепций знаменует переход от написания скриптов к созданию программного обеспечения. Используя списковые выражения для скорости, декораторы для чистой логики, менеджеры контекста для безопасности, *args/**kwargs для гибкости и методы с двойным знаком препинания для большей мощности объектов, вы закладываете фундамент, на котором сможете развивать свои дальнейшие навыки работы с Python.

Мэтью Мэйо ( @mattmayo13 ) имеет степень магистра компьютерных наук и диплом специалиста по анализу данных. Будучи главным редактором KDnuggets & Statology и внештатным редактором Machine Learning Mastery, Мэтью стремится сделать сложные концепции науки о данных доступными для всех. В сферу его профессиональных интересов входят обработка естественного языка, языковые модели, алгоритмы машинного обучения и изучение новых технологий искусственного интеллекта. Его движет стремление демократизировать знания в сообществе специалистов по науке о данных. Мэтью занимается программированием с 6 лет.

Источник: www.kdnuggets.com

✅ Найденные теги: 5, Python, Концепции, новости, Обучение, Программирование, Разработка

Добавить комментарий

Нет других записей в этой рубрике.

Новости других рубрик

Архив рубрики ~Лента новостей~: Двое космонавтов эпохи космических шаттлов, вышедших в открытый космос, вошли в Зал славы астронавтов. Архив рубрики ~Лента новостей~: Ученые проследили за исчезновением кислорода со дна Балтийского моря: Биология Архив рубрики ~Лента новостей~: Температура и нейроны: как теплокровность повлияла на развитие сознания Архив рубрики ~Лента новостей~: Поддержка Ryzen 7 7700X3D появилась в утилите CPU-Z: характеристики и дата презентации Архив рубрики ~Лента новостей~: Поддержка невыпущенного процессора Ryzen 7 7700X3D появилась в утилите CPU-Z Архив рубрики ~Лента новостей~: Агенты искусственного интеллекта незаметно создают хаос и инженерные сбои, которые предприятия пока не отслеживают. Архив рубрики ~Лента новостей~: 3 известные интересные задачи на логику Архив рубрики ~Лента новостей~: Студент из колледжа останавливает высокоскоростные поезда с помощью ноутбука и радио