TGTGInsighttelegram intelligenceLIVE / telegram public index
Назад кон каналите
Python Заметки avatar

TGINSIGHT CHAT

Python Заметки

@pythonotes

Education

Интересные заметки и обучающие материалы по Python Контакт: @paulwinex ⚠️ Рекламу на канале не делаю!⚠️ Хештеги для поиска: #tricks #libs #pep #basic #regex #qt #django #2to3 #source #offtop

Претплатници2,220Тековни претплатници
Следени објави384Број на индексирани објави
Неодамнешен опфат12,780Збир на неодамнешни прегледи
Неодамнешни објави

Неодамнешни објави

Страница 21 од 32 · 384 објави

Објавено 5 окт.

Python Заметки pinned a photo

views

Објавено 5 окт.

💬Теперь у канала есть группа для обсуждений! Создание такой группы не было в приоритете для канала. Но это обязательное условие для возможности комментировать посты. Ведь комментарий это просто ответ на пост в группе. Добавляю группу в качестве эксперимента и именно для комментариев. Если вдруг всё это превратится в неконтролируемый спам, то лучше удалить такое безобразие. Отсюда правила, которые я прошу соблюдать: 🔸 Пишите только по делу. Флуд наказуем! 🔸 В чат писать только общие вопросы, не относящиеся к какому-либо посту. Остальное в комментарии. 🔸 Соблюдайте все стандартные правила общения и хорошего тона. Давайте сделаем общение приятным 😉 ➡️ Войти в группу PS. Если внизу новых постов нет кнопки комментирования, то вам следует обновить Telegram.

1,150 views

Објавено 2 окт.

Те, кто в Python не первый день, хорошо знают, что на число можно умножить не только число, но и другие типы. Главное, чтобы у этих типов была реализация такой операции. # list >>> [1] * 3 [1, 1, 1] # tuple >>> (2, 3) * 3 (2, 3, 2, 3, 2, 3) # string >>> "A" * 3 "AAA" Так работает полиморфизм стандартных типов. Интересно здесь то, что это сработает и в том случае, когда порядок операндов обратный. То есть int умножить на [тип]. # list >>> 3 * [1] [1, 1, 1] # tuple >>> 3 * (2, 3) (2, 3, 2, 3, 2, 3) # string >>> 3 * "A" "AAA" Если хотите реализовать такое поведение в ваших классах то следует помнить два момента: 1. Если множитель справа, то вам нужно реализовать метод __mul__, наш класс это первый операнд, то есть слева. myType * 3 2. Если множитель слева, то вам нужно реализовать метод __rmul__, наш класс это второй операнд, справа. 3* myType Всё тоже самое можно делать и для других математических операторов. И если в этом примере действие и результат будут фактически одинаковыми, то бывают ситуации, когда это не так. Например, при умножении матриц имеет значение порядок операндов. Для других операторов, таких как деление или сдвиг, очень важно кто с какой стороны находится. >>> 2/4, 4/2 (0.5, 2.0) >>> 2<<3, 3<<2 (16, 12) >>> 100%15, 15%100 (10, 15) #tricks#basic

1,310 views

Објавено 30 сеп.

Вы знаете, что строки в Python можно кодировать и декодировать в разные кодировки. >>> s = 'Привет' >>> s.encode() # в байты b'\xd0\x9f\xd1\x80\xd0\xb8\xd0\xb2\xd0\xb5\xd1\x82' >>> s.encode('ascii') # в ASCII (если получится) UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-5: ordinal not in range(128) >>> s.encode('euc_jp') # японская кодировка b'\xa7\xb1\xa7\xe2\xa7\xda\xa7\xd3\xa7\xd6\xa7\xe4' >>> s.encode('hz') # Simplified Chinese b"~{'1'b'Z'S'V'd~}" И другие... А можно ли добавить свою кодировку в этот список? Можно! И сейчас мы это сделаем. Давайте добавим ZIP-кодировку из Python2, о которой мы говорили в прошлом посте. Для начала нам нужен алгоритм. Я хочу сжимать строку через ZIP и после получения байтов преобразовывать их в строку через base64 (можно и без base64). Получится такой код: import zlib, base64 >>> orig = 'hello python' >>> compressed = zlib.compress(orig.encode(), 5) >>> compresed_b = base64.encodebytes(compressed) >>> print(compresed_b) b'eF7LSM3JyVcoqCzJyM8DAB7wBNc=' Да, строка получилась длинней чем была. Но мы помним, что всё будет иначе если исходная строка большая. Обратный алгоритм декодирования >>> compressed = base64.decodebytes(compresed_b) >>> restored = zlib.decompress(compressed).decode() >>> orig == restored True Отлично!😎 Теперь, чтобы создать кодек на базе этих алгоритмов, следует воспользоваться функций codecs.register(). В неё подаётся имя функции которая должна вернуть объект codecs.CodecInfo. Данный объект будет содержать две функции - кодирование и декодирование. Это и будет наш кодек. Давайте назовём наш кодек просто "z". Тогда его создание будет выглядеть как-то так: import zlib, base64, codecs def z_encode(data): return base64.encodebytes(zlib.compress(data.encode(), 5)), 0 def z_decode(data): return zlib.decompress(base64.decodebytes(data)).decode(), 0 def z_search(encoding_name): return codecs.CodecInfo(z_encode, z_decode, name='z') codecs.register(z_search) Тестим! >>> s = 'Hello New codec!' >>> s_enc = s.encode('z') >>> print(s_enc) b'eF7zSM3JyVfwSy1XSM5PSU1WBAAvxwV+\n' Теперь обратно >>> s_enc.decode('z') 'Hello New codec!' А теперь практика!. Сжимаем JSON со списком файлов >>> from pathlib import Path >>> import json >>> files = list(map(str, list(Path('~/Documents').expanduser().glob('**/*')))) >>> print(len(files)) 5390 >>> text = json.dumps(files) >>> print(len(text)) 513839 >>> enc = text.encode('z') >>> print(len(enc)) 53317 Профит почти в 10 раз! Можно еще уменьшить размер если обойтись без BASE64. Но тогда вы получите чистые байты и как строку их передать уже не получится. PS. А вот стандартный и самый короткой способ для ZIP-сжатия байтов в Python3 >>> import codecs >>> codecs.encode(my_bytes, 'zip')) (спасибо @amarovita за пример кода) #tricks

