Python | Вопросы собесов
13.8K subscribers
35 photos
1 file
959 links
Download Telegram
🤔 Threading что это

Threading (многопоточность) — это техника, позволяющая программе выполнять несколько операций одновременно с помощью потоков. Каждый поток представляет собой отдельный поток выполнения, который может работать параллельно с другими, что повышает производительность и эффективность, особенно в многозадачных приложениях. В многопоточном окружении важны синхронизация и управление потоками, чтобы избежать конфликтов и блокировок данных.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8
🤔 Что такое unit test?

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

🚩Основные характеристики

🟠Малый охват
Юнит-тесты охватывают небольшие участки кода, такие как отдельные функции или методы.
🟠Изолированность
Тесты выполняются в изолированной среде, что позволяет выявлять проблемы именно в тестируемом модуле без влияния внешних зависимостей.
🟠Автоматизация
Юнит-тесты легко автоматизировать, что позволяет быстро проверять изменения в коде.
🟠Регулярность выполнения
Юнит-тесты должны выполняться регулярно, например, при каждом изменении кода, чтобы обеспечить его стабильность.

🚩Пример

1⃣Тестируемая функция
def add(a, b):
return a + b


2⃣Написание юнит-теста
import unittest
from my_module import add # Импортируем тестируемую функцию из модуля

class TestAddFunction(unittest.TestCase):
def test_add_positive_numbers(self):
self.assertEqual(add(2, 3), 5)

def test_add_negative_numbers(self):
self.assertEqual(add(-1, -1), -2)

def test_add_zero(self):
self.assertEqual(add(0, 0), 0)

if __name__ == '__main__':
unittest.main()


3⃣Запуск юнит-тестов
python test_add.py


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11
🤔 Что такое `__slots__`?

`__slots__` — это специальный атрибут в Python, который позволяет ограничить количество атрибутов, добавляемых экземпляру класса, и уменьшить использование памяти. При его использовании Python не создает обычный словарь для хранения атрибутов, а вместо этого выделяет фиксированное место для указанных атрибутов. Это может повысить производительность и экономить память, особенно при создании большого числа объектов.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥25👍15
🤔 Что такое mocking?

Это техника в программировании, используемая для замены реальных объектов или компонентов системы временными объектами (моками) во время тестирования. Эти временные объекты имитируют поведение реальных объектов, позволяя изолировать и тестировать отдельные части кода без зависимости от других компонентов системы.

🚩Основные компоненты

🟠`Mock` и `MagicMock`
Основные классы для создания мок-объектов.
🟠`patch`
Декоратор или контекстный менеджер для замены объектов на моки во время выполнения теста.

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

Простой пример с использованием Mock
from unittest.mock import Mock

# Создание мок-объекта
mock = Mock()

# Настройка мок-объекта
mock.some_method.return_value = "Mocked Result"

# Вызов метода и проверка результата
result = mock.some_method()
print(result) # Вывод: Mocked Result


Использование patch для замены объектов
import unittest
from unittest.mock import patch

# Пример функции, которая вызывает внешний API
def fetch_data():
import requests
response = requests.get("https://example.com/api/data")
return response.json()

# Тестирование функции с использованием patch
class TestFetchData(unittest.TestCase):
@patch('requests.get')
def test_fetch_data(self, mock_get):
# Настройка мок-ответа
mock_get.return_value.json.return_value = {"key": "value"}

# Вызов тестируемой функции
result = fetch_data()

# Проверка результата
self.assertEqual(result, {"key": "value"})
mock_get.assert_called_once_with("https://example.com/api/data")

if __name__ == '__main__':
unittest.main()


Использование MagicMock
from unittest.mock import MagicMock

# Создание объекта MagicMock
mock = MagicMock()

# Настройка возвращаемого значения для магического метода __str__
mock.__str__.return_value = "MagicMocked String"

print(str(mock)) # Вывод: MagicMocked String


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍51
🤔 В чем разница сравнение через is и ==

