Python для пацанов.

Python для пацанов.

@gopstop_python

"Серьезный" разбор языка программирования Пайтон для серьезных пацанов.

134подписчиков
Еженедельно🇷🇺

Похожие каналы

Все →

Последние посты

🔥 Продолжаем базарить про Python 3.13! 🔥В прошлом посте мы уже говорили про те самые 40% потери производительности в однопоточных программах без GIL. Но не всё так плохо, пацаны. Давайте разберём, что ещё нас ждёт в Python 3.13, и как это вообще использовать. Дата релиза и что это значит для тебя 📅Python 3.13 выходит уже 7 октября 2024 года! Это значит, что скоро можно будет официально юзать версии без GIL. Это не просто мелкая обнова, это настоящая революция для тех, кто хочет выжимать из многопоточности максимум. Твой код будет реально параллельно работать на всех ядрах процессора, как настоящий чемпион. Как запустить Free-threading? 🛠1. Windows и macOS: качай обнову с официального сайта и просто выбирай установку без GIL. 2. Линукс или самосборщики: компилируешь с флагом --disable-gil, и готово! Как чекнуть, отключён ли GIL? 🔍Чтобы убедиться, что ты реально отключил GIL, запускай:python -VVЕсли увидишь надпись "experimental free-threading build", значит, ты сделал всё по красоте. Можно ещё проверить в рантайме через функцию sys._is_gil_enabled() Что по безопасности в многопоточке? ⚠️Когда работаешь без GIL, стоит быть осторожным:- Итераторы: не дели один и тот же итератор на все потоки — это может привести к проблемам.- Frame объекты: не трогай их в других потоках, это может крашнуть программу.Иммортализация объектов — это чё? 🛡Теперь некоторые объекты в free-threading режиме становятся бессмертными. Это значит, что они больше не будут удаляться из памяти. Это касается функций, модулей, методов и строк. Учти, если таких объектов будет много, твоя оперативка быстро забьётся. Иными словами - утечка памяти. Но в 3.14 это тоже обещали забороть. Что по C-расширениям? 🔧Если твои проекты зависят от C-расширений, знай, что не все из них поддерживают работу без GIL. Если вдруг что, GIL включится автоматически, и ты увидишь предупреждение. Это касается например таких важных либ, как lxml, на базе которой например сделаны самые быстрые части BeautifulSoup и много

3 окт. 2024 г.286В Telegram

Йо, пацаны, сегодня про важное! 😎🐍Знаете, что такое GIL? Это такой "Главный Интерпретаторский Замок", который держит ваш Питон в узде, пока он шпарит код в одном потоке. Но вот что интересно — в новом Питоне 3.13 чуваки из Python решили, что можно и без этого замка жить. Казалось бы, свобода для всех потоков, но тут есть засада!🔥 Если ты компилишь Python без GIL и запускаешь один поток — привет, тормоза! Почему? Ну, потому что система теперь тратит время на то, чтобы сделать всё безопасным для многопоточности. В итоге твой код тормозит примерно на 40% сильнее, чем в обычной версии с GIL! Да, это как если бы ты снял шлем на гонках и надеялся, что ветер сам разрулит — но нет, тормоза будут!💡 Когда это важно? Если у тебя обычный код, который не гоняет сотни потоков, то без GIL ты тупо теряешь скорость, как будто тачку на ручник поставил. Free-threaded Питон — штука крутая для тех, кто шарит в многопоточности, но если у тебя один поток, держись подальше, пока не прикрутят норм оптимизации.🥶 Но есть надежда! Говорят, что в Python 3.14 сделают так, что без GIL код будет тормозить всего на 10%, а это уже не так обидно. Но это потом, а пока — не гоняй, где не надо!Вывод для пацанов: если твой код одинокий волк (однопоточный), то GIL тебе друг. А если ты хочешь жить на грани и жмешь на газ в многопоточке — пробуй без GIL, но будь готов к тормозам в версии 3.13. 🚗💨Понравилось? Лайк и подписка, вы ж знаете, куда нажать! 💪

2 окт. 2024 г.259В Telegram

