2619
🐍 Канал о программировании на языке Python. Тематические уроки и лайфхаки. 👽 Админ - @it_dashka 🔊 Купить рекламу: https://telega.in/c/byteofpython 👉 Чат: @abyteofpython 👉 Поделиться с друзьями: @byteofpython
LLM-модули: как маленькая модель учится у большой
Как передавать знания от большой LLM в маленькую без файн-тюнинга? Разбираем метод через кросс-внимание и LLM-модули, который позволяет обучать модели для узких задач без больших затрат.
🎯 set() в Python: работа с уникальными даннымиset() — это неупорядоченная коллекция уникальных элементов, которая позволяет легко убирать дубликаты и быстро выполнять операции над множествами.
✅ Пример:
numbers = [1, 2, 2, 3, 4, 4, 5]
unique_numbers = set(numbers)
print(unique_numbers) # {1, 2, 3, 4, 5}
set() • Хранит только уникальные элементы. • Поддерживает быстрый поиск (O(1)). • Не сохраняет порядок элементов. • Объединение: set1 | set2 • Пересечение: set1 & set2 • Разность: set1 - set2set() для удаления дубликатов и эффективной работы с уникальными данными!
Читать полностью…
🔥 Что такое slots в Python и зачем он нужен?slots ограничивает список атрибутов у экземпляров класса, экономя память за счет отказа от dict.
✅ Обычный класс без slots:
class Person:
def init(self, name, age):
self.name = name
self.age = age
p = Person("Alice", 25)
p.city = "New York" # Можно добавить новый атрибут
slots:class Person:
slots = ("name", "age") # Разрешены только эти атрибуты
def init(self, name, age):
self.name = name
self.age = age
p = Person("Alice", 25)
p.city = "New York" # ❌ AttributeError: 'Person' object has no attribute 'city'
slots • Экономит память (не создается dict) • Ускоряет доступ к атрибутам • Предотвращает создание лишних атрибутовslots, если нужно много однотипных объектов и важна производительность!
Читать полностью…
Немножко о реализации set в Python
Почему set в Python не всегда такой хаотичный, как кажется? Разбираемся, как множества устроены под капотом, как работают хэш-таблицы и почему порядок элементов иногда оказывается предсказуемым.
↔️ Разница между is и == в Python
🔹 == (равенство) проверяет, равны ли значения объектов:
a = [1, 2, 3]
b = [1, 2, 3]
print(a == b) # True (значения одинаковые)
is (идентичность) проверяет, указывают ли переменные на один и тот же объект в памяти:print(a is b) # False (разные объекты)
int, str, tuple) Python кеширует значения:x = 256
y = 256
print(x is y) # True (указывают на один объект)
== для сравнения значений и is для проверки, ссылаются ли переменные на один объект в памяти!
Читать полностью…
🔥 Mutable vs Immutable в Python
В Python все данные — это объекты, и они делятся на изменяемые (mutable) и неизменяемые (immutable).
🔹 Неизменяемые (immutable): нельзя изменить после создания
✅ int, float, str, tuple, frozenset
x = "hello"
x += " world" # Создается новый объект, а не изменяется старый
list, dict, set, bytearraylst = [1, 2, 3]
lst.append(4) # Список изменяется в той же области памяти
def modify_list(lst):
lst.append(99) # Изменяет оригинальный список!
my_list = [1, 2, 3]
modify_list(my_list)
print(my_list) # [1, 2, 3, 99]
• Используйте tuple, если данные не должны изменяться.• Будьте осторожны с изменяемыми объектами при передаче в функции.• Если нужно копирование, используйте .copy() или deepcopy().
Читать полностью…
Зачем нужно ключевое слово yield в Python?yield используется для создания генераторов, которые возвращают данные по мере запроса, вместо хранения всего результата в памяти.
Пример:
def count_up_to(n):
count = 1
while count <= n:
yield count # Возвращает значение и приостанавливает выполнение
count += 1
for num in count_up_to(5):
print(num)
yield позволяет приостанавливать и возобновлять выполнение функции, экономя память и упрощая работу с потоками данных.
Читать полностью…
В Python typer — это современная и удобная библиотека для создания CLI-приложений (интерфейсов командной строки).
Применение typer особенно полезно при разработке инструментов командной строки, скриптов автоматизации и других приложений, где требуется взаимодействие с пользователем через терминал.
пример использования typer:
import typer
app = typer.Typer()
@app.command()
def hello(name: str):
"""
Простое приветствие.
"""
print(f"Привет, {name}!")
@app.command()
def goodbye(name: str, formal: bool = False):
"""
Прощание. Можно сделать формальным.
"""
if formal:
print(f"До свидания, {name}!")
else:
print(f"Пока, {name}!")
if name == "main":
app()
❓ Как реализовать менеджер контекста в Python с помощью класса? В каких случаях его стоит использовать? Приведите пример его реализации и покажите, как он работает
❗️Менеджеры контекста позволяют правильно управлять ресурсами, например, открытием и закрытием файлов, установлением и завершением соединений с базами данных или блокировкой и освобождением ресурсов в многопоточном программировании. Классический способ создания менеджера контекста — использование конструкции with. Менеджеры контекста помогают упрощать код и предотвращают утечки ресурсов, так как гарантируют выполнение завершающих действий даже при возникновении исключений.
Для создания менеджера контекста с помощью класса необходимо определить два метода:
enter() — код, выполняемый при входе в контекст (with).
exit(self, exc_type, exc_val, exc_tb) — код, выполняемый при выходе из контекста, даже если внутри возникло исключение.
💡Пример:
Допустим, у нас есть класс DatabaseConnection, который имитирует подключение к базе данных. Менеджер контекста будет обеспечивать автоматическое подключение и отключение от базы данных:
class DatabaseConnection:
def init(self, db_name):
self.db_name = db_name
def enter(self):
# Действия при входе в контекст
print(f"Connecting to database '{self.db_name}'...")
self.connection = f"Connection to {self.db_name}"
return self.connection # Возвращаем объект соединения
def exit(self, exc_type, exc_val, exc_tb):
# Действия при выходе из контекста (закрытие соединения)
print(f"Closing connection to '{self.db_name}'...")
self.connection = None
return False # Если возникло исключение, не подавлять его
# Использование менеджера контекста
with DatabaseConnection('test_db') as conn:
print(f"Using {conn} to execute queries...")
Connecting to database 'test_db'...
Using Connection to test_db to execute queries...
Closing connection to 'test_db'...
💩 Какова разница между методами getattr и getattribute?
Оба этих метода являются магическими.
🔘getattr
class Missing:
attr = 42
def getattr(self, name):
print(f"In getattr, asked for {name}")
return 73
m = Missing()
print(m.attr) # 42
print(m.xyz) # In getattr, asked for xyz; 73
getattribute
class Always:
attr = 42
def getattribute(self, name):
print(f"In getattribute, asked for {name}")
return 73
a = Always()
print(a.attr) # In getattribute, asked for attr; 73
print(a.xyz) # In getattribute, asked for xyz; 73
getattribute — это метод, который управляет всеми запросами атрибутов, тогда как getattr вызывается, когда getattribute не находит атрибут.
Читать полностью…
✈️Функция range() в Python - это важный инструмент для создания последовательности чисел. Хотя она часто используется в связке с циклом for, есть и другие способы, как можно использовать эту функцию.
➡️Использование range() в списковых включениях
Списковые включения - это мощный инструмент Python, который позволяет создавать списки в одну строку кода. Функция range() может быть использована в списковых включениях для создания списков, которые следуют определенной числовой последовательности. Например, [x for x in range(10)] создаст список чисел от 0 до 9.
➡️Использование range() в генераторах
Генераторы в Python - это специальный тип итераторов, который позволяет генерировать элементы "на лету", экономя память. Функцию range() можно использовать в генераторах для создания последовательностей чисел. Например, (x for x in range(10)) создаст генератор, который производит числа от 0 до 9.
🐍Pythoner
➡️Что такое importlib?
Это встроенная библиотека Python, которая предоставляет интерфейс для механизма импорта. С ее помощью вы можете программно импортировать модули, перезагружать их и даже создавать свои собственные импортеры!
➡️Вот простой пример использования importlib:
import importlib
# Динамический импорт модуля
math = importlib.import_module('math')
# Использование импортированного модуля
print(math.pi) # Выводит 3.141592653589793
# Перезагрузка модуля
importlib.reload(math)
✈️В Django ORM можно использовать механизм миграций для изменения структуры базы данных без необходимости вручную вносить изменения через SQL запросы.
Миграции позволяют вам определять изменения в моделях и применять их к базе данных автоматически.
➡️Для начала работы с миграциями в Django необходимо создать начальное состояние базы данных, которое будет соответствовать текущим моделям вашего приложения.
➡️Затем, чтобы применить миграции к базе данных, можно воспользоваться командой python manage.py migrate, которая применит все необходимые изменения к базе данных. При этом Django будет автоматически отслеживать и применять новые миграции при изменениях в моделях.
➡️Миграции в Django ORM могут включать различные операции, такие как создание новых таблиц, добавление и удаление полей, изменение типа данных и многое другое. Кроме того, можно создавать собственные миграции с помощью команды python manage.py makemigrations --empty, чтобы определить свои собственные изменения в базе данных.
Хотите стать востребованным Python-разработчиком? Пройдите курс от Hexlet!
Начните с основ и за 10 месяцев освоите один из самых популярных языков для бэкенда, научитесь создавать полноценные сайты и веб-приложения и реализовать внутреннюю логику работы программ на фреймворке Django.
🎁 🎃 Бонусы к Черной пятнице! Вас ждет специальное предложение - скидка до 81 000 ₽. на обучение и второй курс в подарок!
Вас ждут сотни упражнений, 4 проекта для портфолио на GitHub, а во время обучения вы также поучаствуете в Карьерном треке чтобы найти свою первую работу в IT.
Пройдите 5 бесплатных уроков и откройте для себя увлекательный процесс обучения. Поймите, насколько интересен и перспективен этот путь, и получите уникальную возможность продолжить обучение на полном курсе со скидкой!
⚙️ Сборщик мусора в Python: как он работает?
В Python управление памятью происходит автоматически с помощью сборщика мусора (Garbage Collector, GC). Он следит за объектами, которые больше не используются, и освобождает занимаемую ими память.
🔹 Подсчет ссылок
Каждый объект хранит количество ссылок на себя. Когда это число становится нулем, объект автоматически удаляется. Однако если два объекта ссылаются друг на друга, но больше нигде не используются, Python не сможет их удалить.
🔹 Алгоритм поколений
Чтобы эффективно управлять памятью, Python разделяет объекты на три группы:• Gen 0 — новые объекты, проверяются чаще всего.• Gen 1 — пережившие одну проверку, удаляются реже.• Gen 2 — долгоживущие объекты, проверяются редко.
Новые объекты проверяются чаще, а старые — реже, что ускоряет работу сборщика мусора.
🔹 Управление GC
Python справляется сам, но можно управлять GC вручную:• gc.collect() — запустить сборку мусора вручную.• gc.disable() — отключить GC (не рекомендуется).
GC в Python делает управление памятью удобным, но понимание его работы помогает писать более эффективный код и избегать утечек памяти.
🔗 zip() в Python: удобное объединение данныхzip() соединяет элементы из нескольких последовательностей попарно, создавая кортежи с одинаковыми индексами.
✅ Пример:
keys = ["name", "age", "city"]
values = ["Alice", 25, "NY"]
data = dict(zip(keys, values))
print(data) # {'name': 'Alice', 'age': 25, 'city': 'NY'}
zip()? • Комбинирует списки в пары. • Завершается, когда самый короткий список заканчивается. • Использует итератор, экономя память. • Генерация словарей из двух списков. • Итерация по нескольким последовательностям одновременно. • Упрощение работы с табличными данными.Используйте zip() для компактного и читаемого кода!Читать полностью…
🐍 Что делает enumerate() в Python?enumerate() добавляет индекс при итерации по списку.
✅ Пример:
fruits = ["🍎", "🍌", "🍇"]
for i, fruit in enumerate(fruits, start=1):
print(i, fruit)
1 🍎
2 🍌
3 🍇
• Упрощает работу с индексами в циклах• Делает код читаемым без range(len())enumerate() вместо range(len()) для чистого и Pythonic-кода!
Читать полностью…
Что делает @property в Python?@property превращает метод класса в свойство, позволяя обращаться к нему без скобок.
Пример:
class Person:
def init(self, name):
self._name = name
@property
def name(self):
return self._name
p = Person("Alice")
print(p.name) # Alice (как атрибут, но с логикой)
• Позволяет использовать методы как атрибуты• Защищает данные от прямого изменения• Позволяет добавить логику без изменения интерфейса@property делает код чище и безопаснее, улучшая инкапсуляцию!
Читать полностью…
🔥 lambda — короткие функции в Pythonlambda — это анонимная функция, которая записывается в одну строку и не требует def. Используется там, где нужна простая операция без имени функции.
✅ Пример (обычная функция vs. lambda):
def square(x):
return x ** 2
square_lambda = lambda x: x ** 2
print(square(5)) # 25
print(square_lambda(5)) # 25
map() — Применение функции к спискуnums = [1, 2, 3, 4]
squared = list(map(lambda x: x ** 2, nums))
print(squared) # [1, 4, 9, 16]
filter() — Фильтрация данныхeven = list(filter(lambda x: x % 2 == 0, nums))
print(even) # [2, 4]
sorted() — Сортировка по ключуpairs = [(1, 'one'), (3, 'three'), (2, 'two')]
pairs.sort(key=lambda x: x[0])
print(pairs) # [(1, 'one'), (2, 'two'), (3, 'three')]
lambda?• Когда функция простая и короткая• Когда она нужна один разlambda, если логика сложная – лучше писать def.
Читать полностью…
🔥 *args и **kwargs в Python
🔹 *args — передает позиционные аргументы как кортеж:
def add_numbers(*args):
return sum(args)
print(add_numbers(1, 2, 3)) # 6
**kwargs — передает именованные аргументы как словарь:def greet(**kwargs):
print(kwargs)
greet(name="Alice", age=25) # {'name': 'Alice', 'age': 25}
*args для списка значений и **kwargs для гибких параметров!
Читать полностью…
🐍 GIL в Python: как это влияет на многопоточность
Global Interpreter Lock (GIL) — это механизм в CPython, который ограничивает выполнение Python-кода одним потоком за раз, даже на многопроцессорных системах.
🔹 Зачем нужен GIL?
Он предотвращает проблемы с управлением памятью и упрощает работу интерпретатора. Однако из-за него многопоточные программы не могут эффективно использовать несколько ядер процессора.
🔹 Когда GIL мешает?• В CPU-интенсивных задачах (например, обработка данных, вычисления) многопоточность не дает прироста производительности.• В I/O-интенсивных задачах (сетевые запросы, работа с файлами) GIL почти не влияет, так как потоки могут освобождать блокировку во время ожидания операций ввода-вывода.
✅ Решение:
Если нужна настоящая параллельность, используйте многопроцессорность (multiprocessing), которая запускает отдельные процессы без GIL, или попробуйте альтернативные реализации Python, такие как Jython или PyPy.
⚡ Ищешь работу или стажировку в IT?
Тогда тебе точно будут полезны эти каналы:
БИГТЕХ – стажировки и вакансии
👉 ПОДПИСАТЬСЯ
Young & Junior - вакансии IT
👉 ПОДПИСАТЬСЯ
Young Стажёр - стажировки ИТ
👉 ПОДПИСАТЬСЯ
Junojobs
👉 ПОДПИСАТЬСЯ
Макс из < codereview />
👉 ПОДПИСАТЬСЯ
Помни! Твои скиллы достойны лучшего оффера.
Подпишись на эти каналы и рекрутеры однозначно заметят тебя.
Функциональное программирование (ФП).
➡️Что такое функциональное программирование?
Функциональное программирование - это парадигма, в которой процесс вычисления рассматривается как вычисление математических функций. Основная идея заключается в том, чтобы избегать изменяемого состояния и мутаций данных.
➡️Почему ФП становится популярнее?
💬Упрощение параллельного программирования: Отсутствие побочных эффектов делает код более предсказуемым и легким для распараллеливания.
💬Меньше багов: Неизменяемость данных и чистые функции снижают вероятность ошибок, связанных с состоянием программы.
💬Более читаемый код: ФП поощряет написание небольших, специализированных функций, что улучшает читаемость и поддерживаемость кода.
💬Легкость тестирования: Чистые функции легче тестировать, так как их поведение зависит только от входных данных.
💬Производительность: Некоторые функциональные концепции, такие как ленивые вычисления, могут повысить производительность программ.
✈️Конструкция raise используется для генерации исключений. Когда в коде происходит что-то непредвиденное или некорректное — можно сгенерировать исключение командой raise.
➡️Основные моменты конструкции raise:
—Возбуждение существующих исключений: Вы можете использовать raise без каких-либо параметров в блоке except, чтобы повторно вызвать текущее исключение.
—Создание собственных исключений: Вы можете создать или вызвать собственное исключение, создав объект исключения и передав его в raise.
➡️Пример использования raise:
def divide(a, b):
if b == 0:
raise ValueError("Деление на ноль невозможно.")
return a / b
try:
result = divide(10, 0)
except ValueError as e:
print(f"Ошибка: {e}")
divide вызывает исключение ValueError, если второй аргумент равен нулю. В блоке try мы пытаемся выполнить деление, и если возникает ошибка, мы перехватываем её и выводим сообщение об ошибке.
Читать полностью…
✈️Django ORM (Object-Relational Mapping) — это мощный инструмент, который позволяет разработчикам взаимодействовать с базой данных, используя объекты Python.
➡️Создание моделей
Одним из основных аспектов работы с Django ORM является создание моделей. Модель — это класс Python, который описывает структуру таблицы в базе данных. Django ORM автоматически создает таблицу в соответствии с заданной моделью. Модели могут включать поля, которые соответствуют столбцам таблицы, а также методы и связи с другими моделями. Определение модели в Django ORM интуитивно понятно и упрощает процесс разработки.
Вот пример создания модели в Django ORM:
from django.db import models
class Product(models.Model):
name = models.CharField(max_length=100)
price = models.DecimalField(max_digits=5, decimal_places=2)
description = models.TextField()
# Выборка всех объектов модели
products = Product.objects.all()
# Фильтрация объектов по условию
cheap_products = Product.objects.filter(price__lt=10)
# Сортировка объектов
sorted_products = Product.objects.order_by('-price')
# Агрегирование данных
total_price = Product.objects.aggregate(Sum('price'))
Почему Python востребован среди DevOps-инженеров?
Мир активно движется к максимальной автоматизации всего, что только можно. И чтобы развивать себя как инженера, уметь программировать необходимо. Python — это мастхев.
👉 У Python понятный синтаксис, разрабатывать на нём быстро.
👉 В нём есть куча библиотек.
👉 Python отлично справляется с автоматизацией задач, работой с API, управлением инфраструктурой (например, через Ansible), а также с написанием скриптов для CI/CD пайплайнов и мониторинга.
Всё это делает его удобным для использования в сложных DevOps-проектах.
Узнать, насколько хорошо вы владеете Python, можно в нашем тесте. Переходите в бота и отвечайте на 5 вопросов🔗
#реклама
О рекламодателе
erid: LjN8KAkrn
Есть такой один интересный пакет JMESpath, который позволяет декларативно указать, как извлекать элементы из документа JSON.
➡️Основные примеры использования:
import jmespath
jmespath.search('foo.bar', {'foo': {'bar': 'baz'}})
# output: 'baz'
jmespath.search('foo.*.name', {'foo': {'bar': {'name': 'one'}, 'baz':
{'name': 'two'}}})
# output: ['one', 'two']
➡️NamedTuple
NamedTuple - это подтип кортежа, который позволяет объявлять собственные именованные типы, которые могут использоваться в качестве структуры данных. Он предоставляет возможность определить тип данных с помощью именованных полей. Каждое поле имеет свой собственный тип данных. Это может быть полезно в случаях, когда вам нужно создать объекты с определенными свойствами.
К примеру, если вы создаете объекты, представляющие собой записи в базе данных, вы можете использовать NamedTuple, чтобы создать тип данных, содержащий поля, соответствующие полям в таблице.
from collections import namedtupleЧитать полностью…
Person = namedtuple('Person', ['name', 'age'])
person1 = Person(name='John', age=30)
person2 = Person(name='Jane', age=25)
print(person1.name) # John
print(person2.age) # 25
➡️"Чистая" функция - это функция, которая при выполнении одного и того же входного значения всегда возвращает одинаковый результат и не имеет побочных эффектов.
➡️Пример чистой функции
Давайте рассмотрим пример простой чистой функции на языке Python. Предположим, у нас есть функция double, которая удваивает переданное число:
def double(number):
return number * 2
my_list = []
def add_to_list(value):
my_list.append(value)