Оператор == проверяет равенство значений, то есть проверяет, содержат ли переменные одинаковые данные. Оператор is проверяет, ссылаются ли переменные на один и тот же объект в памяти. Таким образом, is используется для проверки идентичности объекта, а == — для проверки равенства значений.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍22🔥15
🤔 Методы add, mul, sub, truediv?

Относятся к так называемым "магическим методам" или "специальным методам". Они позволяют определять поведение объектов при использовании операторов сложения (+), умножения (*), вычитания (-) и деления (/).

🟠Метод `__add__`

Этот метод отвечает за операцию сложения. Если вы определяете этот метод в вашем классе, вы можете контролировать, что происходит, когда вы используете оператор + между объектами этого класса.
class Vector:
def __init__(self, x, y):
self.x = x
self.y = y

def __add__(self, other):
return Vector(self.x + other.x, self.y + other.y)

def __repr__(self):
return f"Vector({self.x}, {self.y})"

v1 = Vector(1, 2)
v2 = Vector(3, 4)
print(v1 + v2) # Вывод: Vector(4, 6)


🟠Метод `__mul__`

Этот метод отвечает за операцию умножения. Его можно использовать, чтобы определить, как объекты вашего класса будут вести себя при использовании оператора *.
class Vector:
def __init__(self, x, y):
self.x = x
self.y = y

def __mul__(self, scalar):
return Vector(self.x * scalar, self.y * scalar)

def __repr__(self):
return f"Vector({self.x}, {self.y})"

v = Vector(1, 2)
print(v * 3) # Вывод: Vector(3, 6)


🟠Метод `__sub__`

Этот метод отвечает за операцию вычитания. Он позволяет вам определить поведение объектов при использовании оператора -.
class Vector:
def __init__(self, x, y):
self.x = x
self.y = y

def __sub__(self, other):
return Vector(self.x - other.x, self.y - other.y)

def __repr__(self):
return f"Vector({self.x}, {self.y})"

v1 = Vector(5, 7)
v2 = Vector(2, 3)
print(v1 - v2) # Вывод: Vector(3, 4)


🟠Метод `__truediv__`

Этот метод отвечает за операцию деления. Он позволяет определить, как объекты вашего класса будут вести себя при использовании оператора /.
class Vector:
def __init__(self, x, y):
self.x = x
self.y = y

def __truediv__(self, scalar):
return Vector(self.x / scalar, self.y / scalar)

def __repr__(self):
return f"Vector({self.x}, {self.y})"

v = Vector(8, 4)
print(v / 2) # Вывод: Vector(4.0, 2.0)


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍92
🤔 Мультипроцессинг — что это

Мультипроцессинг — это подход, при котором для выполнения задач создаются отдельные процессы, а не потоки. В Python это полезно для обхода ограничения GIL (Global Interpreter Lock), позволяя исполнять код параллельно на нескольких ядрах процессора. Модуль multiprocessing позволяет создавать независимые процессы, каждый из которых выполняет свою копию интерпретатора Python.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10🔥2
🤔 Метод bool?

Используется для определения логической истинности (truthiness) объекта. Когда вызывается функция bool() на объекте или объект используется в контексте, где требуется логическое значение (например, в условиях if), вызывается метод __bool__. Если метод __bool__ не определен, Python использует метод __len__: объект считается ложным (False), если его длина равна нулю, и истинным (True) в противном случае.

🚩Зачем нужен

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

🚩Как использовать

Для того чтобы использовать метод __bool__, нужно его определить в своем классе. Метод должен возвращать либо True, либо False. В этом примере метод __bool__ проверяет значение атрибута value. Если value имеет значение, которое считается ложным (например, 0 или None), метод возвращает False. В противном случае, он возвращает True.
class MyClass:
def __init__(self, value):
self.value = value

def __bool__(self):
return bool(self.value)

# Примеры использования
obj1 = MyClass(0)
obj2 = MyClass(10)

print(bool(obj1)) # Вывод: False
print(bool(obj2)) # Вывод: True

if obj1:
print("obj1 is True")
else:
print("obj1 is False") # Этот блок выполнится

if obj2:
print("obj2 is True") # Этот блок выполнится
else:
print("obj2 is False")