Окей, братва, сейчас я вам расскажу про модули в Питоне и как использовать файл __init__.py с фишками. Это как уметь управлять своим районом: знать, где кто живет, как всех организовать и сделать так, чтобы всё работало четко и гладко.Что такое модуль?Модуль в Питоне — это просто файл с кодом, который ты можешь импортировать и использовать в других частях своей программы. Например, у тебя есть файл math_functions.py, где ты хранишь все свои математические функции. Этот файл и есть модуль.# math_functions.pydef add(x, y): return x + ydef subtract(x, y): return x - yЧто такое пакет?Пакет — это как набор модулей, собранных в одну папку. Пакет позволяет структурировать код, делая его организованным и удобным для навигации. Чтобы Питон понял, что папка является пакетом, в ней должен быть файл __init__.py.Создание пакетаДопустим, у тебя есть проект с такой структурой:my_project/ math_functions.py string_functions.pyТы можешь организовать их в пакет:my_project/ my_package/ __init__.py math_functions.py string_functions.pyЧто такое `__init__.py`?__init__.py — это специальный файл, который позволяет Питону понимать, что эта папка является пакетом. Он может быть пустым, но обычно в нем можно описать код, который должен выполняться при импорте пакета.Пример использования `__init__.py`Давайте сделаем так, чтобы наш пакет my_package автоматически импортировал все функции из своих модулей. Вот как может выглядеть __init__.py:# my_project/my_package/__init__.pyfrom .math_functions import add, subtractfrom .string_functions import uppercase, lowercaseТеперь ты можешь импортировать функции прямо из пакета:# main.pyfrom my_package import add, uppercaseprint(add(2, 3)) # Выведет 5print(uppercase('hello')) # Выведет HELLOФишки с `__init__.py`1. Удобный импортТы можешь упростить импорт, собирая все нужные функции и классы в __init__.py, чтобы не писать длинные пути при импорте.# my_project/my_package/__init__.pyfrom .math_functions import add

27 июл. 2024 г.360В Telegram

Братва, давайте обсудим, когда нужно профилировать работу кода и какие инструменты у нас для этого есть. Это как проверка твоей тачки на сервисе: ты хочешь знать, где у тебя пробелы, что можно улучшить и где ускориться, чтобы гонять еще быстрее. Когда нужно профилировать код?Профилирование нужно, когда:1. Код работает медленно: Если твой код выполняется дольше, чем ты ожидал, профилирование поможет найти узкие места.2. Большое потребление ресурсов: Если программа жрет слишком много памяти или процессорного времени.3. Неоптимальные алгоритмы: Когда тебе кажется, что можно оптимизировать алгоритмы, но не знаешь, где именно.4. Проверка производительности: После внесения изменений или рефакторинга нужно убедиться, что все стало работать не хуже, а лучше.Инструменты для профилированияЕсть несколько крутых инструментов, которые помогут тебе понять, где твой код тормозит и как это исправить. 1. cProfilecProfile — это встроенный в Питон модуль для профилирования. Он покажет тебе, сколько времени занимает каждая функция. Пример использования cProfileimport cProfiledef main(): # Твой код здесь total = 0 for i in range(1000000): total += i print(total)cProfile.run('main()')Этот код покажет тебе подробный отчет о времени выполнения каждой части твоего кода.2. timeittimeit — это модуль для измерения времени выполнения небольших участков кода. Он полезен, когда тебе нужно проверить, какой из двух фрагментов кода работает быстрее.Пример использования timeitimport timeit# Первый вариант кодаsetup_code = "from math import sqrt"test_code_1 = """def compute(): result = [] for i in range(100): result.append(sqrt(i)) return result"""# Второй вариант кодаtest_code_2 = """def compute(): return [sqrt(i) for i in range(100)]"""time_1 = timeit.timeit(setup=setup_code, stmt=test_code_1, number=10000)time_2 = timeit.timeit(setup=setup_code, stmt=test_code_2, number=10000)print(f"Время первого варианта: {time_1}")print(f"Время второго варианта: {time_2}")Эт

