Python Заметки
2.31K subscribers
58 photos
2 videos
2 files
212 links
Интересные заметки и обучающие материалы по Python

Контакт: @paulwinex

⚠️ Рекламу на канале не делаю!⚠️

Хештеги для поиска:
#tricks
#libs
#pep
#basic
#regex
#qt
#django
#2to3
#source
#offtop
Download Telegram
Ещё пара триков с форматированием!

▫️Порядки больших чисел можно разделять запятой (и только запятой)

>>> '{:,}'.format(1_231_312)
'1,231,312'

▫️Если оставить пробел в форматировании float после ":" то он добавится в строку

>>> '{: .2f}'.format(15)
' 15.00'

Но если подать отрицательное число, то знак минуса займёт этот пробел

>>> '{: .2f}'.format(-15)
'-15.00'

Удобно для формирования строк одинаковой длины независимо от знака числа.

#tricks
👍8
Синтаксис f-string позволяет использовать в строке символ обратного слеша "\" но не позволяет использовать его внутри фигурных скобок.

>>> lines = ['line1','line2']
>>> print(f'ITEMS: \n {"\n".join(lines)}')
SyntaxError: f-string expression part cannot include a backslash

Решения:

▫️ вынести этот символ за скобки

n = '\n'
print(f'ITEMS: \n{n.join(lines)}')

▫️ заменить его на другое представление, например создавать нужный символ с помощью функции chr()

print(f'ITEMS: \n{chr(10).join(lines)}')

Чтобы узнать код символа следует использовать функцию ord()

>>> ord('\n')
10

А с юникодом не выйдет, там тоже слеш

>>> print(f'ITEMS: \n{"\u000a".join(lines)}')
SyntaxError: f-string expression part cannot include a backslash

#tricks
👍11😱1
Метод строки split() разделяет строку на несколько строк по указанному символу

>>> "a_b_c".split('_')
['a', 'b', 'c']

Можно указать максимальное количество разделений

>>> "a_b_c".split('_', 1)
['a', 'b_c']

Или резать с другой стороны с помощью rsplit() (right split)

>>> "a_b_c".rsplit('_', 1)
['a_b', 'c']

А что будет если оставить аргументы пустыми?

>>> "a_b_c".split()
['a_b_c']

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

>>> "a b c".split()
['a', 'b', 'c']

То есть это равнозначно такому вызову?

>>> "a b c".split(" ")
['a', 'b', 'c']

Кажется да, но нет! Давайте попробуем добавить пробелов между буквами

>>> "a   b   c".split(" ")
['a', '', '', 'b', '', '', 'c']

И вот картина уже не так предсказуема 😕
А вот что будет по умолчанию

>>> "a   b   c".split()
['a', 'b', 'c']

Всё снова красиво! 🤩

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

>>> "a\t  b\n c  ".split()
['a', 'b', 'c']

Аналогичный способ можно собрать с помощью регулярного выражения. Но пробелы по краям строки придется обрабатывать дополнительно.

>>> import re
>>> re.split(r"\s+", ' a b c '.strip())
['a', 'b', 'c']

Здесь тоже можно указать количество разделений

>>> re.split(r"\s+", 'a b c', 1)
['a', 'b c']

А что если мы хотим написать красиво, то есть split() без аргументов, но при этом указать количество разделений? В этом случае первым аргументом передаём None

>>> "a\n  b c".split(None, 1)
['a', 'b c']

Данный метод не учитывает строки с пробелами, взятые в кавычки

'a "b c" '.split()
['a', '"b', 'c"']

Но для таких случаев есть другие способы.

#tricks #basic
👍25😱1😢1
Сегодня будет самый "двоичный" ("двойковый"? "двушный"? "двойственный"?) момент на вашем веку 🤩
Больше двоек в дататайме вы не застанете!

Успейте поймать момент! Будете показывать эпичный скриншот своим внукам)))

🥸 Для продуманных (ленивых): код на скрине, который сработает только сегодня и только 1 раз!
Открывайте окошки с часами и вперёд!

#offtop
😁10🔥5
⚠️ События последних дней сильно изменили жизнь многих из нас. Мы уже не будем прежними и мир вокруг не будет прежним.
Лично я всё ещё в некотором тупняке от происходящего...

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

В свою очередь я хочу помочь всем, кто меня знает и читает. Поэтому у меня к вам есть три предложения...