🚩Пример более сложного использования

Допустим, у вас есть класс Box, который содержит предметы, и вы хотите, чтобы пустая коробка считалась ложной, а коробка с предметами — истинной.
class Box:
def __init__(self, items):
self.items = items

def __bool__(self):
return bool(self.items)

# Примеры использования
empty_box = Box([])
full_box = Box(['item1', 'item2'])

print(bool(empty_box)) # Вывод: False
print(bool(full_box)) # Вывод: True

if empty_box:
print("The box is not empty")
else:
print("The box is empty") # Этот блок выполнится

if full_box:
print("The box is not empty") # Этот блок выполнится
else:
print("The box is empty")


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍62
🤔 Python — компилируемый или интерпретируемый

Python считается интерпретируемым языком, так как код выполняется интерпретатором построчно, что облегчает отладку и делает его портативным. Тем не менее, перед исполнением Python-код компилируется в байт-код (.pyc), который затем выполняется на виртуальной машине (PVM). Поэтому Python можно назвать интерпретируемым с этапом предварительной компиляции в байт-код.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍27🔥81
🤔 Методы eq, ne, lt, le, qt, qe?

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

🟠Метод `eq`
Отвечает за оператор равенства ==. Он позволяет определить, когда два объекта вашего класса считаются равными.
class Person:
def __init__(self, name, age):
self.name = name
self.age = age

def __eq__(self, other):
return self.name == other.name and self.age == other.age

p1 = Person("Alice", 30)
p2 = Person("Alice", 30)
p3 = Person("Bob", 25)

print(p1 == p2) # Вывод: True
print(p1 == p3) # Вывод: False


🟠Метод `ne`
Отвечает за оператор неравенства !=. Он позволяет определить, когда два объекта вашего класса считаются неравными.
class Person:
def __init__(self, name, age):
self.name = name
self.age = age

def __ne__ (self, other):
return self.name != other.name or self.age != other.age

p1 = Person("Alice", 30)
p2 = Person("Alice", 30)
p3 = Person("Bob", 25)

print(p1 != p2) # Вывод: False
print(p1 != p3) # Вывод: True


🟠Метод `lt`
Отвечает за оператор меньше <. Он позволяет определить, когда один объект вашего класса считается меньше другого.
class Person:
def __init__(self, name, age):
self.name = name
self.age = age

def __lt__(self, other):
return self.age < other.age

p1 = Person("Alice", 30)
p2 = Person("Bob", 25)

print(p1 < p2) # Вывод: False
print(p2 < p1) # Вывод: True


🟠Метод `le`
Отвечает за оператор меньше или равно <=. Он позволяет определить, когда один объект вашего класса считается меньше или равен другому.
class Person:
def __init__(self, name, age):
self.name = name
self.age = age

def __le__(self, other):
return self.age <= other.age

p1 = Person("Alice", 30)
p2 = Person("Bob", 30)
p3 = Person("Charlie", 25)

print(p1 <= p2) # Вывод: True
print(p1 <= p3) # Вывод: False


🟠Метод `gt`
Отвечает за оператор больше >. Он позволяет определить, когда один объект вашего класса считается больше другого.
class Person:
def __init__(self, name, age):
self.name = name
self.age = age

def __gt__(self, other):
return self.age > other.age

p1 = Person("Alice", 30)
p2 = Person("Bob", 25)

print(p1 > p2) # Вывод: True
print(p2 > p1) # Вывод: False


🟠Метод `ge`
Отвечает за оператор больше или равно >=. Он позволяет определить, когда один объект вашего класса считается больше или равен другому.
class Person:
def __init__(self, name, age):
self.name = name
self.age = age

def __ge__(self, other):
return self.age >= other.age

p1 = Person("Alice", 30)
p2 = Person("Bob", 30)
p3 = Person("Charlie", 25)

print(p1 >= p2) # Вывод: True
print(p1 >= p3) # Вывод: True
print(p3 >= p1) # Вывод: False


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍161
🤔 Какие области в профессиональной деятельности у тебя развиты слабо

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

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍15🔥8😁3💊2
🤔 Методы call?