14 июл. 2024 г.256В Telegram

#Асинхронность на питоне — это как когда у тебя много дел, и ты хочешь все успеть, но времени в обрез. Представь, ты на районе, и у тебя куча дел: надо закинуть вещи в стиралку, сварить макароны и ответить корешу в телеге. В идеале ты бы хотел делать это всё одновременно, чтобы не тратить время зря.Так вот, в программировании тоже самое. У тебя есть задачи, которые могут долго выполняться, например, запрос на сервер или чтение файла. Если выполнять их последовательно, ты будешь сидеть и ждать каждую задачу, как будто в очереди за шаурмой.Асинхронность позволяет запускать задачи параллельно, как будто у тебя несколько рук. В Python это делается с помощью ключевых слов async и await.Вот как это выглядит на коде:import asyncioasync def стиралка(): print("Закинул вещи в стиралку...") await asyncio.sleep(5) # стиралка работает print("Вещи постираны!")async def макароны(): print("Поставил воду на макароны...") await asyncio.sleep(3) # вода закипает print("Макароны сварены!")async def отвечаю_корешу(): print("Ответил корешу в телеге...") await asyncio.sleep(1) # печатаешь сообщение print("Сообщение отправлено!")async def главный_план(): await asyncio.gather(стиралка(), макароны(), отвечаю_корешу())# Запуск программыasyncio.run(главный_план())Что происходит в этом коде:1. Ты запускаешь все три задачи параллельно с asyncio.gather().2. Пока стиралка работает, ты можешь заняться макаронами.3. И пока вода закипает, ты можешь ответить корешу.Вместо того чтобы ждать, пока каждая задача выполнится, ты используешь своё время эффективно, как настоящий мастер тайм-менеджмента на районе. Асинхронность в Python — это как будто у тебя суперспособности делать всё и сразу, не тратя время на ожидание.

17 июн. 2024 г.279В Telegram

#ПервыйКодНаРайоне О, братишка, сейчас поговорим про reduce. Эта функция в Питоне - как крутой барыга на рынке, который умеет из кучи мелочи делать одну большую котлету. Собирает всё в кучу и выдает тебе финальный результат. Чтобы пользоваться reduce, надо подключить его откуда? Правильно, из модуля functools.Что такое reduce?Функция reduce принимает два аргумента: функцию и последовательность. Функция должна быть такой, что принимает два аргумента, а reduce применяет её ко всем элементам списка, шаг за шагом, сокращая список до одного единственного значения. Это как если бы ты складывал деньги в копилку: кидаешь одну монету, потом другую, и так, пока не сложишь всё.Примеры использования reduceПример №1: Суммирование списка чиселДопустим, у тебя есть список бабок, которые ты должен взять с братвы, и ты хочешь узнать, сколько всего бабок тебе обещали.from functools import reduce# Список бабокbabki = [100, 200, 300, 400]# Функция для суммированияdef summa(x, y): return x + y# Используем reduce для суммированияtotal_babki = reduce(summa, babki)print(total_babki) # Выведет 1000Пример №2: Нахождение максимального числа в спискеЕсли тебе нужно выбрать самого богатого братана из списка долгов, то reduce поможет и с этим.# Список долгов братвыdolgi = [100, 200, 500, 300]# Функция для нахождения максимумаdef max_dolg(x, y): return x if x > y else y# Используем reduce для нахождения максимального долгаmax_dolg = reduce(max_dolg, dolgi)print(max_dolg) # Выведет 500Пример №3: Умножение всех чисел в спискеТы хочешь узнать, во сколько раз увеличится твой капитал, если каждый день умножать его на какой-то коэффициент.# Коэффициенты роста капитала за 4 дняcoefficients = [1.1, 1.2, 1.3, 1.4]# Функция для умноженияdef umnozhit(x, y): return x * y# Используем reduce для расчета итогового увеличенияtotal_growth = reduce(umnozhit, coefficients)print(f"Капитал увеличится в {total_growth:.2f} раз") # Форматируем вывод, чтобы было красивоВот так, бро, reduce работает как зверь,

