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Број на индексирани објави
Неодамнешен опфат32,190Збир на неодамнешни прегледи
Неодамнешни објави

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

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

Објавено 14 мар.

Из-за всем известных событий очень многие потеряли работу. Для поиска вакансий вполне можно использовать паблики в telegram. Вот несколько которые мне известны: https://t.me/django_jobs https://t.me/javascript_jobs https://t.me/workzavr https://t.me/workoo https://t.me/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,040 views

Hashtags

Објавено 14 мар.

⚠️ События последних дней сильно изменили жизнь многих из нас. Мы уже не будем прежними и мир вокруг не будет прежним. Лично я всё ещё в некотором тупняке от происходящего... Но этот канал не о политике и здесь я не буду рассуждать кто прав а кто виноват. Для нас сейчас главное — пережить пик кризиса и адаптироваться к новым реалиям. Обязательно беречь себя и помогать окружающим. В свою очередь я хочу помочь всем, кто меня знает и читает. Поэтому у меня к вам есть три предложения... #offtop

2,850 views

Hashtags

Објавено 22 фев.

Сегодня будет самый "двоичный" ("двойковый"? "двушный"? "двойственный"?) момент на вашем веку 🤩 Больше двоек в дататайме вы не застанете! Успейте поймать момент! Будете показывать эпичный скриншот своим внукам))) 🥸 Для продуманных (ленивых): код на скрине, который сработает только сегодня и только 1 раз! ⏱ Открывайте окошки с часами и вперёд! #offtop

2,810 views

Hashtags

Објавено 2 фев.

Метод строки 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

2,930 views

Објавено 17 јан.

Синтаксис 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

2,620 views

Hashtags

Објавено 14 јан.

Ещё пара триков с форматированием! ▫️Порядки больших чисел можно разделять запятой (и только запятой) >>> '{:,}'.format(1_231_312) '1,231,312' ▫️Если оставить пробел в форматировании float после ":" то он добавится в строку >>> '{: .2f}'.format(15) ' 15.00' Но если подать отрицательное число, то знак минуса займёт этот пробел >>> '{: .2f}'.format(-15) '-15.00' Удобно для формирования строк одинаковой длины независимо от знака числа. #tricks

2,280 views

Hashtags

Објавено 12 јан.

При форматировании числа в строку можно задать паддинг - заполнение нулями до нужной длины. >>> '{}_v{:05d}'.format('name', 125) 'name_v00125' А что если паддинг тоже задан переменной? В таком случае мы можем добавить форматирование этой переменной внутри формата первой. Порядок переменных следует указывать в порядке появление открывающейся скобки. >>> '{}_v{:0{}d}'.format('name', 125, 5) 'name_v00125' Или вот так >>> '{}_v:{:{:02d}{}}'.format('name', 125, 5, 'd') 'name_v00125' А можно глубже? К сожалению (а может к счастью), уровень вложенности ограничен двумя. То есть, форматирование внутри форматирования внутри форматирования это ... ValueError: Max string recursion exceeded Но никто не запрещает использовать один тип форматирования внутри другого. (Пример странный, но зато рабочий) >>> ('{}_v{:{:%0.2dd}{}}' % 2).format('name', 125, 5, 'd') 'name_v00125' С f-string можно использовать 4 уровня, по количеству доступных типов кавычек. Можно, но не нужно 😕 f'''{f"""{f'{f"{x}"}'}"""}''' #tricks

2,470 views

Hashtags

Објавено 1 јан.

🎉🌈🔥Всех c 2k22!❄️⛄️🥂 А еще сегодня каналу @pythonotes исполнилось 2️⃣ годика 🎂

2,710 views

Објавено 27 дек.

