Python академия
7.55K subscribers
2.47K photos
5 videos
287 links
Учи Python быстро и легко.

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

Подходит для прокачки навыков кодирования.

По всем вопросам @evgenycarter
Download Telegram
🐍 Ловушка с аргументами по умолчанию

Посмотрите на код ниже. Как вы думаете, что выведет второй вызов функции?


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

⬇️ Правильный ответ и объяснение ⬇️


Правильный ответ: 2 — [1] и [1, 2]

Почему?
В 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+

Раньше для объединения двух словарей нам приходилось использовать метод .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) или множество (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
👍42
🕵️‍♂️ Дебаг без боли: секрет f-строк

Признавайтесь, вы тоже часто пишете такие принты, чтобы проверить значение переменной?


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