#offtop
3👍3
Из-за всем известных событий очень многие потеряли работу.
Для поиска вакансий вполне можно использовать паблики в telegram. Вот несколько которые мне известны:

https://t.iss.one/django_jobs
https://t.iss.one/javascript_jobs
https://t.iss.one/workzavr
https://t.iss.one/workoo
https://t.iss.one/Workesss
@g_jobbot

➡️ Чем шире о себе заявите, тем больше шансов найти нужный контакт. Поэтому предлагаю айтишникам и художникам бесплатно разместить на моём канале @pythonotes информацию о вас.

Формат сообщения можно сделать примерно следующий:

_______________________________
Имя Фамилия
Специализация

О себе
- Долго думаю, быстро делаю.

Кем хочу работать
- Разработчик мобильных приложений

Локация
- Удалённо, возможен переезд в ГородНейм

Знаю языки программирования
- JSON
- CSS
- HTML

Хорошо владею софтом
- Maya. Ротоскопинг, трекинг
- Nuke. Персонажная анимация
- 3DsMax. Композитинг и кленап

Где работал
- Microsoft, админ лифта
- Yandex, доставка пончиков
- Disney, протирка шариков от мышей

Контакты
- Телеграм: @username
- Почта: [email protected]
- Полное резюме (ссылка на GoogleDoc/LinkedIn/PDF)
_______________________________

Картинки не надо, смайлы без фанатизма.

Текст присылайте в этот временный канал, где будем обсуждать все вопросы:
▶️ @pn_work

🌼 Если найдутся желающие, вакансии тоже могу запостить
📅 Предложение актуально как минимум до лета 2022г.


Если будет хоть один пост, уже не зря старался)

📌 @pythonotes

#offtop
👍3
Помогая окружающим, лучше всего делать то, что умеешь делать лучше всего! Поэтому я решил сделать все свои курсы бесплатными и выложить в открытый доступ❗️

Был период в моей жизни, когда эти курсы помогли мне выжить. Теперь, я надеюсь, они помогут кому-то еще.

Спасибо всем, кто покупал мои курсы, даже если потом не смотрел 😁

Навыки программирования нынче оцениваются достаточно высоко, это шанс найти работу с зарплатой повыше, попросить повышения или просто улучшить свою продуктивность с помощью кодинга! Так что пользуйтесь 😉

Сразу скажу, курсы не свежие, записанны в 2014-2015 гг. Некоторая информация устарела но примерно на ±90% всё еще актуально.

Какие курсы доступны:

▫️ Advanced Python Scripting
Это компиляция из 3х курсов начального, среднего и высокого уровня сложности. С нуля до создания собственных десктоп-приложений.

▫️ Python for Maya
Курс для Python-разработчиков в Maya. Да, Autodesk ушел от нас, но скорее всего, вернётся)

▫️ Python for Nuke
Курс для Python-разработчиков в Nuke.

▫️ Python for Houdini
Курс для Python-разработчиков в Houdini. Самый отстающий в актуальности курс, так как Houdini развивается и меняется очень стремительно и кардинально. Тем не менее, 80-90% курса актуальна.

▫️ Houdini Fundamentals
Курс поможет познакомиться с крутым софтом для 3D графики — SideFX Houdini. Записан на версии 16. Рассчитан на нулевой уровень подготовки.
На этот раз курс не про Python, только про сам софт.

Все Python-курсы записаны с Python2, вам потребуется изучить особенности перехода на версию Python3, о чем я не раз говорил на своём канале. Ищите по хэштегу #2to3

💬 Остальные подробности в комментах

Переходите на сайт школы и выбирайте курс:
➡️ https://cgninjas.ru/ ⬅️

📌 @pythonotes

#offtop
37👍19🥰1😁1
Раньше на курсах была проверка домашних заданий и
фитбек. Теперь, по понятным причинам, я не смогу это поддерживать в том же объёме.

Чтобы вам не учится в сферическом вакууме, я сделал для вас площадку для общения. А точней две!
Там вы сможете помогать друг другу, ведь старые студенты тоже подтянутся, за что я буду им очень благодарен.

Я тоже буду отвечать на ваши вопросы по возможности.

Основная площадка:
➡️ Discord Сервер

Запасной вариант:
➡️ Telegram Чат

👍 Вход свободный, все чаты открыты.
🤬 Никакой политики и токсичности! Только по делу!
💣 Нарушителей банить буду резко и с размаху!

