ITDEAL
1.11K subscribers
749 photos
108 videos
11 files
572 links
Разработка комплексных IT решений для бизнеса и частных заказчиков.

Чат: @pybytes_chat

Founder: @lunasantrope
Download Telegram
Эффективность в каждой строке (Итераторы и Генераторы)


➡️Python предоставляет мощные инструменты для работы с данными - итераторы и генераторы. Они оптимизируют использование памяти и упрощают код.


🧐Итераторы - это объекты, обеспечивающие проход по элементам коллекции по одному за раз. Метод __iter__() вызывается для создания итератора, а __next__() - для доступа к следующему элементу. При достижении конца коллекции, __next__() вызывает исключение StopIteration (Эта ошибка автоматически обрабатывается такими конструкциями как for).

my_list = [1, 2, 3]
iterator = iter(my_list) # __iter__() вызывается здесь
print(next(iterator)) # __next__() вызывается здесь


🙉Генераторы - это упрощенные итераторы, создаваемые с помощью функций и выражений. Когда вы вызываете генератор, Python возвращает объект-итератор. Каждый вызов функции next() для этого итератора возобновляет выполнение функции-генератора с того места, где было последнее слово yield, и продолжается до следующего.

def my_generator(n):
for i in range(n):
yield i ** 3

gen = my_generator(3) # Возвращает итератор
print(next(gen)) # Возобновляет выполнение до следующего yield


🥰Используйте эти концепции для создания более оптимизированного и чистого кода.


🔝 PyBytes Media | Telegram / 📷 Instagram / 📈Mentor Service
Please open Telegram to view this post
VIEW IN TELEGRAM
3😈2
🚀 Ищем Разработчика!


👨‍💼 Специалист по разработке ПО, который знает Python. Нас инетресует Middle специалист.


Требования к знаниям:
➡️ Python 3.9+
➡️ aiogram 3.0
➡️ asyncio
➡️ aiohttp
➡️ postgresql
➡️ docker
➡️ docker compose
➡️ SQL / noSQL
➡️ sqlalchemy
➡️ alembic
➡️ typing
➡️ Портфолио
➡️ 18+
➡️ ООП
➡️ Коммуникабельность
➡️ Умение работать в команде
➡️ Ответственность
➡️ Умение воспринимать большие нагрузки


👨‍💼 Оклад от 800$ и выше


🤖 Контакты @lunasantrope
Please open Telegram to view this post
VIEW IN TELEGRAM
👍71🍾1
Управление ресурсами (with в Python)

ℹ️Python предоставляет уникальный инструмент для эффективного управления ресурсами, который часто недооценивают. Это оператор with, который обеспечивает правильное управление ресурсами, такими как файлы, сетевые соединения и блокировки.

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

with open('file.txt', 'r') as file:
data = file.read()

> Файл автоматически закроется после выхода из блока with.

😎Зачем это нужно? - Использование with позволяет избежать распространенных ошибок, таких как утечка ресурсов или их неправильное закрытие, особенно при возникновении исключений.

😱Под капотом - with работает с объектами, которые поддерживают контекстное управление. Это означает, что объект должен иметь методы __enter__ и __exit__. В методе __enter__ обычно происходит инициализация ресурса, а в __exit__ - его освобождение.

class ManagedResource:
def __enter__(self):
print("Resource is acquired.")
return self
def __exit__(self, exc_type, exc_value, traceback):
print("Resource is released.")

with ManagedResource() as resource:
print("Using the resource.")

> Вывод:
> Resource is acquired.
> Using the resource.
> Resource is released.

❤️‍🔥Интегрируйте эту практику в свои проекты для более чистого, безопасного и эффективного управления ресурсами.

🔝 PyBytes Media | Telegram / 📷 Instagram / 📈Mentor Service
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥101👍1
Что выведет данный код?

a, b = b[0] = [0, [0]] print(b)
Anonymous Quiz
39%
IndexError
30%
[[0, [0]]]
22%
RuntimeError
9%
[[0, [...]]]
🗿103👍3
Типизация в Python

😈 В последние годы Python сделал большой шаг вперёд, предоставив программистам возможность использовать аннотации типов. Это нововведение значительно упрощает жизнь разработчиков, делая код более читаемым и безопасным.

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

def greet(name: str) -> str:
return f"Привет, {name}!"

> Мы уточняем что функция принимает и возвращает строку

tasks: list[str] = ["python", "PyBytes"]

> tasks должен содержать только строки

configuration: dict[str, float] = {"volume": 0.5, "brightness": 0.8}

> В этом словаре все ключи это строки, а значения - числа с плавающей запятой


🔍 Преимущества аннотаций типов:
— Повышение читаемости кода
— Упрощение отладки
— Интеграция с инструментами статического анализа (Например MyPy)