Наверняка вы замечали, что в Python есть удобная функция для получения переменной окружения os.getenv(NAME) И её "сестра" для создания или изменения переменных окружения os.putenv(NAME, VALUE) Но почему-то putenv() не работает как должно. Энвайромент не обновляется! os.putenv('MYVAR', '1') print(os.getenv('MYVAR')) ... и ничего 😴 Почему так? На самом деле энвайромент обновляется, но это значение не добавляется в словарь os.environ. Откройте исходник функции os.getenv(). Это просто шорткат для os.environ.get() В то время как putenv() это built-in С-функция. Словарь os.environ (или точней класс из MutableMapping) создаётся из энвайромента в момент инициализации. Функция putenv() самостоятельно его не изменяет. В тоже время, когда вы создаёте или изменяете ключ в os.environ, автоматически вызывается putenv() в методе __setitem__(). То есть, технически putenv() всё делает верно, но в os.environ это не отражается. Можно проверить так: >>> os.putenv('MYVAR', '123') >>> os.system('python -c "import os;print(os.getenv(\'MYVAR\'))"') 123 Я объявил переменную в текущем процессе и вызвал дочерний процесс, который её унаследовал и получил в составе os.environ. Аналогично при удалении переменной вызывается еще одна built-in функция unsetenv(), удаляющая переменную из системы. Итого ▫️ Удобней всего явно обновлять переменные через os.environ ▫️ Есть способ неявно создать/удалить переменную через putenv/unsetenv, что не повлияет на os.environ но изменит энвайромент и передаст изменения сабпроцессам. Но так лучше не делать! ▫️os.environ это просто обертка для built-in функций putenv() и unsetenv(). #basic

3,080 views

Hashtags

Објавено 20 дек.

😋Заметка от читателя@nencoru Как смержить несколько файлов с отсортированными строками в один файл, тоже отсортированный? 🔸 Исходный файл: ▫️ в одной строке находится одна запись ▫️ запись содержит предсказуемое поле с некими данными для сортировки. Например, логи с указанием времени. ▫️ все записи в файле отсортированы по этому полю 🔸 Задача: Смержить несколько таких файлов так, чтобы в финальном файле все записи были также отсортированы. 🔸 Решение 1: Предположим, у меня JSON-логи files = ['file1.jsonl', 'file2.jsonl', ...] data = [] for file in files: with open(file) as f: data.expand( f.readlines() ) data.sort(key=lambda line: json.loads(line)['timestamp']) with open('merged.jsonl', 'w') as f: f.writelines(data) Усложним задачу — размер каждого файла 5Gb😱 Это означает, что вам потребуется оперативной памяти 5*len(files) Gb. И уже не каждый компьютер сможет смержить 3-4 таких файла. А если их 100? fileinput может помочь написать более красивый код, но с памятью не поможет. 🔸 Решение 2: Можно использовать готовую функцию heapq.merge() из стандартного модуля heapq! Heap - это бинарное дерево, где каждый родительский элемент в дереве имеет значение меньшее чем дочерний. То есть, по умолчанию все элементы как-либо отсортированы. from heapq import merge items = [ [3,2,6], [1,5,4] ] print(list(merge(*items))) # [1, 2, 3, 4, 5, 6] А учитывая, что merge это генератор, умеет работать с файлами и ему можно передать функцию для сортировки, он отлично подойдет для нашей задачи, так как полной загрузки в память не происходит! И тут вы спросите: что за магия? Тоже самое только без расхода памяти? Волшебный генератор всех спасёт? Нет, за всё приходится платить. В случае с heapq весь процесс драматически замедлится. Но задача будет выполнена! 😎 Сделал для вас синтетический пример для генерации и мержа подобных файлов Код смотреть здесь ↗️ ▫️make_logs() генерит 30 файлов по 50Mb для теста ▫️merge_list() мержит файлы через простой список ▫️merge_heapq() мержит файлы через heapq ▫️memory_profiler считает используемую память (нужно установить модуль) ▫️ также есть замер времени Кому лениво там же смотрите мои тесты: 1.5Gb и 19.5с против 19Mb и 2м 43с памяти в 80 раз меньше, но времени в 8 раз больше ⚠️ ВАЖНО для чистоты эксперимента запускать следует из консоли и по одному тесту на процесс. То есть закоментили второй, запустили первый, закоментили первый, запустили второй. #bacik

2,410 views

Hashtags

Објавено 7 дек.

Состоялся релиз DJANGO 4.0 Полный список изменений читаем здесь ↗️ #django

2,300 views

Hashtags

Објавено 3 дек.

🤟😜🍺🎁🎉🍻🎂 Поздравляю всех 3Dшников с проф-праздником! PS. А еще на канале юбилейный пост под номером 300!😎 #offtop

2,690 views

Hashtags

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