Серия «Шпаргалки»

16

Коллекции в Python. Часть первая

Большая шпаргалка по коллекциям в python.


Дисклеймер. На пиакбу нет редактора кода поэтому картинки. Поскольку это шпаргалка с примерами то в этом посте допустимо.

Статья вышла большая, количество иллюстраций превышает предел, поэтому я разделил ее на две части.

В Python коллекция — это объект, содержащий группу элементов и позволяющий с ними работать как с единым целым.

Коллекции обычно поддерживают:

- итерацию ( `for item in collection` )

- проверку вхождения ( `x in collection` )

- определение длины ( `len(collection)` )

- доступ по индексу или ключу (если упорядочены или ассоциативны)

> 💡 В Python нет строгого интерфейса «коллекция», но есть неформальные протоколы. Если объект поддерживает `__iter__`, `__len__`, `__contains__` — его можно считать коллекцией.

---

Что не является коллекцией

Следующие типы не считаются коллекциями, так как не содержат группы элементов:

- `int`, `float`, `bool` — скалярные значения

- `None` — отсутствие значения

- функции, модули, классы — это объекты, но не контейнеры данных (если только не содержат `__dict__`)

---

Основные встроенные коллекции

Доступны без импортов:

Расширенные коллекции из стандартной библиотеки

Другие коллекции и коллекционоподобные типы

Хотя не всегда называются «коллекциями» в бытовом смысле, эти типы тоже хранят или представляют группы данных.

1. `str` — строка

Неизменяемая упорядоченная коллекция символов.

2. `bytes`, `bytearray`

3. `range`

Ленивая упорядоченная последовательность чисел. Не хранит элементы в памяти.

4. `array.array`

Хранит однотипные числовые данные компактно (как в C).

5. Генераторы и итераторы

Не хранят данные — генерируют по запросу. Не поддерживают `len()` или индексацию.

6. `ChainMap` (из `collections`)

Объединяет несколько словарей в одну виртуальную коллекцию — поиск идёт по цепочке.

7. `OrderedDict` (из `collections`)

Словарь с гарантированным порядком вставки. Актуален для Python < 3.7.

8. `enum.Enum`, `enum.Flag`

Коллекции именованных констант.

9. `typing.NamedTuple`, `typing.TypedDict`

Типизированные обёртки над `namedtuple` и `dict`.

10. `heapq`, `bisect` — инструменты, а не коллекции

Работают с коллекциями, но сами коллекциями не являются:

- `heapq` — поддержка кучи через списки.
- `bisect` — вставка в отсортированный список с сохранением порядка.

---

1. Списки — `list`

Упорядоченная, изменяемая коллекция. Элементы могут повторяться, типы — любые.

Применяется, когда нужна гибкая последовательность: добавление, удаление, изменение элементов.

Создание: `[]`

2. Словари — `dict`

Коллекция пар **ключ → значение**. Ключи должны быть хешируемыми. С Python 3.7 сохраняет порядок вставки.

Полезен для структурированных данных: профили, конфиги, JSON.

Создание: `{}`

3. Кортежи — `tuple`

Упорядоченная, неизменяемая коллекция. Подходит для фиксированных данных.

Используется, когда важна неизменяемость: координаты, параметры, возвращаемые значения.

Создание: `()`

> 💡 Кортежи занимают меньше памяти и работают быстрее списков. Идеальны, когда изменяемость не нужна.

👉 Продолжение

Понравилось — ставь «+»
Полезно? Подпишись.

Удачи! 🚀

Показать полностью 14
13

Коллекции в Python. Часть вторая

Ссылка на первую часть.

Дисклеймер. На пиакбу нет редактора кода поэтому картинки. Поскольку это шпаргалка с примерами то в этом посте допустимо.

4. SimpleNamespace

Простой класс из модуля `types` для создания объектов с динамическими атрибутами. Доступ — через точку (`obj.attr`).

Полезен, когда нужен синтаксис `obj.name` без создания класса.

> 💡 Альтернатива словарю, когда удобнее писать `obj.name`, а не `obj['name']`.

5. Множества — `set`

Неупорядоченная коллекция уникальных элементов. Поддерживает операции: объединение, пересечение, разность.

Применяется для удаления дубликатов и проверки вхождения.

Создание: `{}` или `set()`

6. Неизменяемые множества — `frozenset`

Неизменяемая версия `set`. Можно использовать как ключ в словаре или элемент другого множества.

7. namedtuple — именованные кортежи

Неизменяемая структура с доступом по именам полей. Аналог кортежа, но читаемее.

> 💡 Отлично подходит для представления записей: точки, пользователи, конфиги — когда важна неизменяемость и читаемость.

8. deque — двусторонняя очередь

Оптимизирован для быстрых операций в начале и конце. Аналог списка, но эффективнее для `appendleft`, `popleft`.