16 апр. 2024 г.447В Telegram

#ПервыйКодНаРайонеБратва, сегодня я вам раскрою тему лямбда-функций в Питоне. Это как когда тебе нужно сделать быструю и маленькую задачку, не разводя длинную авантюру. Что такое лямбда-функция?Лямбда-функция в Питоне – это маленькая анонимная функция, у которой может быть куча аргументов, но только одно выражение. Это типа когда ты просишь брата на секунду помочь – быстро и по существу. Анонимная в данном случае означает, что у неё нет имени, и нельзя её просто так взять, и вызвать из другой части кода. Пример №1: Сортировка списка кортежейДопустим, у тебя есть список долгов перед братвой, и тебе нужно их отсортировать по размеру долга.dolgi = [('Саня', 100), ('Витя', 50), ('Петя', 75)]# Используем лямбду для сортировки по второму элементу кортежа (размеру долга)otvet = sorted(dolgi, key=lambda x: x[1])print(otvet) # Выведет список отсортированный по размеру долгаПример №2: Фильтрация спискаЕсть список чуваков, и нужно оставить только тех, у кого в имени есть "а".bratva = ['Саня', 'Витя', 'Петя', 'Коля']# Используем лямбду в фильтре, чтобы оставить только нужных братьевfilter_otvet = list(filter(lambda x: 'а' in x, bratva))print(filter_otvet) # Покажет тех, у кого есть 'а' в имениПример №3: Применение функции к спискуУ тебя есть список ценников на вещи, и нужно к каждому прибавить НДС.cenniki = [100, 200, 300]# Используем лямбду с map, чтобы к каждому ценнику прибавить НДСnds_otvet = list(map(lambda x: x * 1.2, cenniki))print(nds_otvet) # Выведет новые ценники уже с НДСТак вот, братан, лямбда-функции – это когда надо быстро и без лишних вопросов сделать дело. Они маленькие, но могут пригодиться в самых разных ситуациях.#ПервыйКодНаРайоне

31 мар. 2024 г.393В Telegram

#ПервыйКодНаРайоне Браток, слышал о такой штуке, как ChainMap в Python? Давай разберем на понятиях, чтобы ты понял суть, как на улице разбираются с долгами.Представь, у тебя есть несколько карманов, в каждом – свои бабки, карточки, записки. Но когда ты ищешь конкретную фишку, типа пятёрку или записку от братвы, тебе не приходится выворачивать все карманы. Ты знаешь, в каком кармане что лежит, но иногда забываешь. Вот здесь на помощь и приходит ChainMap – это как твой личный помощник, который помнит, что где лежит.ChainMap берет несколько словарей (представь, что это твои карманы) и создает одну общую шнягу, где можно искать ключи и значения по всем словарям сразу, но не перемешивая их. Это как если бы у тебя был помощник, который знает, что в одном кармане бабки, в другом – мелочь для автобуса, а в третьем – записки.Когда ты ищешь что-то через ChainMap, он сначала смотрит в первый словарь (карман), и если там нет нужного – переходит ко второму, и так далее, пока не найдет или не проверит все карманы.Но вот беда, если ты решишь что-то добавить через ChainMap, это попадет только в первый карман (словарь), так что будь аккуратен, а то потом ищи свои записки по всем карманам.Допустим, у нас есть братишки из разных районов: Москва, Питер, Казань. У каждого из них своя область ответственности, и тебе нужно все это собрать в кучу, чтобы знать, к кому по каким вопросам обращаться. Используем ChainMap для этого.from collections import ChainMap# Допустим, у каждого братишки свои связки.moscow_bro = {'Вася': 'Финансы', 'Петя': 'Улицы'}piter_bro = {'Коля': 'Концерты', 'Витя': 'Бары'}kazan_bro = {'Рустам': 'Спорт', 'Ильяс': 'Еда'}# Соединяем все связки в одну большую с помощью ChainMap.all_bros = ChainMap(moscow_bro, piter_bro, kazan_bro)# Теперь можно искать по всем братишкам сразу.print(all_bros['Вася']) # Финансыprint(all_bros['Коля']) # Концертыprint(all_bros['Рустам']) # Спорт# Допустим, тебе нужно добавить нового братишку.all_bros['Дима'] = 'Музыка' # Добавляется в Мос

