Python_No_Panic
2.06K subscribers
123 photos
18 videos
49 links
Самый перспективный, полезный и ламповый канал по Python в русскоязычном телеграме!

Обучающие посты в хронологическом порядке, посты по софт скиллам и чат, где вам всегда помогут админы и комьюнити.

Сотрудничество:
@Niik_Whaale
Download Telegram
Создание и использование пользовательских исключений 🚨🛠️

Суть темы:
Пользовательские исключения позволяют создавать собственные типы ошибок, которые лучше отражают специфику вашего приложения. 🎯 Это делает код более читаемым и упрощает обработку ошибок. 🛠️

Применение:
Создание специфических ошибок для вашего приложения. 🎯
Улучшение читаемости и поддерживаемости кода. 📖
Упрощение отладки и обработки ошибок. 🐛

Пример кода:

class NegativeNumberError(Exception):
"""Исключение, которое выбрасывается, если число отрицательное."""
def __init__(self, value):
self.value = value
super().__init__(f"Отрицательное число недопустимо: {value}")

def check_positive(number):
if number < 0:
raise NegativeNumberError(number)
return number

try:
check_positive(-10)
except NegativeNumberError as e:
print(e) # Вывод: Отрицательное число недопустимо: -10


Почему это круто?
Пользовательские исключения делают код более понятным и выразительным. 🎨
👍2
Работа с регулярными выражениями (модуль re) 🔍
Суть темы:
Регулярные выражения — это мощный инструмент для поиска и обработки текста. 🧩 С их помощью можно находить, извлекать и заменять подстроки в тексте по сложным шаблонам. 🛠️ В Python для работы с регулярными выражениями используется модуль re. 🐍

Применение:
Поиск и извлечение данных из текста. 📄
Валидация вводимых данных (например, email или телефонных номеров). 📧📞

Пример кода:

import re

# Поиск email-адресов в тексте
text = "Свяжитесь с нами по email: support@example.com или info@example.org."
emails = re.findall(r'[\w\.-]+@[\w\.-]+', text)
print(emails) # Вывод: ['support@example.com', 'info@example.org']

# Замена текста по шаблону
new_text = re.sub(r'\d{2}-\d{2}-\d{4}', 'ДД-ММ-ГГГГ', 'Дата: 12-05-2023')
print(new_text) # Вывод: Дата: ДД-ММ-ГГГГ


Почему это круто?
Регулярные выражения позволяют решать сложные задачи обработки текста одной строкой кода. 🎯
Они универсальны и поддерживаются во многих языках программирования. 🌍
🔥1
Работа с лямбда-функциями и функциями высшего порядка 🎯

Суть темы:
Лямбда-функции — это анонимные функции, которые можно использовать для создания простых операций в одну строку. 🧩 Функции высшего порядка — это функции, которые принимают другие функции в качестве аргументов или возвращают их. 🛠️

Применение:
Создание простых функций "на лету". 🚀
Использование в функциях высшего порядка, таких как map, filter и reduce. 🔄
Упрощение кода и повышение его читаемости. 📖

Пример кода:

# Лямбда-функция для сложения двух чисел
add = lambda x, y: x + y
print(add(5, 3)) # Вывод: 8

# Использование лямбда-функции с map
numbers = [1, 2, 3, 4]
squared = list(map(lambda x: x ** 2, numbers))
print(squared) # Вывод: [1, 4, 9, 16]

# Использование лямбда-функции с filter
even_numbers = list(filter(lambda x: x % 2 == 0, numbers))
print(even_numbers) # Вывод: [2, 4]

Почему это круто?
Лямбда-функции позволяют писать компактный и выразительный код. 🎨
🔥1
Работа с модулем collections 🧩📚

Суть темы:
Модуль collections предоставляет специализированные типы данных, которые расширяют возможности стандартных коллекций Python. 🛠️

Применение:
Подсчет элементов с помощью Counter. 🔢
Создание именованных кортежей с помощью namedtuple. 📝
Управление порядком элементов с помощью deque. 🔄

Пример кода:

from collections import Counter, namedtuple, deque

# Использование Counter для подсчета элементов
data = ['apple', 'banana', 'apple', 'orange', 'banana', 'apple']
count = Counter(data)
print(count) # Вывод: Counter({'apple': 3, 'banana': 2, 'orange': 1})