Позволяет объектам вашего класса быть вызываемыми как функции. Когда вы определяете этот метод в своем классе, вы можете использовать экземпляры этого класса как функции.

🚩Зачем нужен

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

🚩Как использовать

Для того чтобы использовать метод __call__, нужно его определить в своем классе. Этот метод может принимать любые аргументы, как и обычные функции.
class Counter:
def __init__(self):
self.count = 0

def __call__(self):
self.count += 1
print(f"Count is now {self.count}")

# Примеры использования
counter = Counter()
counter() # Вывод: Count is now 1
counter() # Вывод: Count is now 2
counter() # Вывод: Count is now 3


Пример использования с аргументами
class Adder:
def __init__(self, value):
self.value = value

def __call__(self, x):
return self.value + x

# Примеры использования
add5 = Adder(5)
print(add5(10)) # Вывод: 15
print(add5(20)) # Вывод: 25


Пример более сложного использования
class Polynomial:
def __init__(self, coefficients):
self.coefficients = coefficients

def __call__(self, x):
result = 0
for power, coef in enumerate(self.coefficients):
result += coef * (x ** power)
return result

# Примеры использования
p = Polynomial([1, 0, 2]) # Создает полином 1 + 0x + 2x^2
print(p(2)) # Вывод: 9 (1 + 0*2 + 2*2^2)
print(p(3)) # Вывод: 19 (1 + 0*3 + 2*3^2)


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
🤔 Какие основные HTTP методы знаешь?

Основные HTTP методы включают:
- `GET` для получения данных с сервера.
- `POST` для отправки данных на сервер (создание ресурса).
- `PUT` для обновления или создания ресурса.
- `DELETE` для удаления ресурса.
- `PATCH` для частичного обновления ресурса.
- `HEAD` для получения заголовков без тела ответа.
- `OPTIONS` для получения информации о поддерживаемых методах.
Эти методы обеспечивают основное взаимодействие клиента и сервера.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥12👍8😁2💊1
🤔 Методы getitem и setitem и delitem?

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

🟠Метод `getitem`
Используется для доступа к элементам объекта по индексу или ключу. Он вызывается, когда вы используете синтаксис квадратных скобок для доступа к элементу.
class MyList:
def __init__(self, items):
self.items = items

def __getitem__(self, index):
return self.items[index]

# Примеры использования
my_list = MyList([1, 2, 3, 4])
print(my_list[0]) # Вывод: 1
print(my_list[2]) # Вывод: 3


🟠Метод `setitem`
Используется для установки значений элементов по индексу или ключу. Он вызывается, когда вы используете синтаксис квадратных скобок для установки значения элемента.
class MyList:
def __init__(self, items):
self.items = items

def __setitem__(self, index, value):
self.items[index] = value

# Примеры использования
my_list = MyList([1, 2, 3, 4])
my_list[1] = 10
print(my_list.items) # Вывод: [1, 10, 3, 4]


🟠Метод `delitem`
Используется для удаления элементов по индексу или ключу. Он вызывается, когда вы используете синтаксис del с квадратными скобками.
class MyList:
def __init__(self, items):
self.items = items

def __delitem__(self, index):
del self.items[index]

# Примеры использования
my_list = MyList([1, 2, 3, 4])
del my_list[2]
print(my_list.items) # Вывод: [1, 2, 4]


Пример использования всех методов вместе
class CustomDict:
def __init__(self):
self.data = {}

def __getitem__(self, key):
return self.data[key]

def __setitem__(self, key, value):
self.data[key] = value

def __delitem__(self, key):
del self.data[key]

# Примеры использования
custom_dict = CustomDict()
custom_dict['a'] = 1
custom_dict['b'] = 2
print(custom_dict['a']) # Вывод: 1
print(custom_dict['b']) # Вывод: 2

del custom_dict['a']
print(custom_dict.data) # Вывод: {'b': 2}


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍91
🤔 Как пропустить заблокированные поля в БД при использовании select?