21 мар. 2024 г.300В Telegram

#ПервыйКодНаРайонеБратва, сегодня мы зайдем с вами в мир Python с другой стороны улицы – поговорим о магических методах. Это не просто какие-то функции, это настоящая магия в мире кода, которая позволяет нашим объектам (ссыль для самых продвинутых из вас) вести себя как настоящие шулеры в карточной игре.Магические методы в Python – это спецфункции, благодаря которым твой код начинает работать по-новому, становится более крутым и умным. Как невидимые нити, они позволяют объектам взаимодействовать друг с другом и с Python'ом на глубоком уровне.Давайте напишем простой код, который кое что растолкует сам по себе:import collectionsfrom random import choice, shuffle# Создаём картеж для карт, чтобы каждая карта была как уникальный элемент с рангом и мастью.Card = collections.namedtuple('Card', ['ранг', 'масть'])class FrenchDeck: # Определяем ранги карт и масти в виде юникод символов. ranks = [str(n) for n in range(2, 11)] + list('JQKA') suits = '♠️ ♦️ ♣️ ♥️'.split() def __init__(self): # Заполняем нашу новенькую колоду картами, создаём рангами и мастями. self._cards = [Card(rank, suit) for suit in self.suits for rank in self.ranks] def __len__(self): # Возвращает количество карт в колоде чтобы лохи верили, что мы не шулеры. return len(self._cards) def __getitem__(self, position): # Получение карты из колоды по её позиции - как звонок определённому жителю города. return self._cards[position] def __setitem__(self, position, value): # Меняем карту в колоде - это как переезд жителя на новое место. self._cards[position] = value def __repr__(self): # Представление колоды карт для печати. Покажет всех "жителей" нашего города. return f'FrenchDeck({self._cards})'crime_queen = Card('Q', '♠️') # Пример карты - "Пиковая дама". (Коварна и упряма)print(crime_queen)deck = FrenchDeck() # Создаём колоду карт.print(f'{len(deck)=}') # Узнаём количество карт в колоде.print(f'{deck[0]=}') # Показ

14 мар. 2024 г.303В Telegram

#ПервыйКодНаРайонеПацаны, вот коротко о том, чем круты виртуальные окружения в Python, как они работают и зачем вам это нужно.Виртуальное окружение: закрытая тусовка для твоего кодаСчитай, виртуальное окружение – это твоя личная зона для проекта, отделенная от всего мира. Как закрытая вечеринка, где ты контролируешь все: музыку (версию Python), закуски (библиотеки и пакеты) и гостей (зависимости).Создаем окружение:python -m venv название_для_тусовкиТак ты говоришь Python: "Создай мне место, где я буду шеф".Общепринятно, и мы рекомендуем использовать названия типа venv или envЗаходим на тусовку (активируем окружение):- На Unix или macOS: source <название_для_тусовки>/bin/activate - На Windows: <название_для_тусовки>\Scripts\activate Теперь ты в своем мире, где можешь делать что хочешь, не ломая глобальное пространство.Покидаем тусовку (деактивируем окружение):deactivateТы вернулся в реальный мир, где всё как было.Что тут круто:Пацаны, давайте разберемся, почему виртуальные окружения в Python – это чистый кайф для каждого кодера:Наследование от глобального окруженияСмотрите, когда вы создаете новую закрытую тусовку (виртуальное окружение), она не начинается с нуля. Она "наследует" некоторые базовые штуки из вашего большого мира (глобального окружения Python). Это значит, что основные инструменты уже будут под рукой, но без всей той лишней фигни, которая могла накопиться в вашей системе. Это как если бы на вашей вечеринке уже были газировка и чипсы, но музыка и народ – только те, кого вы пригласили.Изоляция ресурсовТут дело такое – каждая ваша тусовка, каждый проект в своем виртуальном окружении, живет своей жизнью. Установили кучу пакетов в одном проекте? Они не попадут в другие. Это помогает избежать конфликтов между зависимостями разных проектов. То есть, если в одном проекте тебе нужна одна версия библиотеки, а в другом – другая, то ты можешь спокойно использовать обе, и они не будут мешать друг другу. Это как иметь разные комнаты для разных тусовок в одном