> 💡 Используется в алгоритмах: BFS, кэширование (LRU), буферы, где важна производительность на концах.

9. Counter — счётчик элементов

Подсчитывает частоту элементов в итерируемом объекте. Удобен для статистики, анализа.

> 💡 Полезен для анализа текстов, логов, голосований — везде, где нужно посчитать, «что встречается чаще».

10. defaultdict — словарь со значениями по умолчанию

Автоматически создаёт значение по умолчанию при отсутствии ключа. Убирает необходимость проверок `if key in dict`.

> 💡 Убирает шаблонный код вида `if key not in d: d[key] = []`. Делает код чище и безопаснее.

11. dataclass — классы данных

Декоратор для автоматического создания классов с инициализатором, строковым представлением, сравнением и т.д.

> 💡 Заменяет ручное написание `__init__`, `__repr__`, `__eq__`. Идеален для DTO, конфигов, моделей.

12. UserList — кастомные списки

Наследуется от `collections.UserList`. Используется, чтобы создать список с переопределённым поведением.

> 💡 Полезен, когда нужно добавить логирование, валидацию, или изменить поведение стандартного списка.

13. UserDict — кастомные словари

Наследуется от `collections.UserDict`. Используется, чтобы создать словарь с переопределённым поведением.

> 💡 Используется для создания словарей с нормализацией ключей, валидацией, логированием, кешированием и т.п.

---

Сравнение коллекций по памяти и скорости

Выбор коллекции влияет на производительность и потребление памяти. Ниже — практические замеры для типичных сценариев.

1. Память: `list` vs `tuple` vs `array.array`

Создадим коллекции из 1 000 000 целых чисел и сравним размер в памяти.

> 💡 Вывод:
> - `array.array` экономит ~2x памяти для чисел.
> - `list` и `tuple` потребляют примерно одинаково, но `tuple` немного быстрее при итерации.

---

2. Скорость доступа: `list` vs `tuple` vs `array.array`

Замерим время доступа к каждому элементу в коллекции из 10 000 000 элементов.

> 💡 Вывод:
> - `array.array` — самый быстрый для чисел.
> - `tuple` быстрее `list` на 10–20%.
> - Разница заметна на больших объёмах.

3. Память: `dict` vs `SimpleNamespace` vs `dataclass`

Создадим объекты с 5 полями и сравним размер.

> 💡 Вывод:
> - `SimpleNamespace` и `dataclass` потребляют столько же памяти, сколько `dict`, потому что используют `__dict__`.
> - Если нужна экономия — используйте `__slots__` (см. ниже).

4. Экономия памяти: `dataclass` с `__slots__`

> 💡 Вывод:
> - `__slots__` экономит память и ускоряет доступ к атрибутам.
> - Цена — нельзя добавлять новые атрибуты динамически.

5. Скорость поиска: `list` vs `set`

Проверим, насколько быстрее `set` при проверке вхождения.

> 💡 Вывод:

> - `set` в тысячи раз быстрее `list` для проверки вхождения.

> - Всегда используй `set`, если нужно часто проверять `x in collection`.

6. Память: `set` vs `frozenset`

> 💡 Вывод:
> - `frozenset` и `set` потребляют одинаково.
> - Разница только в изменяемости.

7. Скорость добавления: `list.append` vs `deque.append` vs `deque.appendleft`

> 💡 Вывод:
> - `deque.appendleft` работает за O(1), в отличие от `list.insert(0)`, который O(n).
> - Для частых операций на обоих концах — только `deque`.

---

Общие рекомендации по производительности

Сравнение коллекций

> * — с Python 3.7+ словари, `defaultdict`, `UserDict`, `ChainMap` сохраняют порядок вставки.

---

Когда что использовать?

Первая часть

Понравилось — ставь «+»
Полезно? Подпишись.
Задавай вопросы в комментариях 👇👇👇
Удачи! 🚀

Показать полностью 19
20

Шпаргалка: Неочевидные возможности f-строк, о которых вы могли не знать

Дисклеймер. В пикабу нет редактора кода, поэтому будут картинки, впрочем, в данном посте это не мешает восприятию.

F-строки в python — это современный и очень удобный способ встраивать значения переменных и выражения прямо в текст строки.

Чтобы создать f-строку, просто поставьте букву f перед открывающей кавычкой. Внутри строки вы можете вставлять переменные, обернув их в фигурные скобки {}. Python автоматически заменит {переменная} на её значение.

Сила f-строк в том, что в фигурные скобки можно помещать не просто переменные, а практически любое валидное выражение Python. Это позволяет выполнять вычисления "на лету", не создавая лишних переменных.

Вы можете легко обращаться к элементам структур данных, таких как словари (по ключу) и списки (по индексу), прямо из f-строки.

Точно так же можно обращаться к атрибутам объектов (через точку .) и даже вызывать функции.