1,210 views

Hashtags

Објавено 28 сеп.

В Python2 была интересная возможность кодировать строку с помощью ZIP-архивации. Ведь что такое кодирование? Просто преобразование данных из одного вида в другой. Компрессия это тоже просто другая форма данных. Представление данных в виде ZIP просто и легко сокращает размер этих данных. Это бывает полезно или даже критично при передаче данных по медленным каналам. # Python2 >>> my_str = 'Hello ZIP' >>> my_zip_str = my_str.encode('zip') >>> print my_zip_str xЬєH═╔╔WИЄ♀ ☼╨♥️ Да, в результате это нереально прочитать, но мы же понимаем что это просто такая форма данных. Наша строка всё еще где-то там. Пробуем преобразовать обратно. >>> my_zip_str.decode('zip') 'Hello ZIP' Всё на месте! Пытливые умы заметили, что мы нифига не сэкономили 😭 >>> print len(my_str), len(my_zip_str) 9, 17 Увеличили размер почти в 2 раза! Да, это так. Но вся сила ZIP раскрывается на больших данных >>> my_str = 'Hello ZIP ' * 100 >>> my_zip_str = my_str.encode('zip') >>> print len(my_str), len(my_zip_str) 1000 27 Чем больше строка и чем больше в ней повторов, тем лучше она сожмётся. В данном случае в 37 раз меньше данных. Да, круто, но к чемуто это я? Дело в том что в Python3 этот код не сработает. Во-первых, кодек переименован в "zlib_codec", во-вторых подобный код вызовет ошибку и отправит нас в модуль codecs. my_str.encode('zlib_codec') LookupError: 'zlib_codec' is not a text encoding; use codecs.encode() to handle arbitrary codecs Данный функционал можно повторить и в Python3 но кода получится куда больше. И что теперь? Неужели я предлагаю заняться "некрокодингом" на Python2? Нет, не нужно тревожить пенсионера 🚑. Всё будет ясно вследующем посте. #libs

1,090 views

Hashtags

Објавено 27 сеп.

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

1,010 views

Објавено 25 сеп.

Чем отличаются эти термины? Шифрование Кодирование Хеширование 🔸Шифрование Обратимое преобразование информации с целью скрыть её содержимое. Шифруются данные с помощью секретного ключа, без которого расшифровать данные в исходное состояние невозможно. Примеры использования: - Шифрование бинарных файлов и архивов с помощью пароля - Шифрование текста 🔸Кодирование Это преобразование данных из одного вида в другой. При этом содержимое данных остаётся прежним, меняется лишь форма (способ представления данных). Всегда можно вернуть данные в прежний вид с помощью обратного кодирования (декодирование). Примеры использования: - Кодирование текста из ASCII в UTF-8 - Кодирование изображения из BMP в TIF - Кодирование строки в байты 🔸Хеширование Необратимое преобразование данных в строку определённой длины. Содержимое хеш-строки строго зависит от исходных данных и сильно изменяется даже если в данных изменить 1 бит. Хеширование всегда выдаёт одинаковый результат при одинаковых исходных данных. "Дехешировать" строку обратно в данные невозможно. Примеры использования: - Хранение пароля в базе данных в виде хеш-строки не раскрывает пароль и оставляет возможность проверять правильность введённого пользователем пароля. - Хеш-строку файла еще называют контрольной суммой. Позволяет быстро проверить одинаковы ли файлы сравнив лишь хеши этих файлов. Даже если один пиксель в картинке изменится, контрольная сумма будет другой. Очень полезно для проверки необходимости обновления файлов по сети или поиска файлов. 🐍Модули 🔹 Для работы с криптографией в Python используются внешние модули cryptography PyCrypto 🔹Хеширование и другие манипуляции с паролями и токенами crypt hashlib secrets hmac Информация здесь 🔹Всё что связано с кодировками codecs #libs