🧑‍💻 Интеграция с современными библиотеками:
Аннотации типов отлично сочетаются с такими библиотеками, как Pydantic, которые используют типизацию для валидации данных и создания моделей данных с автоматическими проверками типов.


❗️Важно помнить:
Аннотации типов — это не более чем подсказки для разработчиков и инструментов статического анализа. Они не влияют на выполнение вашего кода, но служат мощным инструментом для предотвращения ошибок и улучшения качества кода.


🔝 PyBytes Media | Telegram / 📷 Instagram / 📈Mentor Service
Please open Telegram to view this post
VIEW IN TELEGRAM
👍43🌭2
QUIZ: Что выведет данный код?

print(True is 1)
Anonymous Quiz
64%
True
37%
False
3
Погружаемся в True, False и None в Python


📈 Python обладает тремя основными объектами, играющими ключевую роль в логике и управлении потоком программ: True, False и None.

- True и False являются экземплярами типа bool, который, в свою очередь, является подклассом int. Это означает, что они могут участвовать в математических выражениях как 1 и 0.


# Пример с математикой
результат = True + False # будет 1


😱 Создание подклассов для bool запрещено, чтобы обеспечить чистоту и предсказуемость кода.

➡️Взгляд на None и NoneType

None —
это единственный экземпляр NoneType и представляет собой синглтон, указывающий на отсутствие значения. Эта особенность позволяет использовать None в качестве уникального индикатора "пустоты" или "ничего".


# Демонстрация None
a = None
print(a is None) # Выведет True


😠 Каждая функция в Python, которая не имеет явного return, по умолчанию возвращает None. Это важно для понимания поведения функций, которые не предназначены для возвращения значения.


def test_func():
pass

print(test_func() is None) # Выведет True


😎Понимание True, False и None необходимо для осознания логических операций и управления потоком в Python, что делает код более чистым и интуитивно понятным.


🔝 PyBytes Media | Telegram / 📷 Instagram / 📈Mentor Service
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥7👍4💋3
Итераторы и генераторы [Часть 2]

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


for i in range(5):
print(i)


🛠 Вместо того, чтобы создавать списки, попробуйте использовать генераторы для обработки данных. Генераторы занимают меньше памяти и работают быстрее, так как обрабатывают элементы последовательно.


# Список
numbers_list = [x * 2 for x in range(10)]

# Генератор
numbers_gen = (x * 2 for x in range(10))


🔄 Один из продвинутых инструментов генераторов - метод send(), который позволяет отправлять значение обратно в генератор. Это открывает возможности для интерактивного взаимодействия с генератором.


def counter():
n = 0
while True:
received = yield n
if received is not None:
n = received
else:
n += 1

gen = counter()
print(next(gen))
> 0
print(gen.send(10))
> 10
print(next(gen))
> 11


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


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

🔝 PyBytes Media | Telegram / 📷 Instagram / 📈Mentor Service
Please open Telegram to view this post
VIEW IN TELEGRAM
5👍2🔥2
QUIZ: Что выведет данный код?

print(-~1)
Anonymous Quiz
10%
2
49%
TypeError
15%
0
26%
🫠
😈3🌭2
Оператор "Морж" (Walrus Operator)

💃Оператор "Морж" (`:=`), введённый в Python 3.8, представляет собой мощный инструмент для сокращения кода и улучшения его читаемости. Этот оператор позволяет назначать значения переменным внутри выражений, что особенно полезно в условиях, циклах и списках.

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


if (n := len(a)) > 10:
    print(f"Список слишком длинный, {n} элементов")


🔄 Этот оператор также идеально подходит для циклов, позволяя упростить код при работе с итераторами:


while (line := input("Введите что-нибудь: ")) != "стоп":
    print(f"Вы ввели {line}")


✏️В списковых включениях оператор "Морж" может быть использован для фильтрации элементов без необходимости повторного вычисления:


numbers = [0, 1, 2, 3, 4]
squared_even_numbers = [n2 for n in numbers if (n2 := n ** 2) % 2 == 0]


🔍 Для демонстрации более сложного применения, давайте рассмотрим использование в условной логике с множественными if/elif (картинка "code 1").

📊Оператор "Морж" значительно упрощает код, делая его не только короче, но и более читаемым. Используйте его, чтобы сделать свои программы более эффективными и понятными.

🔝 PyBytes Media | Telegram / 📷 Instagram / 📈Mentor Service
Please open Telegram to view this post
VIEW IN TELEGRAM
5❤‍🔥3
Dataclasses [Часть 1]

😈 Введение в dataclasses: Python предлагает мощный механизм для упрощения работы с классами данных - модуль dataclasses. Этот инструмент позволяет автоматически добавлять специальные методы в классы: __init__, __repr__, __eq__, и другие, основываясь на аннотациях типов полей класса.