11 мар. 2024 г.206В Telegram

#АМужикиТоИНеЗналиТак как среди читательниц канала есть девушки довольно хорошо владеющие языком программирования Питон, и удивить их сложно, мы всё равно попробуем. Используем метаклассы. class CongratulateMeta(type): def __new__(cls, name, bases, attrs): # Добавляем метод для поздравления attrs['congratulate'] = lambda self: f"Дорогая {attrs['name']}, поздравляем тебя с 8 Марта! Желаем счастья, здоровья и кода без багов везде там, где это действительно необходимо!" return super().__new__(cls, name, bases, attrs)# Используем метакласс в определении нового классаclass FemaleProgrammer(metaclass=CongratulateMeta): name = "Ася"# Создаем экземпляр классаprogrammer = FemaleProgrammer()print(programmer.congratulate())📱Дорогая Ася, поздравляем тебя с 8 Марта! Желаем счастья, здоровья и кода без багов везде там, где это действительно необходимо!В этом примере метакласс CongratulateMeta автоматически добавляет метод congratulate к любому классу, который его использует. Этот метод выводит персонализированное поздравление, используя имя, определенное в классе.#АМужикиТоИНеЗнали

8 мар. 2024 г.197В Telegram

#АМужикиТоИНеЗналиДавайте рассмотрим пример использования блока else с циклами в Python на понятном примере.Представьте, что вы и ваши друзья с района решили сыграть в игру на удачу. Вы кидаете кубик (шестигранный), и если кто-то из вас выбросит шестерку, то этот человек выигрывает и игра заканчивается. Если же никто не выбросит шестерку после нескольких попыток, то все проиграли и решаете попробовать снова позже.В коде на Python это можно реализовать так:from random import randintпопытки = 5 # Допустим, у вас есть 5 попытокfor _ in range(попытки): бросок = randint(1, 6) # Кидаем кубик print(f"Бросок: {бросок}") if бросок == 6: print("Выигрыш! Кто-то выбросил шестерку!") breakelse: # Этот блок выполнится, если цикл завершился нормально, без 'break' print("Проигрыш. Никто не выбросил шестерку. Попробуем в другой раз.")В этом примере, блок else срабатывает только если цикл for завершился полностью, без прерывания через break. То есть, если никто не выбросил шестерку после всех попыток, выведется сообщение о проигрыше. Если же кто-то выбросил шестерку (и цикл был прерван командой break), блок else не выполняется, и выводится сообщение о выигрыше.Использование else с циклами может быть не очень интуитивным, но оно может добавить дополнительную логику обработки ситуаций, когда цикл завершился без прерывания.#АМужикиТоИНеЗнали

7 мар. 2024 г.171В Telegram

#АМужикиТоИНеЗналиДавайте рассмотрим пример использования распаковки списков с помощью звездочки * на понятном и простом примере.Представим, что у вас есть список друзей с района, и вы хотите собрать их всех в одном месте, чтобы устроить вечеринку. У вас уже есть список с некоторыми именами, и вы хотите добавить еще несколько друзей в этот список.Вот ваш текущий список друзей:друзья_с_района = ["Вася", "Петя", "Коля"]Теперь представим, что вы встретили еще трех других друзей, и вы хотите добавить их к уже существующему списку. Ваши новые друзья:новые_друзья = ["Лена", "Оля", "Саша"]Чтобы объединить эти два списка в один, вы можете использовать распаковку с помощью *, как показано ниже:все_друзья = [*друзья_с_района, *новые_друзья]В результате получится следующий список:["Вася", "Петя", "Коля", "Лена", "Оля", "Саша"]Это очень удобный способ объединения списков без необходимости использовать циклы или дополнительные методы. Таким образом, вы можете легко собрать всех друзей вместе.#АМужикиТоИНеЗнали

