❓ Что делает 
Функция
✅ Пример:
📌 Если атрибута нет, можно передать значение по умолчанию, чтобы избежать ошибки:
  getattr() в Python и когда его использовать?Функция
getattr() позволяет динамически получать атрибут объекта по его имени в виде строки. Это удобно, когда атрибут неизвестен заранее.✅ Пример:
class Person:
def init(self, name, age):
self.name = name
self.age = age
p = Person("Alice", 30)
print(getattr(p, "name")) # Alice
📌 Если атрибута нет, можно передать значение по умолчанию, чтобы избежать ошибки:
print(getattr(p, "city", "Не указано")) # Не указано
getattr() полезен, когда нужно работать с атрибутами гибко, например, при обработке конфигураций, JSON-данных или динамических объектов.Что выведет код?
  Anonymous Quiz
    70%
    [(1, "a"), (2, "b"), (3, "c")]
      
    23%
    [[1, "a"], [2, "b"], [3, "c"]]
      
    5%
    [(1, "b"), (2, "c"), (3, "a")]
      
    2%
    Ошибка выполнения
      
    🔍 Как работает slots в Python и зачем его использовать?
✅ Пример:
Использование
  slots — это механизм, который ограничивает атрибуты объекта и уменьшает потребление памяти, исключая хранение dict.✅ Пример:
class Person:
slots = ("name", "age") # Разрешены только эти атрибуты
def init(self, name, age):
self.name = name
self.age = age
p = Person("Alice", 30)
p.city = "New York" # ❌ AttributeError: 'Person' object has no attribute 'city'
Использование
slots делает объекты легче и быстрее, так как Python не создаёт динамический словарь для атрибутов. Это особенно полезно при работе с большим количеством объектов.🔥 Mutable vs Immutable в Python
В Python все данные — это объекты, и они делятся на изменяемые (mutable) и неизменяемые (immutable).
🔹 Неизменяемые (immutable): нельзя изменить после создания
✅
🔹 Изменяемые (mutable): можно изменять без создания нового объекта
✅
⚠️ Важный нюанс
Передача изменяемых объектов в функцию может привести к неожиданным изменениям:
✅ Вывод:
  В Python все данные — это объекты, и они делятся на изменяемые (mutable) и неизменяемые (immutable).
🔹 Неизменяемые (immutable): нельзя изменить после создания
✅
int, float, str, tuple, frozensetx = "hello"
x += " world" # Создается новый объект, а не изменяется старый
🔹 Изменяемые (mutable): можно изменять без создания нового объекта
✅
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().🔥 lambda — короткие функции в Python
✅ Пример (обычная функция vs. lambda):
🔹 Где используется?
1️⃣
2️⃣
3️⃣
⚡️ Когда использовать
  
  
❌ Не стоит использовать
  lambda — это анонимная функция, которая записывается в одну строку и не требует def. Используется там, где нужна простая операция без имени функции.✅ Пример (обычная функция vs. lambda):
def square(x):
return x ** 2
square_lambda = lambda x: x ** 2
print(square(5)) # 25
print(square_lambda(5)) # 25
🔹 Где используется?
1️⃣
map() — Применение функции к спискуnums = [1, 2, 3, 4]
squared = list(map(lambda x: x ** 2, nums))
print(squared) # [1, 4, 9, 16]
2️⃣
filter() — Фильтрация данныхeven = list(filter(lambda x: x % 2 == 0, nums))
print(even) # [2, 4]
3️⃣
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 для гибких параметров!Что выведет код:
  Anonymous Quiz
    74%
    1, 2, 3
      
    7%
    1, 2, StopIteration
      
    7%
    1, 2, None
      
    12%
    Ошибка выполнения
      
    ↔️ Разница между 
🔹
🔹
🔹 Но для immutable-объектов (например,
✅ Используйте
  is и == в Python🔹
== (равенство) проверяет, равны ли значения объектов:a = [1, 2, 3]
b = [1, 2, 3]
print(a == b) # True (значения одинаковые)
🔹
is (идентичность) проверяет, указывают ли переменные на один и тот же объект в памяти:print(a is b) # False (разные объекты)
🔹 Но для immutable-объектов (например,
int, str, tuple) Python кеширует значения:x = 256
y = 256
print(x is y) # True (указывают на один объект)
✅ Используйте
== для сравнения значений и is для проверки, ссылаются ли переменные на один объект в памяти!