Чтобы пропустить заблокированные поля в БД при выполнении запроса `SELECT`, можно:
1. Явно указать в запросе только те столбцы, которые доступны, вместо использования `SELECT *`.
2. Убедиться, что права доступа на уровне пользователя или роли не запрещают чтение нужных столбцов.
3. Использовать средства обработки ошибок в коде, чтобы обрабатывать исключения, если доступ к полю невозможен.
Это помогает избежать ошибок и выполнить запрос успешно.


Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
💊7
🤔 Методы __enter__ и __exit__?

Используются для поддержки менеджеров контекста. Менеджеры контекста позволяют выполнять подготовительные и завершающие действия вокруг блока кода, используя конструкцию with. Это полезно для автоматического управления ресурсами, такими как открытие и закрытие файлов, управление соединениями с базами данных и т. д.

🟠Метод `enter`
Выполняет действия, которые должны произойти в начале блока with. Этот метод должен возвращать объект, который будет связан с переменной после оператора as.

🟠Метод `exit`
Выполняет действия, которые должны произойти в конце блока with, даже если в блоке произошло исключение. Он принимает три аргумента: тип исключения, значение исключения и трассировку (traceback). Если исключение не произошло, все три аргумента будут равны None.
class FileManager:
def __init__(self, filename, mode):
self.filename = filename
self.mode = mode
self.file = None

def __enter__(self):
self.file = open(self.filename, self.mode)
return self.file

def __exit__(self, exc_type, exc_value, traceback):
if self.file:
self.file.close()

# Примеры использования
with FileManager('example.txt', 'w') as f:
f.write('Hello, World!')

# Пример с обработкой исключений
try:
with FileManager('example.txt', 'r') as f:
content = f.read()
print(content)
except Exception as e:
print(f"An error occurred: {e}")


Пример с обработкой ресурсов
class DatabaseConnection:
def __init__(self, db_name):
self.db_name = db_name
self.connection = None

def __enter__(self):
self.connection = self.connect_to_database(self.db_name)
return self.connection

def __exit__(self, exc_type, exc_value, traceback):
if self.connection:
self.connection.close()

def connect_to_database(self, db_name):
# Реализация соединения с базой данных (псевдокод)
print(f"Connecting to database {db_name}")
return f"Connection to {db_name}"

def close(self):
# Реализация закрытия соединения (псевдокод)
print("Closing the connection")

# Примеры использования
with DatabaseConnection('my_database') as conn:
print(conn)
# Выполнение операций с базой данных

# Пример с обработкой исключений
try:
with DatabaseConnection('my_database') as conn:
raise ValueError("Some error occurred")
except Exception as e:
print(f"An error occurred: {e}")


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍91
🤔 Какие есть типы данных в Python?

В Python существует несколько встроенных типов данных: числовые типы (int, float, complex), строки (str), булевы значения (bool), списки (list), кортежи (tuple), множества (set) и словари (dict). Также есть типы для работы с бинарными данными, такие как bytes и bytearray. Кроме того, существуют пользовательские типы, которые можно создавать с помощью классов. Python поддерживает динамическую типизацию, где тип переменной определяется автоматически при присваивании значения.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚Базу Знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍19
🤔 Что такое @staticmethod?

Используется для создания статических методов в классе. Статический метод — это метод, который не зависит от состояния экземпляра класса и может быть вызван напрямую на классе, не создавая экземпляр. Такие методы обычно используются для выполнения действий, которые логически связаны с классом, но не требуют доступа к его экземплярам или класс-методу.

🚩Зачем нужен

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

🚩Как использовать

Для создания статического метода, нужно использовать декоратор @staticmethod перед определением метода. В отличие от обычных методов класса, статический метод не принимает параметр self.
class MathUtils:
@staticmethod
def add(a, b):
return a + b

@staticmethod
def multiply(a, b):
return a * b

# Вызов статических методов
print(MathUtils.add(5, 3)) # Вывод: 8
print(MathUtils.multiply(5, 3)) # Вывод: 15


Пример использования статического метода для валидации
Здесь метод is_valid_email проверяет, является ли строка допустимым email адресом. Поскольку этот метод не требует доступа к состоянию экземпляра класса, его логично сделать статическим.
class Validator:
@staticmethod
def is_valid_email(email):
return "@" in email and "." in email

