Программистика
关闭频道
Лучший канал про python Ссылка для друга: https://t.me/+Ai6ughKtf5g2ZmFi Купить рекламу: https://telega.in/c/+Ai6ughKtf5g2ZmFi Админ: @JeyRahol По рекламе: @ReivuManager
显示更多5 791
订阅者
-624 小时
+157 天
-4130 天
帖子存档
5 790
❖ Что делать в случае отключения России от глобального Интернета?
❖ Как не сливать государству гигабайты своих данных?
❖ Как обойти «глушилку» мобильной связи в регионах?
В 2026 году любое государство готово залезть к вам в прямую кишку ради контроля персональных данных. И тендеция только набирает обороты.
Чтобы щупальца РКН, правоохранителей и мошенников не коснулись вашей жизни, держите в подписках «PythonLab»
Анонимный хакер из российской группировки рассказывает как обходить ограничения, не оставлять «цифровые следы» и пользоваться топовыми нейронками без ограничений.
Сохраняйте, пока в стране во всю закручивают гайки, такие каналы — на вес золота: @TechLab
5 790
👩💻 `filter`: когда нужны не все элементы, а только хорошие
Многие, отфильтровывая элементы, пишут громоздкие циклы с
if и append. Но в Python есть встроенная функция, которая делает это элегантнее и часто быстрее — filter().
❌ Было (долго и нудно):
nums = [1, 2, 3, 4, 5, 6]
evens = []
for num in nums:
if num % 2 == 0:
evens.append(num)
✔️ Стало (кратко и функционально):
nums = [1, 2, 3, 4, 5, 6]
evens = list(filter(lambda x: x % 2 == 0, nums))
Что делает `filter`
filter(function, iterable) применяет функцию к каждому элементу итерируемого объекта и возвращает итератор только с теми элементами, для которых функция вернула True.
def is_positive(x):
return x > 0
numbers = [-2, -1, 0, 1, 2]
positive = list(filter(is_positive, numbers)) # [1, 2]
🟢 Важно: filter возвращает итератор, а не список. Если нужен список — оборачивай в list().
Преимущества:
🟢 Читаемость: сразу понятно — "фильтруем элементы по условию".
🟢 Ленивость: можно обрабатывать огромные последовательности, не загружая всё в память.
🟢 Компактность: не нужно писать цикл с append.
🟢 Скорость: для больших данных может быть быстрее, чем цикл на Python.
Практический пример
Допустим, есть список пользователей, нужно оставить только совершеннолетних:
users = [
{'name': 'Алиса', 'age': 17},
{'name': 'Боб', 'age': 25},
{'name': 'Карл', 'age': 16}
]
adults = list(filter(lambda user: user['age'] >= 18, users))
print(adults) # [{'name': 'Боб', 'age': 25}]
Когда `filter` — это хорошо:
✔️ У тебя уже есть готовая функция (особенно встроенная), которая возвращает bool. ✔️ Данные большие, и ленивость важна. ✔️ Хочешь код в функциональном стиле без побочных эффектов. ✔️ Комбинируешь с map, reduce и другими функциональными инструментами.Когда `filter` — не лучший выбор: ❌ Условие сложное и требует много строк — лучше вынести в отдельную функцию и использовать её в
filter.
❌ Нужно не только отфильтровать, но и преобразовать элементы — тогда filter + map могут быть тяжелее, чем одно списковое включение.
❌ Для простых условий списковое включение часто читается понятнее:
# filter
evens = list(filter(lambda x: x % 2 == 0, nums))
# list comprehension (часто предпочтительнее)
evens = [x for x in nums if x % 2 == 0]
filter делает код чище и короче, но, как и любой инструмент, требует осознанного подхода.
Программистика || #doc5 790
🚀 Создавать IT-проекты сегодня можно в разы быстрее с помощью AI
🌎🌟 Все благодаря vibe coding
Когда вы не пишете код строка за строкой, а управляете разработкой через искусственный интеллект
🦾🦾 Университет искусственного интеллекта - один из крупнейших образовательных проектов по AI в России и СНГ
🤖 Уже 7 лет мы обучаем работе с искусственным интеллектом, выпустили более 11 000 студентов и собрали самую большую базу практического контента по AI
🔥🔥 Мы запустили Vibe Coding School, где разберем:
🔹 Создание web-приложений через Google AI Studio
🔹 Разработку backend на Python через GPT
🔹 Работу с базами данных
🔹 Создание реальных AI-проектов
🌎🌎🌎 Спикер - Дмитрий Романов, Senior AI, AI-разработчик с 2003 года, руководитель IT-проектов и основатель Университета
Если хотите научиться быстро создавать свои IT-проекты и AI-сервисы, приходите 👇
🤖 Подробнее о программе
5 790
💻 Вопрос с собеседования: Что произойдёт, если изменить список (list) во время итерации по нему?
Это вопрос-ловушка, который часто задают, чтобы проверить, понимает ли кандидат внутреннее устройство итераторов. Новички обычно говорят «ничего страшного», а потом получают исключение или неожиданное поведение.
📌 Базовый ответ (которого ждут от джуна):
Изменять список во время итерации по нему — плохая практика. Это может привести к пропуску элементов, бесконечному циклу или исключению
RuntimeError.
# ❌ Так делать не надо
lst = [1, 2, 3, 4, 5]
for x in lst:
if x % 2 == 0:
lst.remove(x)
print(lst) # [1, 3, 5] — кажется, работает? Но не всегда!
Почему это опасно? При удалении элемента индексы сдвигаются, и цикл может пропустить следующий элемент или выйти за границы.
🧱 Глубокий разбор (для мидла и сеньора):
1. Что происходит под капотом?
Когда ты пишешь for x in lst:, Python создаёт итератор (через iter(lst)). Итератор запоминает текущую позицию по индексу. Если во время итерации ты удаляешь или добавляешь элементы, структура списка меняется, но итератор продолжает двигаться по старым индексам.🟢
lst = [1, 2, 3, 4, 5]
it = iter(lst)
print(next(it)) # 1
lst.remove(2) # список стал [1, 3, 4, 5]
print(next(it)) # 3 (элемент на позиции 1) — элемент 2 пропущен!
2. Разные типы ошибок:
🟢 Удаление: пропуск элементов (как выше) или IndexError, если удалить слишком много.
🟢 Добавление: бесконечный цикл, если добавлять элементы в конец.
🟢 Для словарей: RuntimeError: dictionary changed size during iteration — словари вообще нельзя менять во время итерации.
# Словарь упадёт сразу
d = {'a': 1, 'b': 2}
for k in d:
d['c'] = 3 # RuntimeError!
3. Как правильно?
Самый безопасный способ — итерироваться по копии:
lst = [1, 2, 3, 4, 5]
for x in lst[:]: # копия списка
if x % 2 == 0:
lst.remove(x)
Или использовать списковое включение для создания нового списка:
lst = [x for x in lst if x % 2 != 0] # новый список без чётных
Для сложных случаев можно итерироваться по индексам в обратном порядке:
for i in range(len(lst)-1, -1, -1):
if lst[i] % 2 == 0:
del lst[i]
⚠️ Ловушки и частые ошибки:
1. Наивная вера в то, что всё работает: Пример с удалением чётных чисел иногда даёт правильный результат, если элементы расположены определённым образом. Это создаёт ложное чувство безопасности. 2. Итерация по файлу: При чтении файла построчно его нельзя менять (добавлять/удалять строки) без переоткрытия. 3. Использование `list.remove()` в цикле: Удаляет только первое вхождение, что тоже может привести к путанице.💡 Итог для собеседования: 1. Не изменяй итерируемый объект во время итерации. Это антипаттерн. 2. Если очень нужно — итерируйся по копии (
lst[:], list(lst), copy.copy).
3. Для фильтрации используй списковые включения ([x for x in lst if condition]).
4. Словари и множества вообще нельзя менять во время итерации — будет исключение.
5. Понимание этого вопроса показывает, что ты знаешь, как работают итераторы и память в Python.
Удачи на собеседованиях! 🔥🔥
Программистика || #jobs5 790
👩💻 `
map`: когда превращать данные лень писать руками, а когда это лишнее
Многие, узнав про функциональный стиль, начинают пихать map куда только можно: list(map(str, numbers)), map(lambda x: x**2, data). Но часто списковое включение (list comprehension) читается лучше и работает так же. Разбираемся, когда map реально нужен, а когда это просто дань моде.
Что делает `map`
map применяет функцию к каждому элементу итерируемого объекта и возвращает итератор с результатами. Самый простой способ превратить числа в строки:
nums = [1, 2, 3]
strings = list(map(str, nums))
В отличие от for, map выполняется на Си (если функция тоже на Си), и может быть быстрее для больших данных. Но для повседневных задач разница незаметна.
Преимущества
🟢 Краткость: map(str, data) короче, чем [str(x) for x in data].
🟢 Производительность: для встроенных функций (int, str, abs) map быстрее благодаря низкоуровневой реализации.
🟢 Ленивость: map возвращает итератор, поэтому можно не хранить весь результат в памяти (полезно для огромных последовательностей).
🟢 Композиция: можно передавать несколько итерируемых объектов: map(pow, [1,2,3], [4,5,6]) даст степени 1⁴, 2⁵, 3⁶.
Практический пример
Допустим, нужно прочитать числа из файла (каждая строка — число) и преобразовать их в целые:
with open('numbers.txt') as f:
# Плохо: сначала читаем все строки, потом преобразуем
lines = f.readlines()
nums = [int(line) for line in lines]
# Хорошо: лениво читаем и преобразуем
with open('numbers.txt') as f:
nums = list(map(int, f)) # f итерируется по строкам, int применяется к каждой
Здесь map экономит память (нет промежуточного списка строк) и код чище.
Когда `map` всё-таки уместен (и даже хорош)
1. Если функция уже есть и не требует `lambda`:
# так читаемо
result = list(map(str.upper, words))
# так тоже неплохо, но map короче
result = [w.upper() for w in words]
2. Если нужно обработать несколько итерируемых объектов параллельно (как zip, но с функцией):
totals = list(map(lambda x, y: x * y, prices, quantities))
3. При работе с большими потоками данных, где ленивость критична (например, генераторы).
Когда `map` — это зло (и лучше использовать `for` или `list comprehension`)
1. Сложная логика внутри `lambda`:
# ❌ нечитаемо
result = list(map(lambda x: x['age'] if x['age'] > 18 else 0, users))
# ✅ понятно
result = [user['age'] if user['age'] > 18 else 0 for user in users]
2. Если нужен только побочный эффект (например, print). map создаёт итератор, который надо потребить, что сбивает с толку:
# ❌ кто-то забыл list()
map(print, items) # ничего не выведет
3. Когда читаемость важнее микрооптимизаций. Для 100 элементов разницы нет, а [x**2 for x in data] читается как предложение.
💡 Запомни:
🟢 map — отличный выбор, когда у тебя уже есть готовая функция (особенно встроенная) и ты хочешь применить её к каждому элементу.
🟢 Для простых преобразований вроде x**2 списковое включение понятнее и питоничнее.
🟢 Ленивость map полезна при работе с гигантскими данными, которые не помещаются в память.
🟢 Не пытайся засунуть сложную логику в lambda — вынеси в отдельную функцию или используй обычный цикл.
Программистика || #doc5 790
🖥 Tach: Строгий контроль зависимостей в Python (на Rust)
В Python легко устроить спагетти-код: один модуль импортирует другой, тот — третий, и всё превращается в запутанный клубок.
Tach решает эту проблему, позволяя явно указывать, какие модули могут общаться друг с другом.
Он написан на Rust, работает мгновенно и внедряет концепцию строгих интерфейсов в Python.
Зачем это нужно:
1. Чистая архитектура: Видно, кто кого вызывает. Если модуль orders полез в users без разрешения — Tach даст по рукам. 2. Безопасный CI: Tach проверит код перед деплоем. Если кто-то добавил "быстрый костыль" с левым импортом — сборка упадёт. 3. Строгий режим: Можно запретить импортировать из модуля всё подряд, разрешив только то, что явно указано в "публичном интерфейсе".Как использовать:
pip install tach
tach mod # Интерактивная настройка границ
tach check # Проверка нарушений
Идеально для больших проектов и командной разработки, где нужно держать архитектуру под контролем, а не надеяться на "авось".
🐱 Ссылка на GitHub
Программистика || #Library5 790
На Stepik запустили курс «От новичка к уверенности в коде на Python»
Курс создан для новичков, которым важно не заучить команды, а понять логику. Наглядные схемы и визуальные разборы показывают, что происходит внутри программы и как она работает
Много практики, понятные объяснения решений не дадут застрять на теории. Материал предлагает вам не иллюзию знаний, а ощущение контроля: вы ясно видите как из нескольких строк кода рождается работающая программа
Что внутри:
✅переменные и типы данных
✅условия и логика программ
✅циклы и рекурсия
✅функции и работа с вводом данных
✅списки, словари и множества
✅базовое ООП
✅работа с библиотеками Python
✅десятки задач и упражнений
Эти знания фундамент для написания простых ботов и автоматизации задач
Скидка 25%, действует 48 часов
🔗Пройти курс на Stepik
5 790
Профессия после службы — со скидкой к 8 Марта
С 5 по 12 марта ОСЭК дает дополнительную скидку –8% на всё обучение.
Это предложение действует на всю программу, а не только на первый семестр.
Ваша выгода — до 38 300 ₽ за семестр.
Почему это удобно:
дистанционное обучение — можно совмещать со службой
поступление без ЕГЭ и ОГЭ
диплом государственного образца
возможность сократить обучение на полгода
поддержка специалистов колледжа на всех этапах
Это шанс получить новую профессию и подготовиться к следующему этапу карьеры.
Акция действует только до 12 марта.
Чтобы получить скидку:
выберите специальность
назовите промокод 8МАРТА
оплатите семестр обучения
Подать заявку
#реклама
О рекламодателе
5 790
🖥 Prefect — это фреймворк оркестрации рабочих процессов с открытым исходным кодом, предназначенный для создания надежных конвейеров обработки данных на Python! Он позволяет превращать Python-скрипты в производственные рабочие процессы с минимальными усилиями, обеспечивая автоматическое отслеживание состояния, обработку ошибок, планирование задач и мониторинг в реальном времени. С помощью Prefect вы можете строить динамические и устойчивые конвейеры данных, которые адаптируются к изменениям и восстанавливаются после сбоев.🐱 Ссылка на GitHub Программистика || #Library
5 790
⚡️РОЗЫГРЫШ В ЧЕСТЬ ОТКРЫТИЯ В MAX
Теперь наши каналы доступны не только здесь, но и на платформе MAX. В честь этого события разыгрываем три приза, которые усилят вашу защиту в сети.
ПРИЗОВОЙ ФОНД:
⚠️ 1 МЕСТО: YubiKey 5 Series
Физический ключ, который делает двухфакторную аутентификацию неуязвимой. Никакой фишинг и слив паролей не страшны, пока ключ у вас.
⚠️ 2 МЕСТО: SATOSHI VPN на 1 год
Полная анонимность и шифрование трафика. Ваши данные под защитой в любых сетях.
⚠️ 3 МЕСТО: Книга "Хакерская самооборона" (Андрей Жуков, 2026)
Актуальная новинка по активной обороне. Учитесь думать как хакер, чтобы защищаться от реальных угроз.
📎 УСЛОВИЯ ПРОСТЫЕ:
Быть подписанным на этот канал (где вы читаете пост).
Быть подписанным на все 4 канала в MAX по ссылкам ниже.
→ max.ru/becaps
→ max.ru/cyberins
→ max.ru/itbook_library
→ max.ru/nsis_cybersec
📌 Нажать кнопку "Участвую" под этим постом.
Итоги подведём ровно через 20 дней с помощью рандомайзера 28.03.26 14:00MSK.
5 790
👀 Python. Уроки для начинающих
В книге 22 урока, более 40 практических упражнений и заданий для самостоятельной работы. Описан язык Python: его основы, типы данных, управляющие выражения, функции, объекты, классы, исключения, модули и пакеты. Рассмотрены более развитые инструменты языка: установка и применение дополнительных библиотек, многопоточное, многопроцессное и конкурентное программирование, аннотации типов. Рассказано о практическом применении Python и различных библиотек для загрузки данных из Интернета, парсинга веб-страниц, работы с базами данных, программирования графических и веб-приложений, математических расчетов, вывода графиков и работы с искусственным интеллектом. Электронный архив на сайте издательства содержит все примеры из книги.Программистика || #doc
5 790
🔥 Подписка на 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 790
💻 Вопрос с собеседования: Что будет, если использовать изменяемый объект (например, список) в качестве аргумента по умолчанию в функции?
Это один из самых коварных вопросов для новичков. Код выглядит безобидно, но ведёт себя странно. Половина джунов проваливается именно на нём, потому что не понимают, когда создаются аргументы по умолчанию.
📌 Базовый ответ (которого ждут от джуна):
Аргументы по умолчанию создаются один раз в момент определения функции, а не каждый раз при её вызове. Если использовать изменяемый объект (список, словарь), то он будет общим для всех вызовов.
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 790
🔠 Слили 4 ТБ по IT, хакингу и разработке.
⚪️ Все лучшие инструкции, гайды, книги и инструменты — без воды.
🖥 Курсы & GitHub — 579GB
☁️ Хакинг & ИБ — 756GB
🤒 OSINT — 315GB
⌨️ Python — 955GB
🙃 Linux & Bash — 459GB
😦 Работа в IT — 278GB
🖥 Общий архив — 946GB
➡️ Присоединяйтесь и скачивайте.
Пост будет удален через 48 часов.
5 790
🌸 Программистика поздравляет с 8 Марта!
Пусть код всегда компилируется с первого раза, баги обходят стороной, а вдохновение приходит чаще, чем новые фичи в Python. Желаем, чтобы в жизни было больше радостных моментов, тёплых улыбок и приятных сюрпризов. Оставайтесь такими же яркими и неповторимыми, как ваш любимый язык программирования.С праздником, девчонки! 🔥💐
5 790
🔄 Меняем значения переменных без временной переменной
Часто нужно поменять местами значения двух переменных. Новички обычно пишут так:
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 790
📊 Генератор фейковых данных: создай 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
Программистика|| #scripts