30 трюков на Python с описанием преимущества

099e49f718d725784e57c9e6f1cecfd7.png

Причет, чемпионы! Нашлось время собрать коллекцию хитростей на python в примерах. Примеры давно копились у меня в черновиках, и вот делюсь! Это первая часть, вторая будет сразу на 100 пунктов. Поехали!

1. Списковые включения (List Comprehensions)

squares = [x**2 for x in range(10)]
print(squares)  # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

Преимущества: Код становится более компактным и легко воспринимаемым, улучшая читаемость и производительность благодаря встроенной оптимизации.

2. Генераторы

def generate_numbers(n):
    for i in range(n):
        yield i * 2

gen = generate_numbers(5)
print(list(gen))  # [0, 2, 4, 6, 8]

Преимущества: Генераторы экономят память, создавая значения по мере необходимости, что особенно полезно для больших наборов данных.

3. Функция enumerate ()

fruits = ['apple', 'banana', 'cherry']
for index, fruit in enumerate(fruits):
    print(index, fruit)
# 0 apple
# 1 banana
# 2 cherry

Преимущества: Упрощает получение индекса и значения одновременно без необходимости управления счетчиком.

4. Функция zip ()

names = ['Alice', 'Bob', 'Charlie']
ages = [25, 30, 35]
combined = list(zip(names, ages))
print(combined)  # [('Alice', 25), ('Bob', 30), ('Charlie', 35)]

Преимущества: Позволяет удобно объединять несколько списков в кортежи, упрощая работу с парами значений.

5. Использование *args и **kwargs

def example_function(*args, **kwargs):
    print("args:", args)
    print("kwargs:", kwargs)

example_function(1, 2, 3, name="Alice", age=25)
# args: (1, 2, 3)
# kwargs: {'name': 'Alice', 'age': 25}

Преимущества: Обеспечивает гибкость в передаче произвольного количества аргументов и именованных параметров в функции.

6. Словари с пониманием (Dictionary Comprehensions)

squares_dict = {x: x**2 for x in range(5)}
print(squares_dict)  # {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}

Преимущества: Позволяет создавать словари более лаконично и читаемо, чем с использованием циклов.

7. Функция map ()

numbers = [1, 2, 3, 4]
squared = list(map(lambda x: x**2, numbers))
print(squared)  # [1, 4, 9, 16]

Преимущества: Упрощает применение функции ко всем элементам списка без необходимости использовать циклы.

8. Функция filter ()

numbers = [1, 2, 3, 4, 5]
even_numbers = list(filter(lambda x: x % 2 == 0, numbers))
print(even_numbers)  # [2, 4]

Преимущества: Позволяет легко фильтровать элементы списка по заданному условию.

9. Использование set () для удаления дубликатов

numbers = [1, 2, 2, 3, 4, 4, 5]
unique_numbers = set(numbers)
print(unique_numbers)  # {1, 2, 3, 4, 5}

Преимущества: Быстро удаляет дубликаты, обеспечивая уникальность элементов.

10. Функция sorted ()

unsorted_list = [5, 2, 3, 1, 4]
sorted_list = sorted(unsorted_list)
print(sorted_list)  # [1, 2, 3, 4, 5]

Преимущества: Упрощает сортировку списков, предоставляя возможность сортировать по умолчанию или по заданным критериям.

11. Использование defaultdict из модуля collections

from collections import defaultdict

dd = defaultdict(int)
dd['apple'] += 1
dd['banana'] += 2
print(dd)  # defaultdict(, {'apple': 1, 'banana': 2})

Преимущества: Позволяет автоматизировать создание ключей со значениями по умолчанию, что упрощает управление словарями.

12. Использование Counter из модуля collections

from collections import Counter

fruits = ['apple', 'banana', 'apple', 'orange', 'banana', 'banana']
count = Counter(fruits)
print(count)  # Counter({'banana': 3, 'apple': 2, 'orange': 1})

Преимущества: Удобно подсчитывает количество вхождений элементов, обеспечивая простой анализ частоты.

13. Использование itertools для создания итераторов

import itertools

count = itertools.count(start=5, step=2)
print(next(count))  # 5
print(next(count))  # 7

Преимущества: Позволяет создавать бесконечные итераторы, которые можно использовать для генерации последовательностей.

14. Использование with для управления ресурсами

with open('example.txt', 'w') as f:
    f.write('Hello, World!')
# Файл автоматически закрывается после выхода из блока with

Преимущества: Обеспечивает автоматическое управление ресурсами, предотвращая утечки памяти и открытые файлы.

15. Функция any () и all ()

numbers = [1, 2, 3, 4]
print(any(x > 3 for x in numbers))  # True
print(all(x > 0 for x in numbers))  # True

Преимущества: Упрощает проверку условий для коллекций, позволяя быстро оценивать логические выражения.

16. Использование lambda для создания анонимных функций

add = lambda x, y: x + y
print(add(5, 3))  # 8