6 мар. 2024 г.154В Telegram

#ПервыйКодНаРайоне #фишки #pipРебята, давайте разжуем каждый шаг по созданию и публикации вашего пакета в PIP с примерами и кодом.Шаг 1: Придумай свой проектСкажем, у тебя есть полезная функция для вычисления дней до Нового Года. Создай папку newyear_countdown и внутри нее файл countdown.py:# countdown.pyfrom datetime import datetime, datedef days_until_newyear(): today = date.today() newyear = date(today.year + 1, 1, 1) delta = newyear - today return delta.daysШаг 2: Организуй свой кодУбедись, что структура твоего проекта выглядит так:newyear_countdown/ __init__.py countdown.pyВ __init__.py можно добавить следующее:from .countdown import days_until_newyearШаг 3: Напиши setup.pyВ корне твоего проекта (newyear_countdown/) создай файл setup.py:from setuptools import setup, find_packagessetup( name='newyear_countdown', # имя твоего пакета, как ты зовешь свой проект version='0.1', # версия твоего пакета, чтобы все знали, насколько он свежий packages=find_packages(), # автоматически находит все пакеты (папки с __init__.py), которые нужно включить description='Countdown to New Year', # краткое описание твоего проекта, что он делает install_requires=[], # список зависимостей, других пакетов, без которых твой не будет работать)- name: Это имя твоего пакета. Как ты его зовешь, так он и будет отображаться в PyPI и при установке через pip.- version: Версия твоего пакета. Важно обновлять ее с каждым значимым обновлением твоего проекта. Следуй принципам семантического версионирования (например, 1.0.0, 1.0.1 для патчей, 1.1.0 для минорных изменений).- packages: Сюда входят все Python пакеты (каталоги с файлом __init__.py), которые должны быть включены в дистрибутив. find_packages() автоматически находит все такие пакеты в твоем проекте.- description: Краткое описание того, что делает твой пакет. Это то, что люди увидят в PyPI, когда найдут твой пакет.- install_requires: Список зависимостей, необходимых для работы твоего пакета. Если твой проект ис

6 мар. 2024 г.190В Telegram

Рубрика #АМужикиТоИНеЗнали на нашем канале демонстрирует необычные и малоизвестные факты о программировании на Python, которые могут удивить даже опытных разработчиков. Это короткие, но мощные порции знаний для тех, кто хочет глубже погрузиться в мир IT и расширить свои горизонты.Начнём.Давайте рассмотрим неочевидную функциональность в Python, которая может быть неизвестна даже опытным разработчикам, такую как контекстные менеджеры и их создание с помощью модуля contextlib.Контекстные менеджеры в Python используются для обеспечения предварительной и последующей обработки при выполнении блока кода, часто применяются для управления ресурсами. Самый известный пример использования — конструкция with open(...) as ...:, которая гарантирует закрытие файла после выхода из блока with.Малоизвестный факт заключается в том, что вы можете создать свой собственный контекстный менеджер с помощью декоратора contextlib.contextmanager. Это может быть полезно, например, для создания блока кода, который требует установки и очистки ресурсов, таких как открытие и закрытие соединения с базой данных.Вот пример создания простого контекстного менеджера, который записывает в лог начало и конец выполнения какого-либо действия:from contextlib import contextmanagerimport time@contextmanagerdef log_block(name): start_time = time.time() print(f"Начало выполнения блока '{name}'") try: yield # Передать управление в блок with finally: end_time = time.time() print(f"Завершение выполнения блока '{name}'. Время выполнения: {end_time - start_time:.2f} секунд.")# Пример использования:with log_block("обработка данных"): # Здесь размещается код, который вы хотите выполнить # Например, какая-то тяжелая задача time.sleep(2) # Имитация долгой операцииВ этом примере контекстный менеджер log_block печатает сообщение при входе в блок и при выходе из него, а также засекает время выполнения кода внутри блока. Это простой пример того, как можно использовать контекстные мен

5 мар. 2024 г.130В Telegram