# Использование namedtuple для создания именованных кортежей
Point = namedtuple('Point', ['x', 'y'])
p = Point(10, 20)
print(p.x, p.y) # Вывод: 10 20

# Использование deque для управления порядком элементов
d = deque([1, 2, 3])
d.appendleft(0)
d.append(4)
print(d) # Вывод: deque([0, 1, 2, 3, 4])


Почему это круто?
Модуль collections предоставляет мощные инструменты для работы с коллекциями. 💪
🔥2
Работа с модулем itertools 🔄
Суть темы:
Модуль itertools предоставляет набор инструментов для работы с итераторами. 🛠️ Эти инструменты позволяют создавать сложные итераторы для обработки данных, комбинирования элементов и генерации последовательностей. 🎯

Применение:
Генерация комбинаций и перестановок. 🔢
Создание бесконечных итераторов. ♾️
Обработка данных с помощью цепочек итераторов. 🔗

Пример кода:

import itertools

# Генерация всех возможных комбинаций
combinations = list(itertools.combinations('ABC', 2))
print(combinations) # Вывод: [('A', 'B'), ('A', 'C'), ('B', 'C')]

# Генерация бесконечного итератора
count = itertools.count(start=10, step=2)
for _ in range(5):
print(next(count)) # Вывод: 10, 12, 14, 16, 18

# Цепочка итераторов
chain = itertools.chain('ABC', 'DEF')
print(list(chain)) # Вывод: ['A', 'B', 'C', 'D', 'E', 'F']

Почему это круто?
Модуль itertools предоставляет мощные инструменты для работы с итераторами. 💪
Эти инструменты делают код более читаемым и эффективным. 🚀
🔥2
Работа с модулем functools 🛠️
Суть темы:
Модуль functools предоставляет набор инструментов для работы с функциями. 🎯 Эти инструменты позволяют создавать более гибкие и мощные функции, такие как частичные функции, мемоизация и декораторы. 🛠️

Применение:
Создание частичных функций с помощью partial. 🔧
Мемоизация результатов функций с помощью lru_cache. 🧠
Использование декораторов для изменения поведения функций. 🎩

Пример кода:

from functools import partial, lru_cache

# Создание частичной функции
def multiply(x, y):
return x * y

double = partial(multiply, 2)
print(double(5)) # Вывод: 10

# Мемоизация результатов функции
@lru_cache(maxsize=None)
def fibonacci(n):
if n < 2:
return n
return fibonacci(n-1) + fibonacci(n-2)

print(fibonacci(10)) # Вывод: 55


Почему это круто?
Модуль functools предоставляет мощные инструменты для работы с функциями. 💪
Эти инструменты делают код более читаемым и эффективным. 🚀
🔥2
🕵️‍♂️ Однострочный swap переменных без временной переменной
Обычно, если нужно поменять значения двух переменных местами, программисты используют временную переменную. В Python можно сделать это красиво и коротко!

💡 Пример:

a, b = 5, 10
a, b = b, a # Магия кортежей!

print(a, b)

Результат:

10 5

🔥 Без лишнего кода и лишних переменных!
🔥3
🎭 "Секретные" подчеркивания в Python
В Python подчеркивания (_) используются не просто так! Вот несколько интересных случаев:

Одиночное _ в интерактивном режиме Python
Последний результат сохраняется в переменной _:

>>> 10 + 5
15
>>> _ * 2 # Используем результат предыдущей операции
30


_ как имя переменной для неиспользуемых значений
Если переменная не нужна, её часто обозначают _:

for _ in range(3):
print("Hello!") # Повторит 3 раза, но переменная нам не нужна


Двойное подчеркивание (__) в именах переменных
Если переменная начинается с __, она получает "защиту" от случайного доступа (name mangling):

class Example:
def __init__(self):
self.__secret = "Не трогай меня!"

obj = Example()
print(dir(obj)) # Смотрим атрибуты, Python спрятал переменную!


Результат (сокращенно):

['_Example__secret', '__class__', ...]
🔥3
🐍 Генераторы и их "волшебная" экономия памяти
Генераторы в Python — это не просто стиль написания кода, это ещё и способ экономить память! Вместо того чтобы создавать и хранить весь список в памяти, генератор создает элементы "на лету", по одному за раз.