📌 @pythonotes

#offtop
👍11🔥4
Celery это крутой инструмент для очереди задач web-вашего приложения на Python.
Но его монополию всё больше притесняет другая библиотека - dramatiq.

По словам автора, эта библиотека лишена всех проблем Celery

If you’ve ever had to use Celery in anger, Dramatiq could be the tool for you.

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

Что реализовано в этом приложении:

▫️Засетаплен dramatiq совместо с Flask с помощью flask-dramatiq
▫️Отправка простых фоновых задач
▫️Отправка периодических cron-задач по расписанию с помощью periodiq
▫️Отмена запущенных задач с помощью dramatiq_abort
▫️Задача с отложенной проверкой результата
▫️Всё закатано в Docker, поэтому заводится с полпинка

В качестве брокера используется Redis. Он стартует быстрей чем RabbitMQ и dramatiq_abort пока что поддерживает только его. Шаблонов нет, фронт максимально глуп и минималистичен.

🌎 Код смотрим здесь https://github.com/paulwinex/flamatiq

Также стоит посмотреть:

dramatiq_dashboard
django_dramatiq

#libs
👍14👎1👏1
Блокировки, они повсюду...
Ох как надоела эта тенденция. Наша IT индустрия буквально стреляет себе в ногу силами определённых личностей и их мнений о том как для нас будет лучше.
Как бы там ни было, сейчас все советуют экстренно качать и переносить свои видосы с YouTube на отечественные аналоги.

Да, можно использовать оконные софты со всеми удобствами (VLC или Youtube Video Downloader), но мы лучше покодим😉

Я набросал небольшой скрипт для скачивания плейлиста с YouTobe в один клик.
Из зависимостей только модуль pytube.

▫️ Для скачивания выбирается максимально доступный размер видео файла.
▫️ Если файл уже существует то скачивания не будет. Удобно для апдейта обновлений.
▫️ Скрипт качает всё из плейлиста с помощью класса pytube.Playlist. Если хотите скачать канал, то просто замените класс на pytube.Channel

from pytube import Channel
PLAYLIST_URL = 'https://www.youtube.com/channel/XXXXXXXXX'
playlist = Channel(PLAYLIST_URL)

Забираем здесь ➡️

#source
👍21
Репозитори на почитать для расширения кругозора.

▫️ Большой ликбез по экосистеме Python
https://github.com/brunocampos01/understanding-the-python-ecosystem

▫️Подборка самых популярных полезностей для веб разработчиков
https://github.com/ml-tooling/best-of-web-python

▫️Подборка библиотек для тех кто уважает типизацию в Python
https://github.com/typeddjango/awesome-python-typing

#basic #libs
👍96
Приветствую подписчиков.
Я даже несколько удивлён как это вы еще не разбежались 😻))

Многие мне пишут в личку с вопросом "Где брать курсы если сайт закрылся?".
Отвечаю — сайт не закрылся❗️
Ввиду некоторой обстановки 💣⚔️🚓 💥 мой хостинг (Украинский кстати) немножко "закончился".
Мой хороший знакомый, админ данного хостинга, включил мой сервер на пару часов и я скачал все данные. После чего создал новый сервер в Европе и поднял там сайт.
На данный момент я закончил настройку и теперь сайт снова доступен.
А так же добавил домен COM, для тех у кого RU блокируют.
Теперь сайт доступен по адресам:

https://cgninjas.ru/
https://cgninjas.com/

(возможно на com почта не будет работать)

Также просят выложить всё на Youtube или на Torrent. Да я не против, только исходники у меня пропали вместе с HDD, так что надо потратить немало времени чтобы скачать, систематизировать и залить. Если вдруг выкрою недельку на это, то обязательно сделаю)))

▫️Погодите, а что с каналом? он тоже всё?

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

Обязательно продолжу серию заметок... надеюсь скоро. А до тех пор я не хочу вас раздражать глупой рекламой глупых каналов (которые запрудили телеграм и предложения которой приходят регулярно) а лучше просто помолчу.

"Благодарим за понимание ©"

ЗЫ. Не пишите пжлст в личку, есть чат для этого
➡️ CGNinjasChat

#offtop
👍4729
Я нашел самый быстрый способ поднять свой независимый и бесплатный VPN
Сразу оговорка, платить придётся только за хостинг.