Использование f-строк для отладки

Начиная с Python 3.8, в f-строках появился мощный инструмент для быстрой отладки.

Если после имени переменной в фигурных скобках поставить знак равенства (=), Python выведет не только значение переменной, но и её имя. Это невероятно удобно для быстрой проверки значений в коде.

Отладочный спецификатор = можно комбинировать с обычными спецификаторами форматирования. Например, можно вывести имя переменной, а её значение отформатировать особым образом.

Знак = работает для целых выражений, что позволяет наглядно показать и само вычисление, и его результат.


Печать отладочного представления (repr)

У объектов в Python есть два строковых представления: str() (для пользователей) и repr() (для разработчиков). По умолчанию f-строки используют str().

Чтобы управлять этим, можно использовать флаги !s (для str) и !r (для repr) прямо в f-строке. Это более короткий и удобный способ, чем вызывать функции str() или repr() вручную.

Дополнение, выравнивание и усечение

F-строки предоставляют полный контроль над форматированием вывода, включая ширину поля, выравнивание и заполнение.

После переменной ставится двоеточие :, а затем спецификатор формата.

  • > — выравнивание по правому краю

  • < — выравнивание по левому краю

  • ^ — центрирование

  • Число после символа выравнивания задает общую ширину поля.

  • Символ перед выравниванием задает, чем заполнять пустое место (по умолчанию — пробел)

Чтобы обрезать строку до определенной длины, используется синтаксис :.N, где N — максимальное количество символов.

Числа и их представления

Для чисел существует множество полезных форматов.

Вы можете легко конвертировать числа в двоичную (b), восьмеричную (o) или шестнадцатеричную (x/X) системы. Использование # добавляет соответствующий префикс (0b, 0o, 0x).

Часто нужно дополнить число ведущими нулями до определенной длины (например, 0042). Для этого используется 0 в качестве символа-заполнителя. Для чисел с плавающей точкой можно контролировать и общую ширину, и количество знаков после запятой.

Для управления знаком и разделителями существуют специальные символы:

  • +: всегда показывать знак (+42, -42).

  • (пробел): показывать пробел для положительных чисел, минус для отрицательных (42, -42). Удобно для выравнивания в столбец.

  • , или _: использовать как разделитель тысяч

Многие встроенные объекты, как datetime, имеют свой собственный мини-язык форматирования, который можно использовать напрямую в f-строках.

Сами спецификаторы формата не обязаны быть статичными! Их можно задавать с помощью переменных, используя вложенные фигурные скобки.

Если вам нужно вывести в строке сами символы { или }, просто удвойте их.

Многострочные f-строки

Для длинных строк или генерации многострочного текста (например, SQL-запросов, HTML-шаблонов) используйте тройные кавычки. Выражения внутри также могут быть многострочными.

Результат:

Вопросы безопасности (Очень важно!)

Это ключевой аспект, который часто упускают.

F-строки сами по себе безопасны. Когда вы пишете f"Привет, {name}", это не является уязвимостью. Python не выполняет код, который может находиться внутри переменной name. Он просто берет её строковое представление.

Опасность возникает, когда вы комбинируете f-строки с функциями, исполняющими код, такими как eval() или при работе с шаблонизаторами.

Представьте, что вы позволяете пользователю вводить свой собственный шаблон формата.

КРАЙНЕ ОПАСНЫЙ КОД — НИКОГДА ТАК НЕ ДЕЛАЙТЕ:

Если пользователь введет {os.system("reboot")}, ваш сервер перезагрузится. Это уязвимость удаленного выполнения кода (RCE).

Мораль: F-строки предназначены для форматирования строк, шаблоны которых пишет сам разработчик. Никогда не передавайте строки, полученные от пользователя, в eval() или другие исполняющие функции, даже через f-строки. Для пользовательских шаблонов используйте безопасные движки, такие как Jinja2.

Производительность: почему f-строки так быстры?

f-строки быстрее, чем .format() или %. Но почему?

Причина в том, что f-строка — это не функция, а часть синтаксиса Python. Когда Python компилирует ваш .py файл в байт-код, он парсит f-строку и разбивает её на две части:

  1. Литеральные части (обычный текст).

  2. Выражения для вычисления.

В байт-коде это превращается в очень эффективную последовательность инструкций: взять литерал, вычислить выражение, преобразовать его в строку, взять следующий литерал и так далее, а затем объединить все части за одну операцию (BUILD_STRING).

Метод .format() же является обычным вызовом функции. Это означает дополнительные накладные расходы на вызов метода, парсинг строки формата во время выполнения и поиск соответствий между {} и аргументами. F-строки делают большую часть этой работы во время компиляции, что и дает им преимущество в скорости.

4. Инструменты для миграции