💡 Пример использования генератора:

def my_generator():
for i in range(5):
yield i

gen = my_generator()

print(next(gen)) # 0
print(next(gen)) # 1

Результат:

0
1

🔑 С помощью yield функция становится генератором, и каждый вызов next() будет возвращать следующий элемент. Такой подход уменьшает расход памяти, особенно если элементов много!
🔥2
🔄 zip() — идеальный способ для параллельного обхода нескольких списков
Функция zip() помогает вам одновременно работать с несколькими коллекциями. Она "пакует" их элементы по парам, что удобно, когда нужно итеративно проходить по двум или больше спискам.

💡 Пример использования:

names = ["Alice", "Bob", "Charlie"]
scores = [85, 90, 78]

for name, score in zip(names, scores):
print(f"{name} scored {score}")

Результат:

Alice scored 85
Bob scored 90
Charlie scored 78

🎯 Преимущество: Не нужно использовать индексы для доступа к элементам! zip() "параллельно" соединяет элементы, делая код более читаемым и компактным.
🔥1
🚀 Крутая фишка enumerate() — избавляемся от лишних счетчиков!
Часто нужно перебирать список и знать индекс каждого элемента. Вместо того чтобы вручную заводить i = 0 и увеличивать его в цикле, используйте enumerate()!

💡 Пример использования:

fruits = ["🍎 Apple", "🍌 Banana", "🍒 Cherry"]

for index, fruit in enumerate(fruits, start=1):
print(f"{index}. {fruit}")

Результат:

1. 🍎 Apple
2. 🍌 Banana
3. 🍒 Cherry


🔥 Почему это удобно?
Код становится чище и короче
Можно сразу задать нужный стартовый индекс (start=1)
🔥2
🎲 Случайный выбор из списка с random.choice()
Если нужно выбрать случайный элемент из списка, не нужно писать сложные циклы. Просто используйте random.choice()!

💡 Пример использования:

import random

movies = ["🎬 Inception", "🎥 Interstellar", "📽 The Matrix", "🎞 The Dark Knight"]

random_movie = random.choice(movies)

print(f"Сегодня стоит посмотреть: {random_movie}")

Результат (например):

Сегодня стоит посмотреть: 🎞 The Dark Knight


🎯 Дополнительно:
random.choices() позволяет выбрать несколько элементов сразу
random.sample() выбирает без повторений
Используйте random и пусть Python делает выбор за вас! 🎰
🔥3
Как засечь время выполнения кода? timeit в помощь!
Хотите узнать, сколько времени занимает выполнение кода? Python предлагает удобный модуль timeit, который точно измеряет производительность.

💡 Пример использования:

import timeit

code = """
result = [x**2 for x in range(1000)]
"""

execution_time = timeit.timeit(code, number=1000)

print(f"Время выполнения: {execution_time:.5f} секунд")


Результат (пример):

Время выполнения: 0.08523 секунд


🔥 Зачем использовать timeit?
Точнее, чем time.time(), так как выполняет код многократно
Удобен для оптимизации алгоритмов
2🔥1
🔥 Расширенный print() — настраивай вывод под себя!
Функция print() в Python может намного больше, чем просто выводить текст. Можно менять разделитель и конец строки!

💡 Пример 1: Задаем кастомный разделитель (sep)

print("Python", "is", "awesome", sep="🔥")


Результат:

Python🔥is🔥awesome


💡 Пример 2: Изменяем конец строки (end)

print("Первая строка", end=" 😎 ")
print("Вторая строка")


Результат:

Первая строка 😎 Вторая строка


🎯 Когда это полезно?
sep удобно использовать для форматирования вывода
end помогает избежать лишних переводов строк
Теперь print() — это не просто вывод, а гибкий инструмент! 🚀
🔥1
🛠 Как проверить, занята ли нужная переменная? locals() в помощь!
Иногда нужно узнать, существует ли переменная в текущей области видимости. Для этого можно использовать locals()!

💡 Пример использования:

name = "Alice"

if "name" in locals():
print("Переменная 'name' существует!")
else:
print("Переменная 'name' не найдена.")


Результат:

Переменная 'name' существует!