1️⃣ Покупаем сервер где-то на просторах интернета. Конечно же сервер должен находиться за пределами страны. Например я закупился на https://eurohoster.org/ (не реклама). Проверяйте лимиты по трафику, в идеале - без ограничений.

2️⃣ Ставим docker

sudo apt install docker.io

Если удобней с DockerCompose то ставим и его

sudo apt install docker-compose

3️⃣ Ставим WG-EASY

Самый простой способ поднять сервис WireGuard c WebUI это проект wg-easy
Код и документация здесь
https://github.com/weejewel/wg-easy

Запускаем контейнер:
https://github.com/weejewel/wg-easy#2-run-wireguard-easy

Для тех кто с DockerCompose, забираем файл здесь:
https://gist.github.com/paulwinex/be87f79687b96786098ec8fa6a8e251c

В обоих случаях потребуется поменять две переменные:

WG_HOST - внешний статичный IP вашего сервера
PASSWORD - придумайте пароль для WEB UI

Остальные параметры указаны ниже на странице github https://github.com/weejewel/wg-easy#options

4️⃣ Ставим клиента

Все доступные клиенты здесь
https://www.wireguard.com/install/

Есть возможность добавить клиента в Network Manager для управления подключением через UI. Установка зависит от вашей системы, ищите мануалы в сети, их много.
https://github.com/max-moser/network-manager-wireguard

Скрипт установки для RasperryPi
https://gist.github.com/paulwinex/c2c4090f19dbe8bd1253c5744f3f06e1

ЗЫ. Конечно же это не "самый простой" и далеко не единственный способ. А просто тот, который использую я сам.

#offtop #linux
👍18🔥2
Всех 3D художников поздравляю
c проф праздником 3Dекабря

💥🫖⭐️🎨🎁🪄🎉🎥

#offtop
👍26🎉7👎1😢1
С Новым Годом!
🎁🎉😱
🎉35👍42
Как не передавать аргумент в функцию если она его не ждёт?

Как-то раз я делал модуль с функциями, которые вызывались как фоновые задачи. В основном они принимали чёткий список позиционных аргументов. И вот, в разгар разработки, пришла новая фича - в каждую такую функцию теперь передаётся Lock-объект. Он позволяет сделать выполнение этой функции синхронным на разных воркерах (как и положено любому локеру).
Но вот проблема, в новых функциях, где нужен локер, я его, конечно же, принимаю как аргумент. Но в старых функциях он не предусмотрен. Часто функции вообще без аргументов.

Какие варианты решения?

▫️ Добавить во всех функциях в аргументы **kwargs. Это решит все проблемы. Строго говоря, это надо было сделать сразу. Теперь таски не будут падать из-за неизвестного аргумента. И теперь следует не забывать добавлять **kwargs в новых функциях. Но что, если нет возможности изменять код? Тогда...

▫️Проверить, может ли функция принять аргумент с определённым именем. И если не может то не передавать. Это можно сделать с помощью стандартной функции inspect.signature

from inspect import signature

def func(x, y, z=True):
pass

sig = signature(func)
print(sig)
# <Signature (x, y, z=True)>
print(sig.parameters)
mappingproxy(OrderedDict([('x', <Parameter "x">), ('y', <Parameter "y">), ('z', <Parameter "z=True">)]))

Теперь можно проверить, ожидает ли функция параметр с определённым именем

print('lock' in sig.parameters)
# False

Финальный псевдокод

from tasks import my_task, LockClass
from inspect import signature

task_kwargs = {}
lock = LockClass()
if 'lock' in signature(my_task).parameters:
task_kwargs['lock'] = lock
my_task(**task_kwargs)

Конечно же, наличие этого имени не гарантирует что функция ожидает именно этот тип. Но это уже нюансы реализации 😼

#tricks
👍17🤔2🔥1
Сделал простой скрипт для управления температурой кулера Raspberry Pi.

- Зачем? Их же полно готовых! Даже дефолтные инструменты есть.

Хотелось сделать этот велосипед по-своему 😁

▫️Пороговых температур две: Одна контролирует момент включения, другая выключения. Например, выше 80 - включаем. Остыл до 50 - выключаем.

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

Исходники и схема.

https://github.com/paulwinex/rpi_fan_control

ЗЫ. В схеме присуствует сопротивление. Это требуется только если нужно уменьшить скорость вращения кулера. Мой на полных оборотах сильно гудит, пришлось поставить.

#sources #rpi
👍103