Post #589
1.21K

Кажется, PSF нанимает второго разработчика по программе Developer in Residence. Им станет давнишний кор-контрибьютор Петр Викторин из Чехии. Сейчас Петр работает лидом команды Python Maintenance в Red Hat.
- 🔥 13
ПИ @pythonic_attacks
Showing posts older than #590 · Back to latest


Forwarded from Заметки Андрея

Питонические атаки Ещё один прикол в 3.12 — встроенная функция sum() теперь использует специальный алгоритм для сложения чисел с плавающей точкой с минимальной потерей точности (прочитать про алгоритм можно на вики). Раньше было как, складываешь 10 чиселок, где в результате…
math.fsum() всё-таки нужна, потому что она лучше сохраняет точность, чем встроенная sum(), хоть и работает значительно медленнее. Видимо, там какие-то более сложные алгоритмы используются.sum() теперь использует специальный алгоритм для сложения чисел с плавающей точкой с минимальной потерей точности (прочитать про алгоритм можно на вики).>>> sum([0.1] * 10)И ладно бы оно просто всегда ошибалось одинаково, дак ведь погрешность ещё и зависит от порядка, в котором складывать числа:
0.9999999999999999
>>> sum([0.1] * 5 + [0.05] * 10)А вы разве не знали, что сложение float'ов не коммутативно?
1.0000000000000004
>>> sum([0.05] * 10 + [0.1] * 5)
0.9999999999999999
>>> sum([0.1, 0.05, 0.05, 0.05, 0.05, 0.1, 0.1, 0.05, 0.05, 0.1, 0.05, 0.05, 0.05, 0.1, 0.05])
1.0000000000000002
math.fsum(), которая всё делает правильно:>>> math.fsum([0.1] * 10)Дак вот в 3.12 встроенная функция
1.0
>>> math.fsum([0.1] * 5 + [0.05] * 10)
1.0
>>> math.fsum([0.05] * 10 + [0.1] * 5)
1.0
sum() даёт такие же результаты, как math.fsum(). По крайней мере, я не смог найти примера, где они дали бы разный результат. Кроме того, по моим замерам, sum() работает ещё и раза в полтора быстрее math.fsum():>>> timeit.timeit("sum([0.05] * 10 + [0.1] * 5)")
0.26875441599986516
>>> timeit.timeit("math.fsum([0.05] * 10 + [0.1] * 5)", setup="import math")
0.34194887499961624
Кто-нибудь понимает, зачем теперь нужна math.fsum()?itertools добавили функцию batched, которая разбивает список или любой итерируемый объект на кортежи указанной длины. Последний кортеж может быть короче указанной длины, если не хватит элементов.>>> list(batched('ABCDEFG', 3))
[('A', 'B', 'C'), ('D', 'E', 'F'), ('G',)]
Раньше для этого приходилось либо определять эту функцию самостоятельно, взяв её из документации Python, либо устанавливать библиотеки, типа more-itertools. Да, эта функция испокон веков лежит в виде сниппета кода в документации, но в стандартной библиотеке её нигде не было. Теперь есть 🤷♂️ Возможно, теперь я буду чуть реже ставить more-itertools.


python/cpython на гитхабе появился тэг v3.12.0, что означает... Ну, думаю, вы и сами понимаете. Скоро будет официально релизнуто. 🍾Forwarded from Коробка с питоном
pyproject.toml в однофайловые скрипты. __pyproject__, которая будет содержать в себе валидный TOML, описывающий метадату скрипта, в том числе как скрипт запускать и какие зависимости необходимы для запуска.requests и питон 3.11 или выше:__pyproject__ = """PEP прикольный, что-то такое есть в качестве экспериментального RFC в Rust. Из минусов хотел бы отметить то, что автоматическая установка зависимостей может привести к запуску нежелательного кода. Но решение банальное - перед тем как что-то запускать, проверяйте, что вы запускаете.
[project]
requires-python = ">=3.11"
dependencies = [
"requests<3",
]
"""
import requests
resp = requests.get("https://peps.python.org/api/peps.json")
print(resp.json())

black в виртуальном окружении и предложит использовать его вместо дефолтного форматтера пайчарма. Настройки подхватывает из pyproject.toml. И всё, просто берёт и форматирует!blackd, который использовали для ускорения форматирования, но это обещали добавить. Короче, не идеально, но для начала хорошо.Alt/Option+Enter > AI Actions > Explain code, тут же открывается чат, где заботливый ИИ на чистейшем английском объясняет тебе суть. Правда, видимо, я выбирал слишком мутные куски кода, поэтому мне не особо помогло. Всё равно понравилось.


Forwarded from Python Заметки
pilow или djangoo, считай что вредонос уже в системе.requirements.txt вместо ручной установки пакетов