Преимущества: Позволяет создавать краткие функции на месте, что удобно для небольших операций.

17. Использование try и except для обработки исключений

try:
    result = 10 / 0
except ZeroDivisionError:
    print("Деление на ноль!")

Преимущества: Обеспечивает безопасное управление ошибками, предотвращая аварийное завершение программы.

18. Использование f-строк для форматирования строк

name = "Alice"
age = 30
print(f"{name} is {age} years old.")  # Alice is 30 years old.

Преимущества: Позволяет легко и удобно форматировать строки, улучшая читаемость кода.

19. Использование re для работы с регулярными выражениями

import re

text = "The rain in Spain"
match = re.search(r'\bS\w+', text)
print(match.group())  # Spain

Преимущества: Упрощает поиск и манипуляцию строками с использованием мощных регулярных выражений.

20. Использование json для работы с JSON данными

import json

data = {'name': 'Alice', 'age': 30}
json_data = json.dumps(data)
print(json_data)  # {"name": "Alice", "age": 30}

Преимущества: Позволяет легко сериализовать и десериализовать данные в формате JSON, что полезно для работы с API.

21. Использование datetime для работы с датами и временем

from datetime import datetime

now = datetime.now()
print(now)  # Текущая дата и время

Преимущества: Упрощает работу с датами и временем, предоставляя доступ к различным атрибутам и методам.

22. Использование os и sys для работы с операционной системой

import os

current_directory = os.getcwd()
print(current_directory)  # Текущий рабочий каталог

Преимущества: Позволяет взаимодействовать с операционной системой, получая информацию о файловой системе и среде выполнения.

23. Использование pickle для сериализации объектов

import pickle

data = {'name': 'Alice', 'age': 30}
with open('data.pkl', 'wb') as f:
    pickle.dump(data, f)

with open('data.pkl', 'rb') as f:
    loaded_data = pickle.load(f)
print(loaded_data)  # {'name': 'Alice', 'age': 30}

Преимущества: Упрощает процесс сериализации и десериализации объектов, что полезно для сохранения состояния программы.

24. Использование @staticmethod и @classmethod

class MyClass:
    @staticmethod
    def static_method():
        return "This is a static method."

    @classmethod
    def class_method(cls):
        return f"This is a class method of {cls.__name__}."

print(MyClass.static_method())  # This is a static method.
print(MyClass.class_method())    # This is a class method of MyClass.

Преимущества: Позволяет организовывать код и разделять методы, которые работают с экземплярами и классами.

25. Использование property () для создания свойств

class Person:
    def __init__(self, name):
        self._name = name

    @property
    def name(self):
        return self._name

person = Person("Alice")
print(person.name)  # Alice

Преимущества: Позволяет создавать свойства с контролем доступа, улучшая инкапсуляцию.

26. Использование assert для отладки

x = 5
assert x > 0, "x должно быть положительным"  # Не выбрасывает исключение

Преимущества: Упрощает отладку, позволяя добавлять проверки условий в коде.

27. Использование timeit для измерения времени выполнения кода

import timeit

execution_time = timeit.timeit('sum(range(100))', number=10000)
print(execution_time)  # Время выполнения

Преимущества: Позволяет точно измерять производительность кода, помогая в оптимизации.

28. Использование functools.lru_cache для кэширования результатов

from functools import lru_cache

@lru_cache(maxsize=None)
def fibonacci(n):
    if n < 2:
        return n
    return fibonacci(n-1) + fibonacci(n-2)

print(fibonacci(10))  # 55

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

29. Использование contextlib для создания контекстных менеджеров

from contextlib import contextmanager

@contextmanager
def my_context():
    print("Entering the context")
    yield
    print("Exiting the context")

with my_context():
    print("Inside the context")
# Entering the context
# Inside the context
# Exiting the context

Преимущества: Позволяет создавать пользовательские контекстные менеджеры, улучшая управление ресурсами.

30. Использование numpy и pandas для работы с данными

import numpy as np
import pandas as pd

# Пример с numpy
array = np.array([1, 2, 3, 4])
print(array * 2)  # [2 4 6 8]

# Пример с pandas
data = {'Name': ['Alice', 'Bob'], 'Age': [30, 25]}
df = pd.DataFrame(data)
print(df)
#    Name  Age
# 0  Alice   30
# 1    Bob   25

Преимущества: Обеспечивает мощные инструменты для анализа данных и работы с массивами, упрощая манипуляции с большими объемами данных. Про pandas и numpy можно часами хитрости расписывать. Полезно знать хитрость про типы. Очень мощные инструменты!

Заключение

На python существует большое количество прикольных трюков, которые упрощают код и углубляют знания о языке. Если вам нужны дополнительные примеры или объяснения, дайте знать! Я всегда на связи! А если вы интересуетесь data science, мой канал для вас! Продолжение статьи закину в канал!

Кстати, недавно я сделал разбор примера того, как мои студенты выполняют фриланс заказы на python!

© Habrahabr.ru