Что выведет код?
Anonymous Quiz
63%
[0, 0, 0, 0, 0, 0]
18%
[0, 1, 2, 3, 4, 5]
4%
[1, 2, 3, 4, 5, 6]
2%
None
14%
Ошибку
Зачем нужно ключевое слово
Пример:
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
позволяет приостанавливать и возобновлять выполнение функции, экономя память и упрощая работу с потоками данных.🐍 GIL в Python: как это влияет на многопоточность
Global Interpreter Lock (GIL) — это механизм в CPython, который ограничивает выполнение Python-кода одним потоком за раз, даже на многопроцессорных системах.
🔹 Зачем нужен GIL?
Он предотвращает проблемы с управлением памятью и упрощает работу интерпретатора. Однако из-за него многопоточные программы не могут эффективно использовать несколько ядер процессора.
🔹 Когда GIL мешает?
✅ Решение:
Если нужна настоящая параллельность, используйте многопроцессорность (
Global Interpreter Lock (GIL) — это механизм в CPython, который ограничивает выполнение Python-кода одним потоком за раз, даже на многопроцессорных системах.
🔹 Зачем нужен GIL?
Он предотвращает проблемы с управлением памятью и упрощает работу интерпретатора. Однако из-за него многопоточные программы не могут эффективно использовать несколько ядер процессора.
🔹 Когда GIL мешает?
•
В CPU-интенсивных задачах (например, обработка данных, вычисления) многопоточность не дает прироста производительности.•
В I/O-интенсивных задачах (сетевые запросы, работа с файлами) GIL почти не влияет, так как потоки могут освобождать блокировку во время ожидания операций ввода-вывода.✅ Решение:
Если нужна настоящая параллельность, используйте многопроцессорность (
multiprocessing
), которая запускает отдельные процессы без GIL, или попробуйте альтернативные реализации Python, такие как Jython или PyPy.🔥 Mutable vs Immutable в Python
В Python все данные — это объекты, и они делятся на изменяемые (mutable) и неизменяемые (immutable).
🔹 Неизменяемые (immutable): нельзя изменить после создания
✅
🔹 Изменяемые (mutable): можно изменять без создания нового объекта
✅
⚠️ Важный нюанс
Передача изменяемых объектов в функцию может привести к неожиданным изменениям:
✅ Вывод:
В Python все данные — это объекты, и они делятся на изменяемые (mutable) и неизменяемые (immutable).
🔹 Неизменяемые (immutable): нельзя изменить после создания
✅
int
, float
, str
, tuple
, frozenset
x = "hello"
x += " world" # Создается новый объект, а не изменяется старый
🔹 Изменяемые (mutable): можно изменять без создания нового объекта
✅
list
, dict
, set
, bytearray
lst = [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()
.Что выведет код:
Anonymous Quiz
61%
1, 2, 3
16%
1, 2, StopIteration
4%
1, 2, None
18%
Ошибка выполнения
🔥
🔹
🔹
✅ Используйте
*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
для гибких параметров!↔️ Разница между
🔹
🔹
🔹 Но для 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
для проверки, ссылаются ли переменные на один объект в памяти!Что выведет код?
Anonymous Quiz
57%
[(1, "a"), (2, "b"), (3, "c")]
28%
[[1, "a"], [2, "b"], [3, "c"]]
13%
[(1, "b"), (2, "c"), (3, "a")]
2%
Ошибка выполнения
🔥 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
.👍2
Что делает
Пример:
Зачем нужно?
⚡️
@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
делает код чище и безопаснее, улучшая инкапсуляцию!❤2