from dataclasses import dataclass

@dataclass
class Point:
⠀⠀x: int
⠀⠀y: int


👆 В этом примере мы определили класс Point с помощью декоратора @dataclass, который автоматически добавляет методы __init__ и __repr__, упрощая создание экземпляров и их отображение.

💡 Почему это важно? Использование dataclasses позволяет сократить количество шаблонного кода, улучшить читаемость и сделать код более декларативным. Вы определяете структуру данных, а Python заботится о реализации методов.

😳Давайте рассмотрим подробнее, как создать экземпляр класса Point и какие методы автоматически генерируются:


point = Point(10, 20)
print(point)


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

❤️‍🔥 Dataclasses представляют собой мощный инструмент для работы с данными в Python, облегчающий создание классов для хранения данных без необходимости писать многословный код.

🔝 PyBytes Media | Telegram / 📷 Instagram / 📈Mentor Service
Please open Telegram to view this post
VIEW IN TELEGRAM
❤‍🔥3😈1🆒1
Введение в магические методы [Часть 1]

🧙‍♀️Магические методы в Python, часто называемые "dunder" методами (от "double underscore"), играют ключевую роль в реализации внутреннего поведения объектов. Их название всегда начинается и заканчивается двумя символами подчеркивания. Например, __init__ для инициализации объектов.

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

class Book:
⠀⠀def __init__(self, title, author):
⠀⠀⠀⠀self.title = title
⠀⠀⠀⠀self.author = author


👌 Другой интересный пример - str и repr которые определяют, как объект будет представлен в строковом формате. Это особенно полезно для отладки и логирования.

⠀⠀def __str__(self):
⠀⠀⠀⠀return f"{self.title} by {self.author}"

⠀⠀def __repr__(self):
⠀⠀⠀⠀return f"Book({self.title!r}, {self.author!r})"


💼 Магические методы также позволяют объектам вести себя как коллекции или изменять их поведение при выполнении арифметических операций. Например, getitem позволяет обращаться к элементам коллекции с использованием синтаксиса obj[key].

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

🔝 PyBytes Media | Telegram / 📷 Instagram / 📈Mentor Service
Please open Telegram to view this post
VIEW IN TELEGRAM
3🔥1
Forwarded from ITDEAL
🚀 Ищем Разработчика!


👨‍💼 Специалист по разработке ПО, который знает Python. Нас инетресует Middle специалист.


Требования к знаниям:
➡️ Python 3.9+
➡️ aiogram 3.0
➡️ asyncio
➡️ aiohttp
➡️ postgresql
➡️ docker
➡️ docker compose
➡️ SQL / noSQL
➡️ sqlalchemy
➡️ alembic
➡️ typing
➡️ Портфолио
➡️ 18+
➡️ ООП
➡️ Коммуникабельность
➡️ Умение работать в команде
➡️ Ответственность
➡️ Умение воспринимать большие нагрузки


👨‍💼 Оклад от 800$ и выше


🤖 Контакты @lunasantrope
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥3👍21
Магические методы для работы с коллекциями [Часть 2]

💃Магические методы делают работу с коллекциями в Python не только эффективной, но и интуитивно понятной. С помощью методов getitem, setitem, и len вы можете управлять поведением объектов как если бы они были списками или словарями.

📊Метод getitem позволяет вашему классу поддерживать доступ к элементам с использованием квадратных скобок. Это полезно для создания кастомных коллекций.


class Shelf:
⠀⠀def __init__(self, items):
⠀⠀⠀⠀self._items = items

⠀⠀def __getitem__(self, i):
⠀⠀⠀⠀return self._items[i]


😴Аналогично, setitem дает возможность назначать значения элементам коллекции через квадратные скобки.


⠀⠀def __setitem__(self, i, value):
⠀⠀⠀⠀self._items[i] = value


🔢Метод len позволяет объекту поддерживать функцию len(), возвращая размер коллекции.


⠀⠀def __len__(self):
⠀⠀⠀⠀return len(self._items)


🔄Эти методы превращают ваши классы в полноценные коллекции, что упрощает манипуляцию данными и делает код более читаемым и естественным для Python разработчиков.

🔝 PyBytes Media | Telegram / 📷 Instagram / 📈Mentor Service
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
8🔥3
Dataclasses [Часть 2]

🚀Метод post_init и начало работы с полями: После инициализации объекта dataclass с помощью метода init, можно дополнительно настроить объект с помощью метода post_init. Это особенно полезно, когда необходима дополнительная логика после создания объекта.

from dataclasses import dataclass

@dataclass
class Product:
⠀⠀name: str
⠀⠀price: float
⠀⠀discount: float = 0.0
⠀⠀final_price: float = 0.0