# Вызов статического метода
print(Validator.is_valid_email("[email protected]")) # Вывод: True
print(Validator.is_valid_email("invalid-email")) # Вывод: False


🚩Сравнение с другими методами

🟠Обычные методы
Принимают параметр self, который указывает на текущий экземпляр класса.
🟠Методы класса
Принимают параметр cls, который указывает на сам класс, и могут изменять состояние класса.
🟠Статические методы
Не принимают ни self, ни cls, что делает их более похожими на обычные функции, но логически сгруппированными в классе.

Пример для сравнения:
class Example:
def instance_method(self):
print("This is an instance method")

@classmethod
def class_method(cls):
print("This is a class method")

@staticmethod
def static_method():
print("This is a static method")

# Создание экземпляра класса
obj = Example()

# Вызов методов
obj.instance_method() # Вывод: This is an instance method
Example.class_method() # Вывод: This is a class method
Example.static_method() # Вывод: This is a static method


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍101
🤔 Что такое итератор?

Итератор в Python — это объект, который поддерживает метод `__iter__()` и `__next__()` для последовательного перебора элементов коллекции. Итераторы используются для работы с циклами и обеспечивают ленивую генерацию данных, не загружая их все сразу в память. Каждый вызов метода `next()` возвращает следующий элемент, а при отсутствии элементов вызывается исключение `StopIteration`. Итераторы полезны для работы с большими данными и потоками данных.

Ставь 👍 если знал ответ, 🔥 если нет
Забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍18🔥3
🤔 Что такое @dataclass?

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

🚩Зачем нужен

🟠Упрощение кода
Автоматически генерирует методы, сокращая шаблонный код.
🟠Читабельность
Делает код более чистым и легким для понимания.
🟠Удобство
Обеспечивает удобные и мощные возможности для работы с данными.

🚩Как использовать

Нужно импортировать его из модуля dataclasses и применить к классу. Внутри класса достаточно определить только поля данных.
from dataclasses import dataclass

@dataclass
class Person:
name: str
age: int

# Примеры использования
person1 = Person(name="Alice", age=30)
person2 = Person(name="Bob", age=25)

print(person1) # Вывод: Person(name='Alice', age=30)
print(person2) # Вывод: Person(name='Bob', age=25)
print(person1 == person2) # Вывод: False


🚩Автоматически генерируемые методы

🟠`__init__`
Инициализирует объект с заданными значениями атрибутов.
🟠`__repr__`
Возвращает строковое представление объекта, удобное для отладки.
🟠`__eq__`
Сравнивает объекты на равенство по их атрибутам.
🟠`__lt__`, `__le__`, `__gt__`, `__ge__`
Могут быть сгенерированы для сравнения объектов (если указано).

🚩Настройка поведения

Вы можете настроить поведение @dataclass с помощью параметров, таких как order, frozen, и других.

🟠`order=True`
Генерирует методы для сравнения объектов.
🟠`frozen=True`
Делает экземпляры неизменяемыми (immutable).

Пример
from dataclasses import dataclass

@dataclass(order=True, frozen=True)
class Person:
name: str
age: int

person1 = Person(name="Alice", age=30)
person2 = Person(name="Bob", age=25)

print(person1 > person2) # Вывод: True (поскольку 'Alice' > 'Bob' по алфавиту, если имена равны, сравниваются возраста)
# person1.age = 31 # Ошибка: FrozenInstanceError (поскольку класс заморожен)


🚩Поля данных и их настройки

Вы можете использовать функцию field() для настройки отдельных полей, например, для указания значений по умолчанию или исключения полей из методов __repr__, __eq__, и других.
from dataclasses import dataclass, field

@dataclass
class Person:
name: str
age: int = 0
address: str = field(default="Unknown", repr=False)

person = Person(name="Alice")
print(person) # Вывод: Person(name='Alice', age=0)


Ставь 👍 и забирай 📚 Базу знаний
Please open Telegram to view this post
VIEW IN TELEGRAM
👍141