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

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

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

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

Всех, кто в теме, с праздником! 🎉🚀⭐️

1,750 views

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

Awesome Python Typing Коллекця ссылок на различные инструменты повышения качества кода и удобства работы. Типизация, линтинг, автокомплиты и другие полезности. Есть ссылка на надавно вышедшую SQLAlchemy2, так что актуальность поддерживается. Странно что всё еще нет в списке Ruff. Хотя, в Issues уже добавили запрос. Но автор не уверен что эта тулза подходит для его списка. #libs

2,470 views

Hashtags

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

Где можно применять моржовый (walrus) оператор? (Py3.8+) Очевидное назначение моржового оператора - сократить количество кода. Сделать присвоение значения переменной и его использование в одно действие. Чаще всего используется в конструкциях if и while if match := pattern.search(data): print(match.groups()) while chunk := file.read(1024): process(chunk) Можно ли использовать его внутри f-string? print(f'{x:=10}') # NameError: name 'x' is not defined Это синтаксис форматирования а не walrus. Чтобы превратить выражение в walrus используем скобки print(f'{(x:=15)}') # '15' print(x) # 15 Получается, что скобки помогут использовать walrus не только с if, while, match и тд. Пример не самого очевидного присвоения значений переменным x = (y := 1, 2) print(x) print(y) # (1, 2) # 1 Вызов функции тоже может быть использован как скобки для walrus def get(): return 2 def do_it(x, y): return x + y x = do_it(y := get(), y+3) print(x, y) # 7 2 Два "моржа" на одном пляже в одной строке def compute(x): return x*2 def get_value(): return 1 if z := compute(x := get_value()): print(f"compute({x}) = {z}") else: print(f"{x} is not valid value") # compute(1) = 2 В следующем примере мы экономим не только код но и количество расчётов list1 = [1, 2, 3, 4, 5] # без walrus list2 = [x*2 for x in list1 if x*2 % 15 == 0] # c walrus list2 = [(n := x*2) for x in list1 if n % 15 == 0] Создание списка выполняется последовательно, поэтому можно объявить переменную в первом элементе и использовать в остальных f = lambda v: v*2 [y := f(1), y**2, y**3] # [2, 4, 8] Более страшный пример с созданием lambda через walrus [y := (f := lambda x, i: x*i)(3, 10), z:=f(y, 20), f(z, 30)] # [30, 600, 18000] не делайте так Экономим один вызов lower() в простом выражении is_palindrome = (w := word.lower()) == w[::-1] И ещё пример экономии места в файле и времени CPU try: 10 / 0 except Exception as err: logger.log(message := f"Error, {err}!") send_report(message) А еще не будет ошибкой синтаксиса если использовать walrus перед return. def calculate(a, b): return result := a * b Но, по очевидным причинам, смысла в этом нет 😄 #triks

2,050 views

Hashtags

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

Если вы занимаетесь веб разработкой то знаете, что для оформления UI принято использовать шрифтовые иконки. Самые популярные наборы это, конечно же, FontAwesome и MaterialDesign Было бы здорово иметь подобный функционал в PySide? Думаю, что да! И, как вы уже поняли, есть подходящая библиотека🙀 https://github.com/spyder-ide/qtawesome ▫️добавление любых иконок из популярных наборов иконок ▫️выбор цвета иконки ▫️изменение цвета для активного виджета ▫️поддержка анимации ▫️создание видежта иконки Пример создания иконки import qtawesome as qta icon = qta.icon('fa5.flag') #libs

1,910 views

Hashtags

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

Варианты распаковки контейнеров по отдельным переменным Обычная распаковка по точному количеству data = [1, 2, 3, 4, 5] v1, v2, v3, v4, v5 = data Распаковка с неизвестным количество но не меньше чем N v1, *_ = data v1, *_, v4, v5 = data Если точно знаете позицию нужного объекта в списке, включая вложенные списки, то достать его можно двумя способами Через индекс: data = [[1]] v1 = data[0][0] Через распаковку со скобками: data = [[1]] (v1, ), = data data = [[[1]]] ((v1,), ), = data Еще примеры распаковки вложенных объектов data = [[1, 2], [3, 4], [5, 6]] (v1, v2), (v3, v4), (v5, v6) = data (v1, v2), *_, (v5, *_) = data #tricks

2,009 views

Hashtags

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

Что позволяет делать f-strings в 3.12. ▫️можно использовать одинаковые кавычки во всём выражении ▫️можно добавлять переносы для многострочного выражения ▫️можно использовать символ новой строки (эта проблема неактуальна) >>> print(f"{"\n".join( >>> ["1","2","3", >>> f"{ >>> f"{2+2}" >>> *(2+2) >>> }" >>> ] >>> )}") 1 2 3 4444 #tricks#libs

1,910 views

Hashtags

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