⠀⠀def __post_init__(self):
⠀⠀⠀⠀self.final_price = self.price - (self.price * self.discount)


😉В этом примере, после инициализации объекта Product, метод post_init автоматически рассчитывает final_price с учетом скидки. Это позволяет эффективно управлять данными объекта сразу после его создания.

💃Работа с полями в dataclasses также предоставляет мощные возможности для управления атрибутами. Одним из таких инструментов является параметр init=False, который позволяет определить поля, исключенные из автоматически сгенерированного метода init. Эти поля могут быть инициализированы внутри post_init или оставлены для последующего определения.

@dataclass
class Example:
⠀⠀fixed_value: int = 0
⠀⠀runtime_value: int = field(init=False)

⠀⠀def __post_init__(self):
⠀⠀⠀⠀self.runtime_value = self.fixed_value * 10


🛠В примере выше, runtime_value не будет требоваться при создании объекта Example, но будет автоматически рассчитан в методе post_init.

🔝 PyBytes Media | ✉️ Telegram / 📷 Instagram / 📈Mentor Service
Please open Telegram to view this post
VIEW IN TELEGRAM
❤‍🔥32
Магические методы для операций с числами [Часть 3]

0️⃣ Работая с числовыми типами данных в Python, магические методы, такие как add, sub, mul, предоставляют мощные инструменты для кастомизации поведения ваших объектов при использовании арифметических операторов.

Метод add позволяет определить поведение для операции сложения с использованием оператора +. Это открывает двери для создания объектов, которые могут взаимодействовать друг с другом через математические операции.


class Money:
  def __init__(self, amount):
    self.amount = amount

  def __add__(self, other):
    return Money(self.amount + other.amount)


Аналогично, sub определяет поведение для операции вычитания (`-`), позволяя создавать выражения, где объекты могут быть уменьшены на значение другого объекта.


  def __sub__(self, other):
    return Money(self.amount - other.amount)


🫣 Метод mul используется для определения поведения умножения (`*`), что делает возможным умножать ваши объекты на числа или на другие объекты, предоставляя ещё большую гибкость.


  def __mul__(self, multiplier):
    if isinstance(multiplier, (float, int)):
      return Money(self.amount * multiplier)
    else:
      raise ValueError("Multiplier must be a number")


🫡 Эти методы значительно расширяют возможности объектно-ориентированного программирования в Python, позволяя объектам вести себя как встроенные числовые типы. Таким образом, вы можете создавать более сложные и выразительные абстракции, сохраняя при этом чистоту и простоту вашего кода.

🔝 PyBytes Media | ✉️ Telegram / 📷 Instagram / 📈Mentor Service
Please open Telegram to view this post
VIEW IN TELEGRAM
3🌭2
Забавные факты о Python: однострочные чудеса 🤯

🪄Есть стереотип, что из-за синтаксиса Python каждый алгоритм будет занимать много места и строк. Но что, если я скажу вам, что в современных версиях Python можно создать сложные алгоритмы всего в одну строку? Да, даже самые неожиданные решения могут быть эффективно сжаты без потери читаемости (ну, почти без потерь 😅).

📈Сегодня мы научимся создавать рекурсивный калькулятор факториала, демонстрируя эту необычную возможность Python!

🫣Прежде чем мы раскроем ответ, давайте посмотрим на примеры, как наш таинственный калькулятор должен работать:
- Факториал 3 (`3!`) равен 3 * 2 * 1 = 6.
- Факториал 5 (`5!`) равен 5 * 4 * 3 * 2 * 1 = 120.

🤔Задание-викторина! Если вы готовы попробовать себя, вот ваш шанс и подсказки:

1) Используйте лямбда-функции
2) Примените оператор присваивания (walrus operator), чтобы вызвать лямбду на той же строке
3) Передайте лямбду самой себе, чтобы реализовать рекурсию


🔝 PyBytes Media | ✉️ Telegram / 📷 Instagram / 📈Mentor Service
Please open Telegram to view this post
VIEW IN TELEGRAM
4🗿1
А теперь, внимание, решение:

f = lambda n: n * f(n - 1) if n > 1 else 1


🤔 Python достаточно умен что бы понять на что ссылается внутренний "f". В ином случае вы можете использовать "walrus operator":

(f := lambda n: n * f(n - 1) if n > 1 else 1)(x)



😉 Используя этот код, вы можете вычислить факториал любого числа. Например:
print(f(5))
# Вывод: 120

print(f(3))
# Вывод: 6


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

😱Важно помнить, что хотя такие трюки и впечатляют, читаемость и понимание кода остаются приоритетами. Используйте эту магию с умом!

🔝 PyBytes Media | ✉️ Telegram / 📷 Instagram / 📈Mentor Service
Please open Telegram to view this post
VIEW IN TELEGRAM
8👍2🤔1