CoolPython
4.68K subscribers
20 photos
44 links
Канал об основах Python и хороших практиках разработки. Создаём системность в обрывочных знаниях.

Тем, кто хочет понимать, что пишет!
Download Telegram
Генератор кортежей

Генераторы списков — это конструкции вида

[x for x in range(5)]
# [0, 1, 2, 3, 4]

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

{n: n**2 for n in range(5)}
# {0: 0, 1: 1, 2: 4, 3: 9, 4: 16}

Кортеж так создать не получится, потому что круглые скобки зарезервированы под генераторные выражения.

Но если все же хочется создать кортеж на лету именно этим способом, то можно вот так:

*(x for x in range(5)),
# (0, 1, 2, 3, 4)

То есть, распаковываем и ставим запятую, чтобы обозначить, что это кортеж. Такие дела!
Вау, в Python будет можно по желанию отключить GIL. В мейн буквально пару часов назад вмержили эту настройку

https://github.com/python/cpython/pull/116338

GIL (Global Interpreter Lock) — это механизм в CPython, который предотвращает одновременное выполнение нескольких потоков.

Это всю дорогу означало, что даже если мы пишем программу на Python как многопоточную, то в любой момент времени может выполняться только один тред.

С одной стороны, это ограничивало возможности параллельного выполнения кода даже на многоядерных процессорах. С другой, облегчало управление памятью в Python: такое решение исключает все особенности многопоточного программирования и делает проще работу программиста.

Наличие GIL годами было предметом дебатов и критики из-за ограничений на многопоточность. Я рада, что парадигма однопоточности Python наконец сдвигается: это реально изменит разработку на этом языке.
Вы, наверное, знаете, что из-за того, что числа в памяти представлены в двоичной форме, в Python есть ошибка вида

print(0.1 + 0.2)
# 0.30000000000000004


В Python модуль decimal поддерживает точную арифметику десятичных чисел. Она важна в областях, требующих высокой точности, например, в финансах или научных расчетах.

А вот кто скажет, почему возникает разница в примерах ниже?

1️⃣

from decimal import Decimal

a = Decimal(0.1)
b = Decimal(0.2)
print(a + b)
# 0.3000000000000000166533453694


2️⃣

a = Decimal('0.1')
b = Decimal('0.2')
print(a + b)
# 0.3


Жду ваши ответы в комментариях!