🐍 Ловушка с аргументами по умолчанию
Посмотрите на код ниже. Как вы думаете, что выведет второй вызов функции?
Варианты ответа:
1. [1] и [2]
2. [1] и [1, 2]
3. Ошибка SyntaxError
⬇️ Правильный ответ и объяснение ⬇️
Правильный ответ: 2 — [1] и [1, 2]
Почему?
В Python аргументы по умолчанию вычисляются один раз при определении функции, а не при каждом вызове. Список target создается один раз и сохраняет свое состояние между вызовами.
✅ Как исправить?
Используйте None в качестве значения по умолчанию:
📲 Мы в MAX
Подписывайтесь на канал 👉@pythonofff
Посмотрите на код ниже. Как вы думаете, что выведет второй вызов функции?
def append_to(num, target=[]):
target.append(num)
return target
print(append_to(1))
print(append_to(2))
Варианты ответа:
1. [1] и [2]
2. [1] и [1, 2]
3. Ошибка SyntaxError
⬇️ Правильный ответ и объяснение ⬇️
Почему?
В Python аргументы по умолчанию вычисляются один раз при определении функции, а не при каждом вызове. Список target создается один раз и сохраняет свое состояние между вызовами.
✅ Как исправить?
Используйте None в качестве значения по умолчанию:
def append_to(num, target=None):
if target is None:
target = []
target.append(num)
return target
📲 Мы в MAX
Подписывайтесь на канал 👉@pythonofff
👍7
⚡ Объединяем словари в Python 3.9+
Раньше для объединения двух словарей нам приходилось использовать метод
Начиная с Python 3.9, появился оператор объединения |. Это делает код намного чище!
Пример:
💡При совпадении ключей (в примере
Сохраняй, чтобы писать чистый код! 💾
📲 Мы в MAX
Подписывайтесь на канал 👉@pythonofff
Раньше для объединения двух словарей нам приходилось использовать метод
.update() или распаковку **kwargs.Начиная с Python 3.9, появился оператор объединения |. Это делает код намного чище!
Пример:
x = {"key1": "value1 from x", "key2": "value2 from x"}
y = {"key2": "value2 from y", "key3": "value3 from y"}
# Старый способ (до 3.9)
z = {**x, **y}
# Новый способ (Python 3.9+)
z = x | y
print(z)
# {'key1': 'value1 from x', 'key2': 'value2 from y', 'key3': 'value3 from y'}
💡При совпадении ключей (в примере
key2), побеждает значение из последнего словаря (справа от оператора).Сохраняй, чтобы писать чистый код! 💾
📲 Мы в MAX
Подписывайтесь на канал 👉@pythonofff
👍3
🧠 List vs Set: Где искать быстрее?
Представьте, у вас есть массив из 1 миллиона чисел, и нужно проверить, есть ли в нем число 999999.
Что использовать: список (
Сравнение сложности:
▪️ List (in operator): Сложность . Python перебирает элементы по одному, пока не найдет нужное. Если список огромный, это долго.
▪️ Set (in operator): Сложность (в среднем). Множества реализованы как хеш-таблицы. Python вычисляет хеш числа и сразу "прыгает" в нужную ячейку памяти.
Тест скорости:
🚀 Итог: Если вам нужно часто проверять наличие элемента в большой коллекции - всегда конвертируйте её в set.
📲 Мы в MAX
Подписывайтесь на канал 👉@pythonofff
Представьте, у вас есть массив из 1 миллиона чисел, и нужно проверить, есть ли в нем число 999999.
Что использовать: список (
list) или множество (set)?Сравнение сложности:
▪️ List (in operator): Сложность . Python перебирает элементы по одному, пока не найдет нужное. Если список огромный, это долго.
▪️ Set (in operator): Сложность (в среднем). Множества реализованы как хеш-таблицы. Python вычисляет хеш числа и сразу "прыгает" в нужную ячейку памяти.
Тест скорости:
import time
data_list = list(range(10_000_000))
data_set = set(data_list)
# Поиск в списке
start = time.time()
print(9999999 in data_list)
print(f"List time: {time.time() - start:.5f} sec")
# Поиск в множестве
start = time.time()
print(9999999 in data_set)
print(f"Set time: {time.time() - start:.5f} sec")
🚀 Итог: Если вам нужно часто проверять наличие элемента в большой коллекции - всегда конвертируйте её в set.
📲 Мы в MAX
Подписывайтесь на канал 👉@pythonofff
👍4❤2
🕵️♂️ Дебаг без боли: секрет f-строк
Признавайтесь, вы тоже часто пишете такие принты, чтобы проверить значение переменной?
Это работает, но писать каждый раз название переменной в кавычках — долго и лениво. В Python есть супер-фишка для f-строк, о которой многие забывают. Просто добавьте знак равно
Как это выглядит:
Вывод:
🔥 Почему это круто: Python сам подставляет имя переменной и её значение. Экономит кучу времени при поиске багов!
Знали про этот трюк? Ставьте ❤️, если уже пользуетесь!
📲 Мы в MAX
Подписывайтесь на канал 👉@pythonofff
Признавайтесь, вы тоже часто пишете такие принты, чтобы проверить значение переменной?
name = "Alex"
age = 25
print("name =", name)
print("age =", age)
Это работает, но писать каждый раз название переменной в кавычках — долго и лениво. В Python есть супер-фишка для f-строк, о которой многие забывают. Просто добавьте знак равно
= после имени переменной внутри фигурных скобок!Как это выглядит:
name = "Alex"
age = 25
print(f"{name=}")
print(f"{age=}")
Вывод:
name='Alex'
age=25
🔥 Почему это круто: Python сам подставляет имя переменной и её значение. Экономит кучу времени при поиске багов!
Знали про этот трюк? Ставьте ❤️, если уже пользуетесь!
📲 Мы в MAX
Подписывайтесь на канал 👉@pythonofff
👍6