TGINSIGHT CHAT
Python Заметки
@pythonotes
EducationИнтересные заметки и обучающие материалы по Python Контакт: @paulwinex ⚠️ Рекламу на канале не делаю!⚠️ Хештеги для поиска: #tricks #libs #pep #basic #regex #qt #django #2to3 #source #offtop
Неодамнешни објави
Страница 20 од 32 · 384 објави
Објавено 23 окт.
Python Заметки pinned «Продолжаем знакомиться. В какой сфере вы работаете или хотите работать?»
Објавено 23 окт.
Објавено 21 окт.
А знаете ли вы, что в Bash есть особая переменная "$_" ? Из описания можно узнать, что в переменную "$_" помещается последний аргумент последней команды. Что-то знакомое? Конечно, в Python есть примерно тоже самое. Мы знаем, что дата первого релиза Bash (8 июня 1989) несколько раньше чем первый релиз Python (20 февраля 1991). Если учесть, что по задумке автора Python это агрегация самых успешных практик отовсюду, можно ли сказать что именно эта фишка к нему пришла из Bash? Ни подтверждения ни опровержения я пока не нашел. Давайте просто считать это совпадением 😉 А как это может быть полезно в Bash? Приведу простой пример, который оценят те, кто часто работает в терминале. Допустим, нам надо создать директорию и зайти в неё. Что обычно делаем? :~$ mkdir foldername :~$ cd foldername :~/foldername$ Как это сделать в одну команду? :~$ mkdir foldername && cd foldername :~/foldername$ Уже лучше, но хочется короче, без повторов. Вот тут и пригодится наша переменная. Напомню, что в неё сохраняется последний аргумент предыдущей команды. :~$ mkdir foldername && cd $_ :~/foldername$ _________________ PS. Символы "&&"" разделяют команды и означают, что требуется выполнить вторую команду только если первая завершилась успешно. #linux#tricks
Објавено 19 окт.
Давайте немного прокачаем стандартный словарь. Зачем? А потому что Python это позволяет))) Добавим возможность работать с ключами словаря как с атрибутами объекта. Для этого нам потребуется определить три метода: __getattr__ - получение атрибута __setattr__ - изменение атрибута __delattr__ - удаление атрибута Наследоваться будем от стандартного словаря class _AttribDict(dict): def __getattr__(self, name): return self[name] def __setattr__(self, name, value): self[name] = value def __delattr__(self, name): del self[name] Подменяем стандартный словарь в одну строку __import__('builtins').__dict__['dict'] = _AttribDict Всё, можно тестить 😬 >>> obj = dict(name='Object1', id=14) >>> print(obj) {'name': 'Object1', 'id': 14} Выглядит как обычный словарь >>> obj['name'] = 'Thing 1' >>> print(obj['name']) Thing 1 Изменение ключей работает. То есть стандартное поведение не сломали. А теперь попробуем обратиться к атрибутам >>> print(obj.name) Thing 1 Пробуем изменить ключ через атрибут >>> obj.name = 'Thing 2' >>> print(obj.name) Thing 2 И удаляем ключ через атрибут del obj.name print(obj) {'id': 14} Теперь с ключами словаря можно работать и обычным способом: dict['key'] и как с атрибутами: dict.key Выглядит интересно. Но помните , если Python позволяет это делать, этоне значит что это можно делать👮♂️! Подобные эксперименты лучше оставить для развлечения и не допускать в прод. Хорошая разминка, не более того. #tricks
Hashtags
Објавено 16 окт.
Python Заметки pinned «А давайте познакомимся с аудиторией канала поближе! Для начала определим уровень владения Python и программированием в целом. Это поможет мне лучше выбирать контент! Напиши, какой твой уровень в Python?»
Објавено 16 окт.
Објавено 14 окт.
🙄Разминка для ума! Треугольник Серпинского, интересная фигура которую построить достаточно просто. Алгоритм такой: 1. создаём любые 3 точки на плоскости 2. из этих точек случайно выбираем любую, как начальную 3. случайно выбираем любую точку из этих же трёх точек как цель 4. перемещаемся в сторону цели на половину расстояния 5. повторяем бесконечно с пункта 3 Если сделать достаточно много итераций то вырисовывается интересная фигура. Треугольник, в который вписаны более мелкие треугольники. Это самый настоящий фрактал! Я собрал пример построения такой фигуры на базе Qt. 🌎 Код можно посмотреть здесь. С помощью paintEvent я рисую точки по озвученному алгоритму. Каждые 10 секунд либо по клику на виджете строится следующий треугольник. Особенности примера: 🔸 Атрибут Qt.WA_OpaquePaintEvent позволяет сохранить то, что было нарисовано в прошлой итерации. Таким образом мы видим постепенное наполнение точек а не мелькающую одну точку. 🔸QTimer позволяет создавать отложенные вызовы один раз или с повторением через интервал. 🔸QColor.fromHsv() позволяет создать рандомный но предсказуемый цвет с помощью HSV схемы. Не слишком светлый и не слишком тёмный но всегда с разный. Рандомизации подвергается только смещение по цветовому кругу (Hue), яркость (Value) и насыщенность (Saturation) можно контролировать отдельно в своих пределах или оставить статичными. Обычный рандом цвета по RGB не даёт такой предсказуемый результат. 🔸 Каждый новый цикл с новым треугольником предварительно затемняет предыдущие через этот вызов painter.fillRect(rec, QColor(0, 0, 0, 100)) То есть полупрозрачный цвет. Таким образом, чем старше треугольник, тем он темней. Если сделать виджет фулскрин, то у нас получится некий ScreenSaver))) 🔸 Да, я знаю, что рисование в Qt не самый лучший способ сделать этот пример) Скорее всего самый НЕподходящий. Попробуйте сделать тоже самое но другими средствами. #qt#source#tricks
Објавено 14 окт.
Објавено 12 окт.
В Python можно делать рекурсивные связи. Например, список вложенный сам в себя: >>> x = [] >>> x.append(x) >>> print(x) [[...]] Словари вложенные друг в друга: >>> a = {} >>> b = {} >>> a['b'] = b >>> b['a'] = a >>> print(a) {'b': {'a': {...}}} Зачем это нужно? Лично я пока не сталкивался с подобными задачами, но, скорее всего, они есть) #tricks
Hashtags
Објавено 9 окт.
🖨Зачем подменять стандартную функцию print()? В Python3 директива print() стала функцией, то есть объектом, с которым мы можем делать что угодно. Во 2-м Python мы такого лишены. Как можно изменить стандартное поведение этой функции? Обычно подменяют объект sys.stdout, что работает и во 2-м. Но будем действовать через builtins. При этом изменим только функцию print(), а stdout останется прежним. Что нам потребуется сделать? 1. Создать функцию, которая заменит print и не сломает стандартное поведение 2. Подменить объект builtins.print import builtins _print = builtins.print builtins.print = lambda *a, **kw: _print(*a, **kw) В примере выше я заменил print но не добавил никакого функционала. Сейчас print() работает как и прежде, только через посредника. Давайте думать варианты. 🔸Изменить аргументы по умолчанию. Порой во время разработки приложения требуется именно распечатывать информацию в консоль через print(). Если это сервер, то всякий раз приходится дописывать flush=True чтобы очищался буфер вывода и мы видели в консоли текст сразу же. Давайте сделаем так чтобы этот аргумент по умолчанию был True. Тогда лямбда будет выглядеть так: lambda *a, **kw: _print(*a, **{**kw, 'flush': True}) 🔸Поиск принтов в коде. Приходилось пару раз рефакторить код сервера с очень запутанной структурой. На этапе избавления от принтов я не мог найти где распечатывается пустой список?! Ни одного принта по проекту нет а он распечатывается😢 Давайте заставим функцию print() сообщать нам где она находится. import builtins, sys _print = builtins.print def _located_print(*args, **kwargs): _print(*args, **kwargs) f = sys._getframe().f_back _print('=> File:', f.f_code.co_filename, '| line', f.f_lineno) builtins.print = _located_print Выйдет примерно так: >>> print('Hello') Hello => File: /path/to/script.py | line: 1 🔸Как-либо модифицировать все принты. Например добавлять что-то в начале, изменять цвет, заменять символьные смайлы на юникод и тд. Вот пример от меня. В Python 3.8 добавили возможность через f-string распечатывать имя переменной вместе с её значением: >>> value = 123 >>> print(f"{value=}") value=123 Аналогичный функционал я повторил через подмену функции print(). 🌎 Полный код здесь 🔸Отключить принт повсеместно! Да, бывает и такое нужно). Кроме простого отключения (код сами догадайтесь какой) можно заменять всё на одинаковое сообщение, сделав принт бесполезным. Чтобы не использовали принт в проектах! import builtins _print = builtins.print builtins.print = lambda *a, **kw: _print("Don't use prints!") Получится что-то такое >>> print('Debug message') Don't use prints! Но это больше похоже на шутку, реализовать которую помогут стартап скрипты, о которых юзер не догадывается 😝 🔸Заменить все принты на нормальное логирование. Тоже вариант, но не особо полезный. Лучше писать нормальный логгинг чем так "костылять". Ну а для тренировки можно попробовать реализовать и этот вариант. Думаю, сами справитесь) _________________________ Стоить ещё учесть пару моментов: - эту подмену следует делать в самом начале работы приложения, в скрипте с которого начинается запуск. Удобно делать через стартап скрипт. Исходники при этом менять не требуется. - функция изменится повсеместно во всех модулях на время сессии - stdout не изменён, то есть обычный логгер будет писать в консоль нормально. - Мы подменяем функцию на другую, а значит help(print) не покажет нам документацию, __name__ будет неверный и тд. Так что не забывайте использовать functools.wraps - в моих примерах кое-где не обрабатывается kwargs. Не копируйте вслепую, всегда понимайте что делаете или не делайте вовсе. Присылайте в коменты свои варианты! 😎 #tricks
Hashtags
Објавено 7 окт.
А вы ждёте Qt6 как жду его я? ))) Наверняка, те кто ждёт, уже в курсе, но я уточню даты релизов. - Qt 6.0 Feature freeze - 31.8.2020 - Qt 6.0 Alpha - 2.10.2020 - Qt 6.0 Beta 1 - 15.10.2020 - Qt 6.0.0 RC - 17.11.2020 - Qt 6.0.0 Final - 1.12.2020 Полный список https://wiki.qt.io/Qt_6.0_Release Между тем, библиотеки PySide3 ждать не стоит. Дело в том, что разработчики решили синхронизировать версии библиотек C++ и Qt for Python. Так что ждём сразу PySide6! #qt
Hashtags
Објавено 6 окт.
Сегодня состоялся релиз Python 3.9!🎉🥳🚀 Для тех кто пишет много кода очень важна краткость. Именно этот релиз добавляет нам удобную запись объединения словарей. Вместо такой записи: d3 = {**d1, **d2} теперь можно писать так: d3 = d1 | d2 Конечно это не единственная новая фича. Остальные подробности на странице релиза: https://www.python.org/downloads/release/python-390/