1,150 views

Hashtags

Објавено 23 сеп.

Стартап-скрипт это удобное место для изменения внешнего вида REPL. Например замена символов строки приглашения или добавление автокомплитов по TAB. Давайте заменим символы строки приглашения. Для этого нужно поменять переменные sys.ps1 и sys.ps2. Символами может быть даже эмодзи. Напишите это в стартап-скрипте: import sys sys.ps1 = '⏩ ' sys.ps2 = '⏳ ' А как насчет динамически изменяемой строки? Это тоже можно. Создаём класс, наследованный от строки и определяем что он возвращает при печати. import sys class PS1(object): def __init__(self): self.s = True def __str__(self): self.s = not self.s return '\033[97m█◣ \033[0m ' if self.s else '\033[34m█◤ \033[0m ' sys.ps1 = PS1() sys.ps2 = '▼ ' Попробуйте поработать с этим) ___________ Еще пример python-startup скрипта с просторов гитхаба. И пример от меня, рандомный смайл на каждой строке 😂 #tricks#libs

1,150 views

Hashtags

Објавено 21 сеп.

Выполнение функции перед выходом. Как вызвать функцию перед выходом из программы в Python? Для этого нужно использовать модуль atexit. Он регистрирует функции, которые выполняются перед завершением процесса интерпретатора. import atexit def before_exit(): print('BEFORE EXIT') atexit.register(before_exit) Теперь попробуйте завершить процесс и увидите сообщение >>> exit() BEFORE EXIT 🔸 Для регистрации такой функции в REPL пригодится startup скрипт. 🔸 Этот функционал работает и в обычном режиме без интерактивной консоли. #tricks#libs

1,140 views

Hashtags

Објавено 18 сеп.

Startup скрипт для REPL. Как выполнить скрипт сразу после старта интерактивной консоли Python? Для начала понять бы зачем это может понадобиться. А причины бывают достаточно весомые - автоматизировать одни и те же действия которые вы повторяете при старте REPL - кастомизировать сам REPL - объявление энвайромента или констант для ручного дебага или тестирования итд... В общем, как-то ускорить свою работу с REPL. Как пример поведения, команда shell_plus в пакете django-extensions, которая перед запуском шела импортит всё самое необходимое. Есть два способа это сделать 🔸Флаг i Запишите все действия в скрипт, например startup.py, и запускайте консоль такой командой: python -i startup.py Флаг -i означает, что после выполнения скрипта инетрпретатор не завершит процесс а перейдёт в интерактивный режим, то есть обычный RELP. 🔸Переменная окруженияPYTHONSTARTUP Еще до старта самого Python объявляем переменную PYTHONSTARTUP, в которую следует указать путь к скрипту. Сразу после запуска REPL но до первого приглашения к вводу команды ваш скрипт исполнится. Windows set PYTHONSTARTUP=C:\path\to\startup.py Linux export PYTHONSTARTUP=/path/to/startup.py Теперь запуск REPL будет исполнять указанный файл Всё это относится только к интерактивной консоли REPL! Если вам нужен аналогичный функционал для обычного запуска приложения, то его нет. Так как это легко реализовать штатными средствами, добавив нужные импорты в начало вашего приложения. #tricks

1,290 views

Hashtags

Објавено 16 сеп.

Функция sub в regex может принимать функцию в качестве аргумента repl. 📄 Из документации: If repl is a function, it is called for every non-overlapping occurrence of pattern. The function takes a single match object argument, and returns the replacement string. То есть для каждого совпадения будет вызвана функция для вычисления замены вместо замены на одну и ту же строку для всех совпадений. Иными словами, для замены разных совпадений на разные строки не потребуется запускать re.sub() много раз для каждой строки замены. Достаточно определить функцию, которая вернёт строку для каждого из совпадений. Описание слишком запутанное🤔, давайте лучше рассмотрим на простом примере: Создаем карту замены. То есть какие строки на какие требуется менять. remap = { 'раз': '1', 'два': '2', 'три': '3', 'четыре': '4', 'пять': '5', } Пишем функцию поиска строки для замены. Единственным аргументом будет объект re.Match. Используя данные этого объекта мы вычисляем замену on-the-fly! def get_str(match: re.Match): word = match.group(1) return remap.get(word.lower()) or word Пример текста. text = '''Раз Два Три Четыре Пять Вместе будем мы считать Пять Четыре Три Два Раз Мы считать научим вас ''' Теперь запускаем re.sub и вместо строки замены (repl) подаём имя функции. (Данный паттерн ищет отдельные слова в тексте) >>> print(re.sub(r'(\w+)', get_str, text)) 1 2 3 4 5 Вместе будем мы считать 5 4 3 2 1 Мы считать научим вас Думаю, достаточно наглядно 🤓 #libs#regex

1,150 views

Hashtags

12•••10•••1920212223•••303132
ПретходнаСтраница 21 од 32Следна