🔥 Полезно, когда:
Нужно избежать ошибок при работе с переменными
Отлаживаете код и хотите проверить, какие переменные уже созданы
🔥21
📂 Как быстро узнать размер объекта в памяти? sys.getsizeof()!
Хотите узнать, сколько памяти занимает переменная? В Python это можно сделать с помощью sys.getsizeof()!

💡 Пример использования:

import sys

a = 10
b = "Hello, world!"
c = [1, 2, 3, 4, 5]

print(sys.getsizeof(a)) # Размер переменной a
print(sys.getsizeof(b)) # Размер строки b
print(sys.getsizeof(c)) # Размер списка c

Результат (пример):

28 # Размер int
62 # Размер строки
96 # Размер списка

📌 Интересный факт:
Пустой список занимает 56 байт, даже если в нем нет элементов!
sys.getsizeof() учитывает служебную информацию, поэтому иногда реальный размер данных больше.
Используйте это для оптимизации кода и экономии памяти! 🚀
🌐 Как "пропускать" элементы в цикле с помощью continue?
Когда вам нужно пропустить текущую итерацию цикла и перейти к следующей, не завершая весь цикл, можно использовать ключевое слово continue. Это полезно, например, когда хотите исключить определённые элементы без прерывания работы цикла.

💡 Пример использования:

for i in range(10):
if i % 2 == 0:
continue # Пропускаем чётные числа
print(i)


Результат:

1
3
5
7
9

🔥 Когда это удобно?
Если нужно исключить некоторые условия без завершения цикла
Позволяет сократить код, не используя вложенные if конструкции
🔥2
🎨 Цветной вывод с использованием модуля colorama
Хотите сделать вывод вашего кода более ярким и заметным? В Python это можно сделать с помощью модуля colorama, который добавляет цвет к выводу в консоли!

💡 Пример использования:

from colorama import init, Fore

init() # Инициализация
print(Fore.RED + "Это текст красного цвета!")
print(Fore.GREEN + "А это — зелёный!")


Результат:
Текст "Это текст красного цвета!" будет красным
Текст "А это — зелёный!" будет зелёным
🎯 Когда это полезно?

Удобно для выделения ошибок или важных сообщений в логах
Применяется для создания более красочных выводов в консольных приложениях
👍2
🔢 Секреты использования sorted() — сортировка с кастомной логикой!
Функция sorted() позволяет сортировать список не только по умолчанию, но и с помощью собственной логики сортировки через параметр key.

💡 Пример использования с ключом key:

# Список слов
words = ["banana", "apple", "cherry", "blueberry"]

# Сортируем по длине слова
sorted_words = sorted(words, key=len)

print(sorted_words)


Результат:

['apple', 'banana', 'cherry', 'blueberry']

🔥 Как это работает?
sorted() сортирует элементы с использованием функции, переданной в key. В примере мы сортируем по длине каждого слова.
Вы можете использовать любую логику для сортировки, например, сортировать по обратному порядку, по первой букве или числовым значениям.
🔥21
🐍 lambda — краткие анонимные функции в одну строку
Иногда нужна функция, но ради одной операции не хочется писать def. В таких случаях помогает lambda — анонимные функции в одну строку!

💡 Пример использования:

square = lambda x: x ** 2
print(square(5)) # 25


Результат:

25


🔥 Где полезно?
Когда нужно передать функцию в map(), filter(), sorted()
Для компактного кода без создания лишних функций

💡 Пример с sorted() и lambda:

words = ["banana", "apple", "cherry", "blueberry"]
sorted_words = sorted(words, key=lambda x: x[-1]) # Сортировка по последней букве
print(sorted_words)

Результат:

['banana', 'apple', 'blueberry', 'cherry']
🔥2
🔎 Фильтрация данных с filter()
Если нужно отфильтровать элементы списка по какому-то условию, используйте filter(). Эта функция возвращает только те элементы, которые соответствуют заданному критерию.

💡 Пример использования:

numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

even_numbers = list(filter(lambda x: x % 2 == 0, numbers))

print(even_numbers)


Результат:

[2, 4, 6, 8, 10]


🔥 Когда использовать?
Когда нужно убрать ненужные элементы из списка
Работает быстрее, чем for + if
🔥1