Программистика
کانال بسته
Лучший канал про python Ссылка для друга: https://t.me/+Ai6ughKtf5g2ZmFi Купить рекламу: https://telega.in/c/+Ai6ughKtf5g2ZmFi Админ: @JeyRahol По рекламе: @ReivuManager
نمایش بیشتر5 579
مشترکین
-524 ساعت
-437 روز
-10430 روز
آرشیو پست ها
5 579
🔥 Подписка на easyoffer PRO на 1 год со скидкой 70%
easyoffer – сайт для подготовки к собеседованию на программиста, тестировщика и другие IT-профессии становится еще доступнее со скидкой 70% до 10 марта.
⚙️ Актуальные функции:
1. База вопросов из реальных технических собеседований с вероятностью встречи и примерами ответов.
2. База задач с этапа live-coding.
3. База видеозаписей 1100+ реальных собеседований, в том числе в топовые компании (Сбер, Авито, Яндекс, WB, OZON, МТС и др.) на позиции Junior/Middle/Senior.
4. База 400+ тестовых заданий от компаний.
5. Аналитика ТОП-требований из вакансий для лучшего написания резюме по ключевым словам.
6. Тренажеры для подготовки к собеседованию. В том числе тренажер «Реальное собеседование» со сценарием вопросов под конкретную компанию.
Акция до 10 марта (включительно) на PRO-тариф.
– Подписка действует 1 год
– Доступ ко всем профессиями сразу
👉 Смотри подробности тарифа и покупай на easyoffer
5 579
💻 Вопрос с собеседования: Что будет, если использовать изменяемый объект (например, список) в качестве аргумента по умолчанию в функции?
Это один из самых коварных вопросов для новичков. Код выглядит безобидно, но ведёт себя странно. Половина джунов проваливается именно на нём, потому что не понимают, когда создаются аргументы по умолчанию.
📌 Базовый ответ (которого ждут от джуна):
Аргументы по умолчанию создаются один раз в момент определения функции, а не каждый раз при её вызове. Если использовать изменяемый объект (список, словарь), то он будет общим для всех вызовов.
def add_user(name, user_list=[]):
user_list.append(name)
return user_list
print(add_user("Алиса")) # ['Алиса']
print(add_user("Боб")) # ['Алиса', 'Боб'] — сюрприз!
Ожидание новичка: каждый вызов создаёт новый пустой список.
Реальность: список создаётся один раз и переиспользуется.
🧱 Почему так происходит и как это работает под капотом:
В Python аргументы по умолчанию хранятся в атрибуте функции __defaults__. Они вычисляются в момент определения функции, а не вызова.
print(add_user.__defaults__) # (['Алиса', 'Боб'],)
При каждом вызове без аргумента user_list используется тот же самый объект из __defaults__.
Как это исправить:
Правильный паттерн — использовать None как значение по умолчанию и создавать новый список внутри функции:
def add_user(name, user_list=None):
if user_list is None:
user_list = []
user_list.append(name)
return user_list
print(add_user("Алиса")) # ['Алиса']
print(add_user("Боб")) # ['Боб'] — теперь работает как ожидалось!
🧪 Другие примеры-ловушки:
1. Словарь в качестве аргумента по умолчанию:
def add_to_dict(key, value, cache={}):
cache[key] = value
return cache
print(add_to_dict("a", 1)) # {'a': 1}
print(add_to_dict("b", 2)) # {'a': 1, 'b': 2} — кеш общий!
2. Объекты datetime (будьте осторожны!):
from datetime import datetime
def log_message(msg, timestamp=datetime.now()):
print(f"{timestamp}: {msg}")
log_message("Старт") # 2024-03-09 10:00:00
log_message("Финиш") # 2024-03-09 10:00:00 — время не обновилось!
datetime.now() вычисляется один раз при определении функции, а не при каждом вызове.
⚠️ Когда это особенно опасно:
🔴 В рекурсивных функциях с накоплением данных 🔴 В кэширующих функциях (неявное кеширование может привести к утечкам памяти) 🔴 В библиотечном коде, который будут вызывать другие разработчики 🔴 При работе с mutable объектами в классах (если забыть про копирование)💡 Запомните: 1. Аргументы по умолчанию создаются один раз в момент определения функции. 2. Никогда не используйте изменяемые объекты (list, dict, set) как значения по умолчанию. 3. Правильный паттерн:
def func(arg=None): if arg is None: arg = default_value.
4. Это касается любых объектов, которые могут изменяться: списки, словари, множества, экземпляры классов.
5. Исключение: если вам нужно разделяемое состояние между вызовами (редкий кейс), то можно использовать, но документируйте это явно.
На собеседовании этот вопрос задают, чтобы проверить, понимаете ли вы, когда создаются объекты в Python. Джуны часто лепят [] в аргументах по умолчанию, а опытные разработчики всегда используют None.
Программистика || #jobs5 579
🔠 Слили 4 ТБ по IT, хакингу и разработке.
⚪️ Все лучшие инструкции, гайды, книги и инструменты — без воды.
🖥 Курсы & GitHub — 579GB
☁️ Хакинг & ИБ — 756GB
🤒 OSINT — 315GB
⌨️ Python — 955GB
🙃 Linux & Bash — 459GB
😦 Работа в IT — 278GB
🖥 Общий архив — 946GB
➡️ Присоединяйтесь и скачивайте.
Пост будет удален через 48 часов.
5 579
🌸 Программистика поздравляет с 8 Марта!
Пусть код всегда компилируется с первого раза, баги обходят стороной, а вдохновение приходит чаще, чем новые фичи в Python. Желаем, чтобы в жизни было больше радостных моментов, тёплых улыбок и приятных сюрпризов. Оставайтесь такими же яркими и неповторимыми, как ваш любимый язык программирования.С праздником, девчонки! 🔥💐
5 579
🔄 Меняем значения переменных без временной переменной
Часто нужно поменять местами значения двух переменных. Новички обычно пишут так:
temp = a
a = b
b = temp
Три строки, временная переменная — работает, но в Python есть элегантный способ в одну строку:
a, b = b, a
Как это работает?
Python сначала создаёт кортеж (b, a), а затем распаковывает его в переменные a и b. Всё происходит одновременно, без временной переменной и без риска потерять значение.
Бонус: можно менять местами больше двух переменных:
a, b, c = c, a, b
🟢 Почему это круто:
Короче и читаемее
- Не нужно придумывать имя для временной переменной
- Работает для любых типов данных
Ещё один лайфхак: множественное присваивание можно использовать для разделения строки на части:
first, second = "Hello World".split()
Запомни: в Python обмен значений — это не боль, а одна строчка кода.
Программистика|| #tips5 579
📊 Генератор фейковых данных: создай 1000 пользователей за секунду
Тестируешь приложение, а база данных пустая? Нужно заполнить таблицу пользователями, но вводить вручную "Иван Иванов" 50 раз — тоска зелёная? Пора автоматизировать создание тестовых данных.
Этот скрипт генерирует сколько угодно вымышленных пользователей с реалистичными именами, адресами, телефонами и email. Данные сохраняются в CSV — готовый набор для загрузки в БД или тестов.
👉 Скрипт `fake_users_generator.py`:
#!/usr/bin/env python3
"""
Генератор фейковых пользователей для тестирования.
Сохраняет данные в CSV или JSON.
"""
import csv
import json
import argparse
from faker import Faker
from datetime import datetime
def generate_users(count=100, locale='ru_RU', output_file='users.csv', file_format='csv'):
"""
Генерирует указанное количество фейковых пользователей
и сохраняет в файл.
"""
fake = Faker(locale)
users = []
print(f"👥 Генерирую {count} пользователей...")
for _ in range(count):
user = {
'id': _ + 1,
'first_name': fake.first_name(),
'last_name': fake.last_name(),
'email': fake.email(),
'phone': fake.phone_number(),
'address': fake.address().replace('\n', ', '),
'city': fake.city(),
'country': fake.country(),
'birthdate': fake.date_of_birth(minimum_age=18, maximum_age=80).isoformat(),
'created_at': datetime.now().isoformat()
}
users.append(user)
# Сохраняем в файл
if file_format == 'csv':
with open(output_file, 'w', newline='', encoding='utf-8') as f:
writer = csv.DictWriter(f, fieldnames=users[0].keys())
writer.writeheader()
writer.writerows(users)
print(f"✅ CSV сохранён: {output_file}")
elif file_format == 'json':
with open(output_file, 'w', encoding='utf-8') as f:
json.dump(users, f, ensure_ascii=False, indent=2)
print(f"✅ JSON сохранён: {output_file}")
return users
if __name__ == "__main__":
parser = argparse.ArgumentParser(description="Генератор фейковых пользователей")
parser.add_argument('-n', '--number', type=int, default=100, help='Количество пользователей (по умолчанию 100)')
parser.add_argument('-l', '--locale', default='ru_RU', help='Локаль: ru_RU, en_US, uk_UA и др.')
parser.add_argument('-o', '--output', default='users.csv', help='Имя выходного файла')
parser.add_argument('-f', '--format', choices=['csv', 'json'], default='csv', help='Формат файла')
args = parser.parse_args()
generate_users(
count=args.number,
locale=args.locale,
output_file=args.output,
file_format=args.format
)
🛠 Установка зависимостей:
pip install faker
🚀 Запуск:
# 100 пользователей по-русски (по умолчанию)
python fake_users_generator.py
# 500 пользователей на английском в JSON
python fake_users_generator.py -n 500 -l en_US -o users.json -f json
# Украинские пользователи
python fake_users_generator.py -l uk_UA -o uk_users.csv
📋 Пример сгенерированных данных:
id,first_name,last_name,email,phone,address,city,country,birthdate,created_at
1,Иван,Петров,petrov@example.com,+7 (495) 123-4567,ул. Ленина 10, кв. 5,Москва,Россия,1990-05-15,2024-03-07T14:30:00
2,Анна,Смирнова,smirnova@example.com,+7 (812) 987-6543,пр. Невский 25,Санкт-Петербург,Россия,1985-11-23,2024-03-07T14:30:00
Программистика|| #scripts5 579
Забудь про ChatGPT. Это как просить калькулятор нарисовать картину.
Пока массы гоняют одни и те же скучные запросы в зацензуренные боты, реальная революция ИИ в канале «Техноразум»:
— Нейросети, которые не боятся запретных тем ( 🔞)
— Скрытые функции, которые другие ИИ прячут за платную подписку или цензурой
— Настоящие инструкции и промты для взлома творческих шаблонов
Переходи к настоящим возможностям, забудь про детский сад нейросетей: https://t.me/+7dOPAyODQ6
5 579
👩💻 Переменные в Python: это не коробки, а ярлыки
Новички часто представляют переменную как коробку, в которую можно положить значение. Идут дальше:
a = 5, b = a — и думают, что теперь в двух коробках лежат одинаковые числа. А потом меняют b и удивляются, почему a не изменилось. Или наоборот — меняют список через одну переменную, а вторая тоже меняется. Пора разобраться, как всё на самом деле.
🧱 Переменная — это имя, а не место хранения
В Python переменная — это просто имя (ярлык), которое прикрепляется к объекту в памяти. У объекта есть тип и значение, а переменная только ссылается на него.
a = 5
b = a
Что происходит:
1. Создаётся объект int со значением 5.
2. Ярлык a вешается на этот объект.
3. b = a — берём объект, на который указывает a, и вешаем на него ещё один ярлык b.
Теперь два имени указывают на один и тот же объект.
Проверим через id() — адрес в памяти:
print(id(a)) # 12345678 (условно)
print(id(b)) # 12345678 — тот же объект!
🧱 Неизменяемые типы: числа, строки, кортежи
Когда мы «меняем» неизменяемый объект, на самом деле создаётся новый объект, а старый ярлык перевешивается.
a = 5
b = a
a = a + 1
print(a) # 6
print(b) # 5 — b всё ещё смотрит на старый объект!
❌ Частая ошибка: думать, что b должно было тоже измениться.
✔️ Правильно: a теперь ссылается на новый объект 6, а b остался на старом 5.
🧱 Изменяемые типы: списки, словари, множества
Здесь объект можно изменить, не создавая нового. Тогда все ярлыки, ведущие на этот объект, увидят изменения.
list_a = [1, 2, 3]
list_b = list_a # оба ярлыка на один список
list_a.append(4)
print(list_a) # [1, 2, 3, 4]
print(list_b) # [1, 2, 3, 4] — потому что это тот же список!
❌ Ловушка: новички думают, что list_b — независимая копия.
✔️ Как создать реальную копию: list_b = list_a.copy() или list_b = list_a[:].
🧱 Проверка: изменяемый или нет?
x = 10
y = x
print(x is y) # True — один объект
x = 20
print(x is y) # False — x перевесили на новый объект
lst1 = [1, 2]
lst2 = lst1
print(lst1 is lst2) # True
lst1.append(3)
print(lst1 is lst2) # True — объект тот же
🧱 Аргументы функций — тоже ярлыки
При передаче в функцию копируется ссылка, а не объект. Поэтому:
def add_one(x):
x += 1
return x
a = 5
add_one(a)
print(a) # 5 — число неизменяемо, x был локальной копией ссылки
def add_to_list(lst):
lst.append(100)
my_list = [1, 2, 3]
add_to_list(my_list)
print(my_list) # [1, 2, 3, 100] — список изменился!
💡 Запомни:
🟢 Переменные в Python — это ярлыки на объекты, а не ячейки памяти.
🟢 Присваивание b = a не копирует данные, а вешает ещё один ярлык.
🟢 Неизменяемые типы (int, float, str, tuple) при попытке изменения создают новый объект.
🟢 Изменяемые типы (list, dict, set) можно менять, и все ярлыки увидят изменения.
🟢 Для создания независимой копии изменяемого объекта используй .copy() или deepcopy() (для вложенных структур).
Понимание этой разницы убережёт тебя от часов отладки и неожиданных багов. Помни: в Python всё — объект, а переменные — просто имена.Программистика|| #article
5 579
⏰ Библиотека Python: Arrow
Arrow — это интуитивная библиотека для работы с датами и временем, предлагающая простой API для создания, форматирования и манипуляции датами. Она поддерживает часовые пояса, человекочитаемые интервалы и значительно упрощает код по сравнению со стандартным datetime.
✔️ Установка:
pip install arrow
🐱 Ссылка на репозиторий
Программистика|| #Library5 579
😒 Подборка каналов по информационной безопасности
Проверенные каналы по безопасности, которые реально помогают расти.
👍 ZeroDay — Уроки, эксплуатация уязвимостей с нуля
👍 Белый Хакер — Свежие новости из мира ИБ
😎 Бункер Хакера — Статьи, книги, шпаргалки и хакинг
👨💻 Серверная Админа — Настройка и уроки по компьютерным сетям
📂 Подписывайся
5 579
Переменные, функции, типы данных... Сразу хочется закрыть вкладку 🥲
Первый шаг в Python - самый страшный. Открываешь урок, а там термины сыплются один за другим. Кажется, что это какая-то сложная система для посвященных. И ты сидишь и думаешь: "Может, программирование - это вообще не мое?" ⁉️
На самом деле проблема не в тебе, а в подаче. Когда теория висит в воздухе без практики - мозг ее просто не принимает.
❇️ Ребята из Merion Academy (того самого YouTube-канала про IT) на бесплатных вводных уроках по Python сделали иначе.
Сначала - воркшоп с ментором. Ты просто пишешь код руками и сразу видишь результат. А уже потом - термины и теория, когда есть понимание, зачем это нужно.
Что еще внутри:
✔️ Основы Python (переменные, типы, функции) - не скучно, а с примерами
✔️ Твоя первая программа - воркшоп с ментором
✔️ Тест - проверишь, правда ли понял
➡️ Запишись на бесплатные вводные уроки
Сначала напишешь код, потом разберешься с терминами.
5 579
💻 8 ключевых концепций в DDD(предметно-ориентированное проектирование)
⬇️ Наглядная шпаргалка на русском. Сохраняем, пригодится!
5 579
Программисты, это вам 👇
Держите 5 каналов, которые реально помогают изучать программирование и IT с полного нуля:
🖥 Easy Coder — все направления IT.
👩💻 Easy Python — всё о Python.
🌐 Easy WebDev — Frontend, Backend.
🔠 Easy InfoSec — ИБ, Хакинг.
🖥 Easy GitHub — лучшее с GitHub.
Тонны бесплатной инфы для любого уровня подготовки ✔️
5 579
🔍 Duplicate Finder: Найди и уничтожь файлы-клоны (и освободи место)
У каждого на диске валяются копии фоток, документов, музыки — случайные дубликаты, старые версии, одинаковые файлы в разных папках. Руками искать — себя не уважать. Этот скрипт просканирует папку, найдёт все файлы-дубликаты по содержимому и покажет, что можно смело удалить.
👉 Скрипт `find_duplicates.py`:
#!/usr/bin/env python3
"""
Duplicate Finder — ищет дубликаты файлов по содержимому (хеш SHA256).
Использование: python find_duplicates.py /путь/к/папке [--delete]
"""
import os
import sys
import argparse
import hashlib
from collections import defaultdict
from pathlib import Path
def get_file_hash(filepath, chunk_size=8192):
"""Вычисляет SHA256 хеш файла"""
hash_obj = hashlib.sha256()
with open(filepath, 'rb') as f:
for chunk in iter(lambda: f.read(chunk_size), b''):
hash_obj.update(chunk)
return hash_obj.hexdigest()
def find_duplicates(root_dir, exclude_dirs=None):
"""Сканирует root_dir и возвращает словарь {хеш: [список путей]}"""
if exclude_dirs is None:
exclude_dirs = {'.git', '__pycache__', 'venv', 'node_modules'}
files_by_hash = defaultdict(list)
root = Path(root_dir).resolve()
for filepath in root.rglob('*'):
if not filepath.is_file():
continue
# Пропускаем исключённые директории
if any(part in exclude_dirs for part in filepath.parts):
continue
try:
file_hash = get_file_hash(filepath)
files_by_hash[file_hash].append(str(filepath))
except (PermissionError, OSError):
continue
return {h: paths for h, paths in files_by_hash.items() if len(paths) > 1}
def print_duplicates(duplicates):
"""Выводит найденные дубликаты в читаемом виде"""
if not duplicates:
print("✅ Дубликатов не найдено.")
return
total_size = 0
print(f"\n🔁 Найдено групп дубликатов: {len(duplicates)}\n")
for hash_val, paths in duplicates.items():
size = os.path.getsize(paths[0])
total_size += size * (len(paths) - 1)
print(f"📄 Хеш: {hash_val[:8]}... ({size} байт)")
for i, path in enumerate(paths):
marker = "🗑 (можно удалить)" if i > 0 else "📌 (оригинал)"
print(f" {i+1}. {path} {marker}")
print()
print(f"💾 Потенциально можно освободить: {total_size / (1024*1024):.2f} МБ")
def delete_duplicates(duplicates, dry_run=True):
"""Удаляет дубликаты (все, кроме первого)"""
deleted = 0
for paths in duplicates.values():
for path in paths[1:]: # первый оставляем
if dry_run:
print(f"[dry-run] Удалил бы: {path}")
else:
try:
os.remove(path)
print(f"✅ Удалён: {path}")
deleted += 1
except OSError as e:
print(f"❌ Ошибка удаления {path}: {e}")
if dry_run:
print("🔸 Это был пробный запуск. Добавьте --delete для реального удаления.")
else:
print(f"🗑 Удалено {deleted} файлов.")
if __name__ == "__main__":
parser = argparse.ArgumentParser(description="Поиск дубликатов файлов")
parser.add_argument('directory', help='Корневая папка для поиска')
parser.add_argument('--delete', action='store_true', help='Удалить дубликаты (без этого только показ)')
args = parser.parse_args()
if not os.path.isdir(args.directory):
print(f"❌ Папка {args.directory} не существует")
sys.exit(1)
print(f"🔍 Сканирую {args.directory} ...")
duplicates = find_duplicates(args.directory)
print_duplicates(duplicates)
if args.delete and duplicates:
confirm = input("\n⚠️ Точно удалить все дубликаты? (yes/no): ")
if confirm.lower() == 'yes':
delete_duplicates(duplicates, dry_run=False)
else:
print("❌ Удаление отменено.")
elif duplicates and not args.delete:
delete_duplicates(duplicates, dry_run=True)
Программистика|| #article5 579
Хакеры слили бесплатные версии дорогих нейросетей
Пока одни платят свою зарплату на подписки, другие уже пользуются этими нейросетями бесплатно
• Trends.Vc — находит схемы заработка и реализовывает всё за тебя 💸 • Youper — ии психолог помогает понять себя и избавляет от апатии 🧠 • DeepFaceLab — создаёт фейкового персонажа любого пола, повторяя твои эмоция и движения 🤭 • Socratic — решает за вас экзамены, курсовые, по фотке вашего задания 🎓 Лазейку скоро закроют. Успей скачать, пока доступ открыт: https://t.me/+Zbu9UqdaU7g4M2Ji
5 579
⏳ tqdm: Прогресс-бары для тех, кто устал ждать и гадать
Запустил долгий цикл, ушёл пить кофе, вернулся — а он всё ещё работает. Сколько осталось? Непонятно. Успеешь ли сходить в магазин? Тоже непонятно. Пора добавить визуальную обратную связь в свои скрипты.
tqdm — это самая популярная библиотека для создания прогресс-баров в Python. Она оборачивает любой итерируемый объект и мгновенно показывает красивый индикатор выполнения с оценкой времени.
❌ Было (скучно и непонятно):
import time
for i in range(100):
time.sleep(0.1) # какая-то работа
# и никакой информации о прогрессе
✔️ Стало (красиво и информативно):
from tqdm import tqdm
import time
for i in tqdm(range(100)):
time.sleep(0.1) # теперь видно: 45% | ████▌ | 45/100 [00:04<00:05]
➕ Почему tqdm — это маст-хэв:
🟢 Одна строка кода: Просто оберни свой итерируемый объект в tqdm().
🟢 Автоматика: Сам определяет общее количество, частоту обновления, оставшееся время.
🟢 Настраиваемость: Можно менять описание, формат, цвет (в Jupyter), добавлять вложенные бары.
🟢 Универсальность: Работает с циклами, pandas (.progress_apply), запросами, файлами.
➖ Особенности:
➖ В некоторых терминалах может мигать, если обновлять слишком часто.
➖ При параллельных процессах нужно использовать tqdm аккуратно (есть tqdm.contrib.concurrent).
🧪 Продвинутые примеры:
1. Ручное обновление (для своих итераций):
pbar = tqdm(total=100)
for i in range(10):
# делаем что-то, что даёт 10 единиц прогресса за раз
pbar.update(10)
pbar.close()
2. Описание и вложенность:
from tqdm import trange
for i in trange(5, desc="Внешний цикл"):
for j in trange(10, desc="Внутренний", leave=False):
time.sleep(0.05)
3. В Jupyter Notebook:
from tqdm.notebook import tqdm
for i in tqdm(range(1000)):
# красивые цветные бары прямо в ноутбуке
4. Для pandas:
import pandas as pd
from tqdm import tqdm
tqdm.pandas() # включает поддержку progress_apply
df.progress_apply(lambda row: heavy_func(row), axis=1)
📦 Установка:
pip install tqdm
# Для Jupyter: pip install "tqdm[notebook]"
tqdm превращает скучное ожидание в контролируемый процесс. Перестань гадать — начни видеть прогресс.
🐱 Ссылка на репозиторий
Программистика|| #Library5 579
Работаете с СУБД? Присоединяйтесь к сообществу Pangolin!
Телеграм-канал для разработчиков и администраторов баз данных.
Pangolin — это PostgreSQL с 80+ доработками, и мы открыто рассказываем о его разработке.
У нас вы найдете:
• Технические детали и архитектурные решения
• Разборы доработок PostgreSQL
• Ответы на вопросы по эксплуатации и коду
• Кейсы внедрения и оптимизации
• Вакансии для тех, кто хочет работать с нами
• Вебинары и встречи с экспертами
• Знакомство с командой: хобби, книги и интересы
Присоединяйтесь к сообществу, где говорят на языке баз данных
Подписаться
#реклама 16+
О рекламодателе
اکنون در دسترس! پژوهش تلگرام ۲۰۲۵ — مهمترین بینشهای سال 