Пока команда разрабов Python понемногу наращивает скорость работы интерпретатора, новый язык программирования Mojo с заявкой на замену Python тихо пилит свои первые релизы. Уже сейчас прирост в CPU рассчётах в 10к раз! Можно скачать и сравнить скорость, или посмотреть что пишут другие. Как по мне, это выглядит как еще одна версия интерпретатора, хотя, это и не совсем так. Похоже на тот же cython - нативная поддержка дефолтного кода Python плюс свои фишки синтасиса сверху. Всё же надежда на прорывные технологии остаётся, Подождём, увидим... Забавно, что в минимальных требованиях 8Гб оперативки😧 #libs#offtop

2,300 views

Hashtags

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

Удобный сервис для генерации команд ffmpeg. ➡️https://alfg.dev/ffmpeg-commander/ Отлично подходит для изучения ffmpeg и для быстрых набросков команды. А так же, на заметку, python-обертка #tools#libs

2,330 views

Hashtags

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

Почему проект Qt.py до сих пор не добавил обёртку PySide6? Данный модуль используется в DCC и смежных инструментах. А учитывая стандартны отрасли, описанные на VFX Platform в 2023м году стандартном всё еще является Qt5. Переход на Qt6 запланирован на 2024й. Скорее всего к тому времени подтянется поддержка 6й ветки (но лучше бы заранее). В своих проектах с Qt6 можете исползовать альтернативный проект qtpy, который уже поддерживает Qt6 но не поддерживает старые версии. Модуль поддерживает PyQt5, PySide2, PyQt6 и PySide6. #libs

2,590 views

Hashtags

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

Функция dir() - удобна для получения списка атрибутов у любого объекта. Ранее я писал про функцию __dir__() в модуле (не путайте её с переменной __all__(), которая указывает список объектов для импорта если встречается конструкция from module import *). Скорее всего вы уже знаете как использовать функцию dir(). Любой объект может реализовать метод __dir__() чтобы указать список имеющийхся и динамических атрибутов. И функция dir() поможет получить список этих атрибутов. >>> dir(str) ['__add__', '__class__', '__contains__', ...] У этой функции есть еще один способ применения. Её можно вызвать без аргумента, и в таком случае она вернёт список имён в текущем неймспейсе. >>> dir() ['__builtins__', '__doc__', '__file__', ...] >>> def test(): >>> x = 1 >>> print(dir()) >>> test() ['x'] #basic#tricks

2,140 views

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

⭐️ Встречаем релиз 3.12 Из того что мне приглянулось: ▫️ Всё ближе sub-interpreters, на С уже можно пробовать. В Python-коде будет в следующем релизе. ▫️ Наконец закончится возня с кавычками в f-string ▫️ Говорят, хорошо ускорили async код. ➡️ Остальные подробности читаем здесь #release

2,100 views

Hashtags

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

Как проверить является ли директория пустой? Самый простой способ: if os.listdir(path): ... Тоже самое с pathlib p = Path(path) if list(p.iterdir()): ... В первом случае функция os.listdir возвращает полный список файлов. Нам остаётся проверить есть ли там что-либо. Во втором случае мы получаем генератор, который под капотом использует тот же listdir. Теперь представим что в директории 10к файлов for i in range(10000): Path(f'/tmp/test/test{i}.txt').touch() Не сказать, что при наличии SSD это проблема, но когда таких операций много, мы начинаем терять время, особенно с pathlib. import timeit test_path = '/tmp/test' count = 1000 >>> timeit.timeit('list(os.listdir(p))', setup=f'import os;p="{test_path}"', number=count) 2.281363710993901 >>> timeit.timeit('list(p.iterdir())', setup=f'from pathlib import Path;p=Path("{test_path}")', number=count) 5.6957218300012755 То есть мы получаем список всех 10к файлов просто чтобы узнать что там есть файлы. Хотя нам надо узнать есть ли по указанному пути хотя бы один файл. Для того чтобы ускорить проверку лучше воспользоваться функцией os.scandir(). Она работает на много быстрей и возвращает итератор с объектами os.DirEntry. Чтобы узнать есть ли в директории хоть один файл достаточно использовать функцию next() next(os.scandir(path)) Но если директория пустая, то мы получим ошибку. Поэтому добавляем значение по умолчанию и можно использовать конструкцию в условном операторе if next(os.scandir(path), None): ... Либо используем функцию any(), так как она завершится сразу после нахождения первого файла или если итератор пуст. if any(os.scandir(path)): ... Сравним скорость >>> timeit.timeit('next(os.scandir(p), None)', setup=f'import os;p="{test_path}"', number=count) 0.2183076049986994 >>> timeit.timeit('any(os.scandir(p))', setup=f'import os;p="{test_path}"', number=count) 0.21016486900043674 #tricks

1,910 views

Hashtags

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