flynt и pyupgrade.

  • flynt: Это инструмент, специально созданный для автоматического преобразования старого кода с .format()и%` на f-строки. Он анализирует код и производит замену там, где это возможно.

  • pyupgrade: Более универсальный инструмент. Он не только обновляет синтаксис форматирования строк, но и применяет множество других современных синтаксических конструкций Python (например, super() без аргументов, синтаксис для аннотаций типов и т.д.).

Использование этих инструментов на старой кодовой базе — отличный способ быстро её модернизировать и улучшить читаемость.

Понравилось — ставь «+»
Полезно? Подпишись.
Задавай вопросы в комментариях 👇👇👇
Удачи! 🚀

Показать полностью 18
9

Shadow DOM - DOM внутри DOM

Дисклеймер. На пикабу до сих пор не завезли редактор кода, поэтому картинки. Кому на нравятся картинки - при желании может почитать статью на GitHub


DOM — это программный интерфейс (API) для кода страницы, который представляет страницу как древовидную структуру объектов.

Каждый HTML-элемент (например, <p>, <div>, <img>), каждый атрибут и каждый фрагмент текста является отдельным «узлом» (node) в этом дереве. С JavaScript, мы можем обращаться к этим узлам, чтобы динамически изменять страницу: менять текст, добавлять стили, создавать новые элементы или удалять существующие. По сути, DOM — это «живая» модель документа, с которой взаимодействует код.

Но у этой открытости есть и обратная сторона. Когда мы создаем сложный, многократно используемый компонент (например, кастомный видеоплеер или виджет календаря), его внутренняя структура и стили становятся уязвимыми. Стили CSS с основной страницы могут случайно «протечь» внутрь компонента и сломать его внешний вид. Аналогично, JavaScript-код страницы может непреднамеренно изменить внутренние элементы компонента, нарушив его логику.

Для решения этой проблемы и существует Shadow DOM (теневой DOM).

По своей сути, Shadow DOM — это «DOM внутри DOM». Это скрытое дерево элементов, которое прикрепляется к обычному элементу на странице (называемому «хостом»), но при этом оно изолировано от основного DOM. Оно позволяет разработчику создать герметичную границу вокруг внутренней структуры компонента, защищая его от внешнего мира.

Теневой DOM позволяет прикреплять скрытые DOM-деревья к элементам в обычном DOM-дереве. Это теневое дерево начинается с теневого корня (shadow root), под который можно прикреплять любые элементы так же, как и в обычном DOM.

<!--noindex--><a href="https://pikabu.ru/story/shadow_dom__dom_vnutri_dom_12992706?u=https%3A%2F%2Fdeveloper.mozilla.org%2F&t=https%3A%2F%2Fdeveloper.mozilla.org%2F&h=3062ebc7e7f23f2aa9035f25e9a79085eb696c7e" title="https://developer.mozilla.org/" target="_blank" rel="nofollow noopener">https://developer.mozilla.org/</a><!--/noindex-->

https://developer.mozilla.org/

Существует несколько терминов, связанных с теневым DOM, которые следует знать:

  • Теневой хост (Shadow host): Обычный узел DOM, к которому прикреплен теневой DOM.

  • Теневое дерево (Shadow tree): DOM-дерево внутри теневого DOM.

  • Теневая граница (Shadow boundary): Место, где заканчивается теневой DOM и начинается обычный DOM.

  • Теневой корень (Shadow root): Корневой узел теневого дерева.

Вы можете воздействовать на узлы в теневом DOM точно так же, как и на обычные узлы. Разница в том, что никакой код внутри теневого DOM не может повлиять на что-либо за его пределами, что обеспечивает надёжную инкапсуляцию.

До того, как теневой DOM стал доступен веб-разработчикам, браузеры уже использовали его для инкапсуляции внутренней структуры стандартных элементов. Например, элемент <video> с элементами управления. Всё, что вы видите в DOM, — это тег <video>, но он содержит ряд кнопок и других элементов управления внутри своего теневого DOM.

Создание теневого DOM

Создавать теневой DOM можно двумя способами: императивно с помощью JavaScript или декларативно прямо в HTML.

Императивно с помощью JavaScript

Этот способ отлично подходит для приложений, рендерящихся на стороне клиента. Мы выбираем элемент-хост и вызываем на нём метод attachShadow().

Результат на странице будет выглядеть так:

Я нахожусь в теневом DOM Я не в теневом DOM

Декларативно с помощью HTML

Для приложений, где важен рендеринг на стороне сервера, можно определить теневой DOM декларативно, используя элемент <template> с атрибутом shadowrootmode.

Когда браузер обработает этот код, он автоматически создаст теневой корень для <div> и поместит в него содержимое тега <template>. Сам тег <template> при этом исчезнет из основного DOM-дерева.

Инкапсуляция: защита от JavaScript и CSS

Главное преимущество Shadow DOM — это изоляция. Давайте посмотрим, как она работает.

Инкапсуляция от JavaScript

Добавим кнопку, которая будет пытаться изменить все элементы <span> на странице.

При нажатии на кнопку текст изменится только у <span>, который находится в основном документе. Элемент внутри теневого DOM останется нетронутым, потому что document.querySelectorAll() не может "заглянуть" за теневую границу.

Доступ к теневому DOM: свойство shadowRoot и работа с вложенностью

Когда мы вызываем host.attachShadow({ mode: "open" }), мы создаём теневой DOM в "открытом" режиме. Это означает, что мы можем получить доступ к его содержимому извне через свойство host.shadowRoot.

Если же указать mode: "closed", свойство host.shadowRoot вернёт null, и доступ к теневому дереву извне будет закрыт. Это не строгий механизм безопасности, а скорее соглашение для разработчиков о том, что внутренности компонента трогать не следует.

Работа с вложенными теневыми деревьями

В сложных компонентных архитектурах один пользовательский элемент может содержать внутри себя другие пользовательские элементы, каждый из которых имеет свой собственный Shadow DOM. Чтобы добраться до элемента в глубоко вложенном теневом дереве, придётся последовательно "проходить" через каждый shadowRoot.

Представим себе такую структуру:

  • Компонент <nmbrs-form> (основная форма).

  • Внутри него находится <div>, а в нём — компонент <nmbrs-button> (кастомная кнопка).

  • Внутри <nmbrs-button> находится настоящая HTML-кнопка <button>.

Чтобы получить доступ к этой кнопке из глобального контекста, путь будет выглядеть так:

SВ виде одной цепочки вызовов это выглядит так:

Такая длинная цепочка наглядно демонстрирует мощь инкапсуляции: чтобы добраться до внутренних деталей, нужно явно пройти через каждую "границу". Это делает код более предсказуемым и защищает компоненты от случайных изменений.

Инкапсуляция от CSS

Стили, определённые на основной странице, не влияют на элементы внутри теневого DOM.

Элемент <span> внутри теневого дерева не получит эти стили. Это решает огромную проблему случайных пересечений и конфликтов CSS.

Применение стилей внутри теневого DOM

Стили, определённые внутри теневого дерева, в свою очередь, не влияют на основную страницу. Есть два основных способа их добавления.

1. Конструируемые таблицы стилей (Constructable Stylesheets)

Этот метод позволяет создавать объект CSSStyleSheet в JavaScript и применять его к одному или нескольким теневым деревьям. Это эффективно, если у вас есть общие стили для множества компонентов.

2. Добавление элемента <style>

Простой и декларативный способ — поместить тег <style> прямо внутрь теневого дерева (часто внутри <template>).

Теневой DOM и пользовательские элементы: идеальное сочетание

Вся мощь теневого DOM раскрывается при создании пользовательских элементов (Custom Elements). Без инкапсуляции они были бы невероятно хрупкими.

Пользовательский элемент — это класс, наследующий HTMLElement. Как правило, сам элемент выступает в роли теневого хоста, а вся его внутренняя структура создаётся внутри теневого дерева.

Вот пример простого компонента <filled-circle>:

Теперь мы можем использовать его в HTML как обычный тег, не беспокоясь о его внутреннем устройстве:

Каждый из этих компонентов будет полностью инкапсулирован и защищён от влияния внешней страницы.

Полезно? Подпишись.
Удачи 🚀

Показать полностью 13
17

Шпаргалка по использованию diskpart в Windows

diskpart — это встроенная в Windows утилита командной строки, которая позволяет управлять физическими и виртуальными дисками, разделами и томами. В отличие от графического интерфейса "Управление дисками", diskpart предоставляет больше гибкости и подходит для продвинутых операций, особенно при автоматизации, установке системы, работе в среде восстановления или с виртуальными дисками.

⚠️ Внимание: можно потерять данные

diskpart не спрашивает подтверждение. Одна неверная команда — и данные будут потеряны. Прежде чем выполнять какие-либо действия:

  • Сделайте резервную копию.

  • Убедитесь, что работаете с правильным диском.

  • Прочитайте команду до конца.

🏁 Как запустить diskpart

  1. Нажмите Win + S, введите cmd или powershell.

  2. Кликните правой кнопкой по найденной программе и выберите "Запуск от имени администратора".

  3. В командной строке введите:diskpart

Вы увидите приглашение:

DISKPART>

📋 Базовые команды и сценарии использования

🔍 1. Просмотр доступных дисков

list disk

Выводит список всех подключённых физических дисков.

Пример:

Диск 0 476 ГБ
Диск 1 32 ГБ

📌 2. Выбор нужного диска

select disk 1
Все последующие команды будут относиться к выбранному диску.

💣 3. Очистка содержимого диска

clean

Удаляет таблицы разделов. Быстро, но восстановление теоретически возможно.

clean all

Полная очистка с записью нулей во все сектора. Без возможности восстановления.

🧱 4. Создание нового раздела

create partition primary size=10240

Создаёт основной раздел на 10 ГБ.

Для GPT-дисков также можно создать:

create partition efi size=100
create partition msr size=128

🧼 5. Форматирование раздела

После создания раздела выберите его:

select partition 1

И выполните форматирование:

format fs=ntfs quick label="DATA"

Аргументы:

  • fs=: файловая система (ntfs, fat32, exfat)

  • quick: быстрое форматирование

  • label=: имя (метка) тома

🔤 6. Присвоение или удаление буквы диска

assign letter=E

Присваивает букву E: выбранному тому.

remove letter=E

Удаляет букву — том останется, но без точки монтирования.

🟢 7. Установка активного раздела (MBR-диски)

active

Нужно для загрузки Windows с раздела на BIOS/MBR-дисках.

❌ 8. Удаление раздела

delete partition

Удаляет выбранный раздел.

Если это системный/защищённый раздел:

delete partition override

🔁 9. Преобразование таблицы разделов (MBR ↔ GPT)

Работает только на пустом (clean) диске.

convert gpt
convert mbr

📦 10. Работа с виртуальными дисками (VHD/VHDX)

create vdisk file="C:\vhd\test.vhd" maximum=10240 type=expandable
select vdisk file="C:\vhd\test.vhd"
attach vdisk
create partition primary
format fs=ntfs quick
assign letter=V
detach vdisk

Это удобно для тестирования, резервного копирования или шифрования.

🧪 Пример полного сценария: подготовка нового диска

list disk
select disk 1
clean
convert gpt
create partition primary
format fs=ntfs quick label="Storage"
assign letter=E

🧠 Советы

  • 💾 Сначала всегда используйте list disk, чтобы точно знать, с каким диском вы работаете.

  • 🔒 Никогда не запускайте clean без полной уверенности.

  • 📁 Используйте assign и remove для временного монтирования/отключения разделов.

  • 🛠️ Для ручной настройки загрузочной флешки — create partition primary, active, format, assign.

Показать полностью
10

Как обойти ошибку SSLCertVerificationError при использовании requests в Python и работать с сертификатами

Ошибка SSLCertVerificationError часто возникает при попытке установить соединение с HTTPS-сервером. Это происходит, когда Python не может проверить подлинность SSL-сертификата сайта. Причины могут быть разными: отсутствующие корневые сертификаты, проблемы с сертификатом на сервере или неправильная настройка клиента.

В этой статье я рассмотрю способы обхода этой ошибки, и покажу, что такое SSL-сертификаты и как работать с ними, используя различные инструменты.

🔍 Что такое SSL-сертификат и зачем он нужен?

SSL (Secure Sockets Layer) — это протокол безопасности, который обеспечивает защищённую передачу данных между клиентом и сервером. Он используется для шифрования данных и подтверждения подлинности сервера.

💡 Пример: Алиса и Борис

Представьте, что Алиса хочет отправить Борису важное сообщение, но боится, что кто-то может перехватить его. Для того чтобы удостовериться, что сообщение дошло именно до Бориса, она решает использовать шифрование с сертификатами.

  • Алиса: она знает, что только Борис может расшифровать сообщение, потому что у него есть приватный ключ.

  • Борис: он подтверждает свою личность с помощью сертификата, который содержит его публичный ключ. Этот сертификат выдан надёжным центром сертификации, который гарантирует, что Борис действительно является тем, за кого себя выдает.

SSL-сертификат — это как удостоверение личности для веб-сайта, которое помогает избежать MITM-атак (атака «человек посередине») и обеспечивает безопасность передачи данных.

🛠 Способы решения ошибки SSLCertVerificationError

✅ Способ 1: Отключение проверки SSL (не рекомендуется для продакшн-среды)

Наиболее быстрый способ обойти ошибку — это отключить проверку сертификата. Это удобно, когда вы работаете с локальными серверами или сайтами, которым доверяете. Однако важно помнить, что это небезопасное решение.

⚠️ Важно: Использовать verify=False стоит только для доверенных источников и в локальной разработке. В продакшн-средах лучше избегать этого метода.

✅ Способ 2: Установка корневых сертификатов (перманентное решение для Windows)

Если вы используете Windows и у вас отсутствуют корневые сертификаты, вы можете установить их вручную. Это решение обеспечит, чтобы библиотека requests могла корректно проверять сертификаты на всех веб-сайтах.

Инструкция для Windows:

  1. Перейдите в папку установки Python. Например:C:\Users\<твой_пользователь>\AppData\Local\Programs\Python\Python312\

  2. Запустите файл Install Certificates.command (или install_certificates.bat, в зависимости от версии Python).

Это действие установит необходимые корневые сертификаты для вашего Python.

✅ Способ 3: Использование библиотеки certifi

Для того чтобы гарантировать корректную проверку SSL-сертификатов, можно использовать библиотеку certifi, которая поставляется с актуальными корневыми сертификатами.

Этот способ более безопасен, чем отключение проверки SSL, и является хорошей альтернативой для тех, кто не хочет вручную устанавливать сертификаты.

🛠 Как создать SSL-сертификат на Windows?

Для тестирования и локальной разработки можно использовать самоподписанные сертификаты. Мы рассмотрим два способа их создания: через PowerShell и через командную строку (CMD).

🧰 Способ 1: Создание самоподписанного сертификата через PowerShell

PowerShell позволяет быстро создать самоподписанный SSL-сертификат. Вот пример команды:

Экспорт сертификата и ключа:

Вы можете использовать эти сертификаты для тестирования локальных серверов.

🧰 Способ 2: Создание сертификата через командную строку (CMD) с помощью openssl

Если у вас установлен OpenSSL, вы можете использовать его для создания сертификатов через командную строку.

  1. Создание самоподписанного сертификата:

openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout localhost.key -out localhost.crt -subj "/CN=localhost"

  1. Экспорт сертификата в формат PFX:

openssl pkcs12 -export -out localhost.pfx -inkey localhost.key -in localhost.crt -passout pass:P@ssw0rd123

  1. Если у вас нет OpenSSL, можно использовать makecert.exe:

makecert -r -pe -n "CN=localhost" -b 01/01/2023 -e 01/01/2030 -sky exchange -sv localhost.pvk localhost.cer
pvk2pfx -pvk localhost.pvk -spc localhost.cer -pfx localhost.pfx

Статья на github 👉 https://github.com/hypo69/1001-python-ru/blob/master/articles/ssl_sertifiactes_in_python/ssl_sertifiactes_in_python.md

Удачной разработки, лёгкого кодинга и никаких SSLError! 💻✨🐍

Показать полностью 4
8

Создание интеллектуальных агентов с TinyTroupe: Быстрый старт

Что такое TinyTroupe?

TinyTroupe — это экспериментальная Python-библиотека от Microsoft, предназначенная для моделирования людей с определёнными личностными характеристиками, интересами и целями. Эти искусственные агенты, называемые «TinyPerson», могут взаимодействовать между собой и с окружающей средой, имитируя реалистичное поведение.

Что такое TinyPerson?

В основе TinyTroupe лежит класс TinyPerson. TinyPerson - это основной строительный блок для создания сложных, управляемых LLM агентов.
Экспериментируйте с различными промптами, конфигурациями памяти и ментальными способностями, чтобы раскрыть весь потенциал моделирования человеческого поведения.

Представьте его как чертеж для смоделированной личности. Каждая TinyPerson обладает:

  • Имя: Уникальный идентификатор.

  • Когнитивные состояния: Внутренние переменные, представляющие внимание, эмоции, цели и другие ментальные аспекты, влияющие на поведение.

  • Память: Разделенная на episodic_memory (конкретные события) и semantic_memory (общие знания), отражая структуру человеческой памяти.

  • Поведенческие абстракции: Методы listen() и act() имеют решающее значение для взаимодействия, моделируя циклы стимул-реакция.

Установка

  • В папке ваших проектов выполните команды

git clone https://github.com/microsoft/TinyTroupe.git
cd TinyTroupe
python -m venv venv
venv\Scripts\activate
pip install git+https://github.com/microsoft/TinyTroupe.git@main

код 👉 MyTinyTroupe/tiny_troupe.md at master · hypo69/MyTinyTroupe · GitHub

  • Переименуйте файл .env.example в .env и добавьте в него свой ключ OpenAI API.

Примеры использования

1. Создание TinyPerson

Внутри директории examples создайте файл my_person.py и добавьте следующий код:

код 👉 https://github.com/hypo69/MyTinyTroupe/blob/master/examples/tiny_person.py

Этот пример создаёт агента, задаёт его характеристики, инициирует взаимодействие и показывает историю взаимодействия.

2. Методы взаимодействия

  • act(): Определяет поведение агента, запрашивая у LLM действие на основе памяти и когнитивного состояния.

  • listen(): Моделирует получение сообщения от другого агента или среды, сохраняя информацию в памяти.

  • _observe(): Записывает стимулы (события, ощущения) во внутреннюю память агента.

3. Управление памятью

TinyPerson использует episodic_memory и semantic_memory:

  • episodic_memory: Хранит конкретные события, организует их по времени и ограничивает количество используемых записей.

  • semantic_memory: Хранит общие знания, индексируя текстовые документы с помощью llama_index.

4. Внутреннее состояние и конфигурация

  • _update_cognitive_state(): Изменяет цели, внимание, эмоции и другие внутренние переменные.

  • define(): Устанавливает или обновляет параметры конфигурации агента.

  • reset_prompt(): Пересоздаёт системный промпт для LLM на основе текущей конфигурации и памяти агента.

Управление акторами и средой

5. Создание и управление мирами

В TinyTroupe среда моделируется с помощью TinyWorld, а социальные связи — через TinySocialNetwork.

Метод make_everyone_accessible() позволяет всем агентам взаимодействовать друг с другом.

6. Управление акторами в комнате

Если акторы уже определены, но вам нужно их обновить или заменить, можно использовать:

7. Запуск симуляции

Для моделирования взаимодействий используется run():

8. Управление взаимодействиями

Если вам нужно контролировать диалоги между агентами:

Этот код инициирует разговор и генерирует ответ агента.

9. Создание социальных сетей

TinySocialNetwork позволяет моделировать социальные связи и группы:

Пример простого чата с общением на русском языке:

функция установки языка акторов


Часть словарей характеристики актора:

Словари большие. Целиком здесь 👇
MyTinyTroupe/examples/agents/Lila.agent.json at master · hypo69/MyTinyTroupe · GitHub
MyTinyTroupe/examples/agents/Oscar.agent.json at master · hypo69/MyTinyTroupe · GitHub

код чата:

Этот код создает двух агентов (lila и oscar), загружает их спецификации, переводит их язык общения на русский, помещает их в общий мир (world), делает всех участников доступными друг для друга и запускает взаимодействие между ними.

Разбор кода по шагам:

  1. Загрузка агентов из спецификаций:

  • Создаются два агента: lila и oscar.

  • Они загружаются из спецификаций lila_spec и oscar_spec, которые, содержат их характеристики (возраст, профессия, интересы и т. д.).

  1. Настройка языка общения:

  • configure_language устанавливает русский язык для агентов.

  • Это также пересоздает их системный промпт, чтобы они отвечали на русском.

  1. Создание мира и размещение агентов:

  • Создается виртуальный мир TinyWorld с названием "Chat Room".

  • В этот мир добавляются lila и oscar, что позволяет им взаимодействовать.

  1. Делаем всех доступными друг для друга:

  • Убеждаемся, что агенты могут "видеть" и "слышать" друг друга.

  • Без этого метода агент мог бы не знать, что другой агент существует в том же мире.

  1. Инициирование общения:

  • lila получает фразу "Начинает разговор с Оскаром, чтобы узнать о нем больше".

  • Это стимулирует ее к действию (например, задать вопросы Оскару).

  1. Запуск симуляции взаимодействий:

  • world.run(4) запускает симуляцию на 4 цикла, в течение которых агенты будут:

    • Воспринимать информацию (listen()).

    • Действовать (act()).

    • Обновлять память (что они узнали, какие эмоции испытали).

Ожидаемое поведение

  • lila попытается поговорить с oscar, задавая вопросы на русском.

  • oscar ответит, используя информацию из своей памяти и спецификации.

  • world.run(4) заставит их несколько раз обменяться репликами.

  • После выполнения кода в памяти агентов появятся новые знания о собеседнике.

💡 Совет: Если агенты не разговаривают, попробуйте добавить world.step() после lila.listen(), чтобы проверить их реакцию перед запуском полного цикла run(4).

Пример в Google Colab
код на гитхабе

Тебя может заинтересовать также LangChain и Browser-Use: Создание ИИ-агентов для работы с веб-браузером. Быстрый старт

Удачи!

Показать полностью 16
11

Python. Шпаргалки: Библиотека schedule

Библиотека schedule в Python предназначена для простого и удобного планирования регулярного выполнения задач,
которая позволяет установить, как часто должна выполняться определенная функция (например, каждый час, день, неделю)

Установка

pip install schedule

Использование

Чтобы запланировать задачу, необходимо определить функцию и использовать schedule.every(), чтобы назначить интервал выполнения.

Пример: запуск задачи каждые 10 секунд

Этот скрипт выполняет job() каждые 10 секунд. Цикл while постоянно проверяет наличие запланированных задач и выполняет их в нужное время.

Запуск задач в определенное время

Вы можете запланировать выполнение задач в заданное время, используя .at() и другие параметры интервала:

Управление несколькими задачами

Вы можете запланировать несколько задач, определив отдельные функции и назначив им разные интервалы.

Удаление запланированных задач

Чтобы удалить задачу, используйте schedule.clear(). Вы можете удалить все задачи или указать конкретную, используя теги.

Запуск планировщика в фоновом режиме

Для приложений с графическим интерфейсом или постоянным фоновым выполнением можно запустить планировщик в отдельном потоке.

Пример:
cheatsheets/module_schedule/periodic_tasks_using_schedule.py

Связанная статья:

Планировщик задач Windows

Удачи!

Показать полностью 5
Отличная работа, все прочитано!