Float или Decimal: в чём различия и что лучше использовать?
И тот, и другой предназначены для работы с дробными числами, но есть нюанс . Float использует некоторое приближение при работе с числами с плавающей точкой, поэтому может вносить ошибки округления. То есть Float эффективный и быстрый, но не очень точный.
Эта особенность может мешать в некоторых случаях, например, при работе с деньгами. Ошибки округления могут привести к значительным потерям, если обрабатывается большое количество транзакций. Тогда лучше использовать Decimal. Его нужно импортировать — from decimal import Decimal. Передавать на вход следует строку. Как видно на картинке, благодаря Decimal устраняются возможные ошибки округления.
#код
И тот, и другой предназначены для работы с дробными числами
Эта особенность может мешать в некоторых случаях, например, при работе с деньгами. Ошибки округления могут привести к значительным потерям, если обрабатывается большое количество транзакций. Тогда лучше использовать Decimal. Его нужно импортировать — from decimal import Decimal. Передавать на вход следует строку. Как видно на картинке, благодаря Decimal устраняются возможные ошибки округления.
#код
👍29❤3🤯2
🧍♂️🧍🧍♀️ Как реализовать очередь в Python
Очереди (Queues) — одна из структур данных, используемая для хранения коллекций элементов в порядке first-in, first-out (FIFO). Всё, как в настоящей очереди, — кто первым вошёл, то раньше всех и вышел.
В Python очереди можно реализовать с помощью класса deque() из модуля collections или модуля queue.
🧍♀️Чтобы добавить элементы в очередь: в deque используем метод append(), в Queue — put()
🧍Чтобы удалить элементы из очереди: в deque — метод popleft(), в Queue — get()
🧍♂️Чтобы проверить размер очереди, используем len()
Стоит отметить, что queue.Queue предназначен для многопоточного программирования.
#код
Очереди (Queues) — одна из структур данных, используемая для хранения коллекций элементов в порядке first-in, first-out (FIFO). Всё, как в настоящей очереди, — кто первым вошёл, то раньше всех и вышел.
В Python очереди можно реализовать с помощью класса deque() из модуля collections или модуля queue.
🧍♀️Чтобы добавить элементы в очередь: в deque используем метод append(), в Queue — put()
🧍Чтобы удалить элементы из очереди: в deque — метод popleft(), в Queue — get()
🧍♂️Чтобы проверить размер очереди, используем len()
Стоит отметить, что queue.Queue предназначен для многопоточного программирования.
#код
👍27❤2
🧑💻 Что делает функция takewhile() модуля itertools
Функция создаёт итератор, возвращающий элементы из итерируемого объекта до тех пор, пока указанное условие истинно (True или 1). Как только условие становится ложным, итератор прекращает свою работу и больше не возвращает элементы.
В примере takewhile будет возвращать элементы из списка my_list, пока они меньше пяти. Как только встретится элемент, равный или больший пяти, работа прекратится.
#код
Функция создаёт итератор, возвращающий элементы из итерируемого объекта до тех пор, пока указанное условие истинно (True или 1). Как только условие становится ложным, итератор прекращает свою работу и больше не возвращает элементы.
В примере takewhile будет возвращать элементы из списка my_list, пока они меньше пяти. Как только встретится элемент, равный или больший пяти, работа прекратится.
#код
👍26❤3👏2🤔1
⭐ Продолжаем изучать модуль itertools. Сегодня — функция starmap()
starmap() принимает в качестве аргументов другую функцию и итерируемый объект, элементы которого представлены кортежами. Переданная функция применяется к каждому из кортежей, каждый кортеж распаковывается, и его элементы передаются в функцию как отдельные аргументы.
🌟 Таким образом, starmap() можно использовать вместо map(), если данные были предварительно упакованы в кортежи.
В примере starmap() позволяет вычислить квадраты чисел в кортежах в списке и сложить их.
#код
starmap() принимает в качестве аргументов другую функцию и итерируемый объект, элементы которого представлены кортежами. Переданная функция применяется к каждому из кортежей, каждый кортеж распаковывается, и его элементы передаются в функцию как отдельные аргументы.
🌟 Таким образом, starmap() можно использовать вместо map(), если данные были предварительно упакованы в кортежи.
В примере starmap() позволяет вычислить квадраты чисел в кортежах в списке и сложить их.
#код
👍24🥰2
👓 Задача: Дан непустой список с целыми числами, каждый элемент которого, кроме одного, повторяется дважды. Нужно найти этот единственный элемент.
Предлагается решение через использование оператора «^» — побитового XOR (исключающее ИЛИ).
Подробное объяснение в видео
#код
Предлагается решение через использование оператора «^» — побитового XOR (исключающее ИЛИ).
Подробное объяснение в видео
#код
🔥19👍7👏1
Зачем в Python использовать конструкцию
Если коротко: так мы будем уверены, что определённый кусок кода выполнится только в случае, если мы запустим Python-скрипт напрямую. Это позволяет нам без опасений импортировать его в качестве модуля.
Если хочется подробнее, то вот видеоролик, объясняющий концепцию за две минуты
#код
if __name__ == '__main__'
?Если коротко: так мы будем уверены, что определённый кусок кода выполнится только в случае, если мы запустим Python-скрипт напрямую. Это позволяет нам без опасений импортировать его в качестве модуля.
Если хочется подробнее, то вот видеоролик, объясняющий концепцию за две минуты
#код
👍31❤3👏1
🧹 Линтер Ruff для быстрого «причёсывания» кода на Python
Линтер — это программа, которая автоматически перерабатывает код, делает его «чистым» и приводит в соответствие правилам.
Почему стоит присмотреться к Ruff:
✔️ у него есть 700+ встроенных правил написания кода;
✔️ работает от 10 до 100 раз быстрее других линтеров;
✔️ поддерживает автоматическое исправление ошибок.
Все предустановленные правила можно посмотреть в документации.
📝 Подробная статья с примерами работы Ruff
#код
Линтер — это программа, которая автоматически перерабатывает код, делает его «чистым» и приводит в соответствие правилам.
Почему стоит присмотреться к Ruff:
✔️ у него есть 700+ встроенных правил написания кода;
✔️ работает от 10 до 100 раз быстрее других линтеров;
✔️ поддерживает автоматическое исправление ошибок.
Все предустановленные правила можно посмотреть в документации.
📝 Подробная статья с примерами работы Ruff
#код
❤11👍10👏1🤔1
✨ Как писать чистые функции на Python
Чистые функции — это функции, которые не имеют побочных эффектов и всегда возвращают один и тот же результат для одного и того же ввода. Они предсказуемые, не зависят от внешнего состояния программы и их легко тестировать.
Есть несколько правил написания чистых функций:
1️⃣ Избегайте изменения глобального состояния
Чистая функция не должна изменять никакое глобальное состояние или модифицировать переменные за пределами своей области видимости.
2️⃣ Избегайте изменения входных параметров
Функция должна создавать новый объект или копировать тот, что был подан на вход, если подразумевается его дальнейшая модификация.
3️⃣ Избегайте зависимости от внешнего состояния
Чистой функции не следует читать глобальные переменные или получать данные из внешних источников, таких как файлы или базы данных.
4️⃣ Всегда возвращайте значение
Это значение должно определяться исключительно входными параметрами, а не каким-либо внешним состоянием.
Книга целиком
#код
Чистые функции — это функции, которые не имеют побочных эффектов и всегда возвращают один и тот же результат для одного и того же ввода. Они предсказуемые, не зависят от внешнего состояния программы и их легко тестировать.
Есть несколько правил написания чистых функций:
1️⃣ Избегайте изменения глобального состояния
Чистая функция не должна изменять никакое глобальное состояние или модифицировать переменные за пределами своей области видимости.
2️⃣ Избегайте изменения входных параметров
Функция должна создавать новый объект или копировать тот, что был подан на вход, если подразумевается его дальнейшая модификация.
3️⃣ Избегайте зависимости от внешнего состояния
Чистой функции не следует читать глобальные переменные или получать данные из внешних источников, таких как файлы или базы данных.
4️⃣ Всегда возвращайте значение
Это значение должно определяться исключительно входными параметрами, а не каким-либо внешним состоянием.
Книга целиком
#код
👍20❤2🔥2👏1😁1
🏂 Некоторые трюки с f-строками Python
F-строки — это мощный инструмент для форматирования строк, который позволяет включать выражения и переменные непосредственно внутрь них.
Вот некоторые интересные возможности f-строк:
🟢 перевод из одной системы счисления в другую —
🟢 перевод в проценты —
🟢 арифметические операции —
🟢 форматирование объекта datetime —
Ссылка на материал, где больше примеров кода
#код
F-строки — это мощный инструмент для форматирования строк, который позволяет включать выражения и переменные непосредственно внутрь них.
Вот некоторые интересные возможности f-строк:
🟢 перевод из одной системы счисления в другую —
f'binary: {number:b}'
🟢 перевод в проценты —
f'percentage = {ratio:.2%}'
🟢 арифметические операции —
f'{a + b = }'
🟢 форматирование объекта datetime —
f'datetime : {today}'
Ссылка на материал, где больше примеров кода
#код
👍50❤1🔥1👏1
🪄 Некоторые способы упростить конструкцию if-else
1️⃣ Иногда можно выбросить else. В функции return в блоке if прерывает её выполнение, поэтому в том, чтобы писать блок else просто нет надобности.
2️⃣ Иногда можно всё написать в одну строку. Выглядит красиво, но следует помнить, что такая конструкция плохо расширяемая.
3️⃣ Вместо большого количества or в условии можно использовать последовательности. Например, можно создать кортеж и положить в него все важные для условия значения.
🔗 Более подробно — в видео
#код
1️⃣ Иногда можно выбросить else. В функции return в блоке if прерывает её выполнение, поэтому в том, чтобы писать блок else просто нет надобности.
2️⃣ Иногда можно всё написать в одну строку. Выглядит красиво, но следует помнить, что такая конструкция плохо расширяемая.
3️⃣ Вместо большого количества or в условии можно использовать последовательности. Например, можно создать кортеж и положить в него все важные для условия значения.
🔗 Более подробно — в видео
#код
👍32❤1
📖Модуль difflib для сравнения последовательностей
Особенно полезен для работы с текстами. Содержит функции для создания отчётов в нескольких распространённых форматах, в том числе в HTML.
▪️Класс Differ(), например, выводит различия в отдельных строках, сопровождая их префиксами.
▪️Класс SequenceMatcher() позволяет вычислить сходство между строками. Функция get_opcodes() возвращает список инструкций для приведения первой последовательности к виду второй.
Таким образом, difflib полезен в ситуациях, когда нужно определить не только факт различия между двумя последовательностями, но и конкретные места, где эти различия возникают.
#код
Особенно полезен для работы с текстами. Содержит функции для создания отчётов в нескольких распространённых форматах, в том числе в HTML.
▪️Класс Differ(), например, выводит различия в отдельных строках, сопровождая их префиксами.
▪️Класс SequenceMatcher() позволяет вычислить сходство между строками. Функция get_opcodes() возвращает список инструкций для приведения первой последовательности к виду второй.
Таким образом, difflib полезен в ситуациях, когда нужно определить не только факт различия между двумя последовательностями, но и конкретные места, где эти различия возникают.
#код
👍21❤3
🔢Зачем нужен модуль enum
Содержит в себе перечисления, которые используются для создания именованных констант. Рассмотрим на примере:
👩💻Вы пишете приложение, в котором нужно обрабатывать различные типы ошибок (404, 500 и так далее). Перечисления могут быть использованы для представления разных кодов ошибок.
По сути, перечисления — это набор символических имён, связанных с уникальными значениями. По ним можно итерироваться. В целом, модуль enum позволяет создать более читаемый и самодокументирующийся код.
🔗Изучить подробнее можно здесь
#код
Содержит в себе перечисления, которые используются для создания именованных констант. Рассмотрим на примере:
👩💻Вы пишете приложение, в котором нужно обрабатывать различные типы ошибок (404, 500 и так далее). Перечисления могут быть использованы для представления разных кодов ошибок.
По сути, перечисления — это набор символических имён, связанных с уникальными значениями. По ним можно итерироваться. В целом, модуль enum позволяет создать более читаемый и самодокументирующийся код.
🔗Изучить подробнее можно здесь
#код
👍22❤2🔥1
📖Сортировка словаря в Python
Начиная с Python 3.7 ключи словарей упорядочены: сохраняется порядок при вставке. Но что, если вы хотите отсортировать ключи, например, в лексикографическом порядке? Тогда самый простой способ сначала использовать метод items(), чтобы получить кортежи с парами ключ-значение, а затем применить к этому функцию sorted(). Далее это можно преобразовать обратно в словарь через dict().
О том, как именно происходит сортировка в описанном случае, а также о том, как отсортировать словарь по значениям, читайте здесь
#код
Начиная с Python 3.7 ключи словарей упорядочены: сохраняется порядок при вставке. Но что, если вы хотите отсортировать ключи, например, в лексикографическом порядке? Тогда самый простой способ сначала использовать метод items(), чтобы получить кортежи с парами ключ-значение, а затем применить к этому функцию sorted(). Далее это можно преобразовать обратно в словарь через dict().
О том, как именно происходит сортировка в описанном случае, а также о том, как отсортировать словарь по значениям, читайте здесь
#код
👍11❤1👏1
🌿Модуль pprint для красивого вывода сложных структур данных
Используется как обычный print(), но в отличие от него выводит данные в удобном для чтения человеком виде.
✅Также в модуле есть функция pformat(), которая создаёт строковые представления вместо вывода. Это может пригодиться для логгирования.
Ещё для pprint() можно задать ширину экрана печати, отступ последующего уровня вложенности и даже автоматически отсортировать словарь перед выводом.
#код
Используется как обычный print(), но в отличие от него выводит данные в удобном для чтения человеком виде.
✅Также в модуле есть функция pformat(), которая создаёт строковые представления вместо вывода. Это может пригодиться для логгирования.
Ещё для pprint() можно задать ширину экрана печати, отступ последующего уровня вложенности и даже автоматически отсортировать словарь перед выводом.
#код
👍33😁2❤🔥1
Что списку хорошо, то кортежу... не подходит
Копию списка в Python можно создать через срез исходного списка, который начинается с первого элемента и заканчивается последним:
✏️Фишки с копированием характерны и для других неизменяемых типов в Python. Так, если мы применим copy() к frozenset, то тоже получим не полноценную копию, а ссылку на исходное множество. Решается это применением copy.deepcopy().
#код
Копию списка в Python можно создать через срез исходного списка, который начинается с первого элемента и заканчивается последним:
my_list = [1, 2, 3]Интуитивно кажется, что это должно схожим образом работать и у кортежей. Но это не так. Если мы присвоим переменной срез исходного кортежа, то получим лишь ссылку на него. Это можно проверить, вызвав функцию id() (смотрите картинку).
my_new_list = my_list[:]
✏️Фишки с копированием характерны и для других неизменяемых типов в Python. Так, если мы применим copy() к frozenset, то тоже получим не полноценную копию, а ссылку на исходное множество. Решается это применением copy.deepcopy().
#код
👍18🔥4👏2
➗🔢 Модуль fractions для работы с дробями
Создать рациональное число можно через Fraction() из пары целых чисел, другого рационального числа или строки. Numerator — это числитель, а denominator — знаменатель. По умолчанию numerator=0, denominator=1.
Целые и вещественные числа Python можно преобразовать в дробь, передав их Fraction().
🔹С модулем fractions устраняются проблемы с ошибками представления, возникающие в числах с плавающей точкой.
#код
Создать рациональное число можно через Fraction() из пары целых чисел, другого рационального числа или строки. Numerator — это числитель, а denominator — знаменатель. По умолчанию numerator=0, denominator=1.
Целые и вещественные числа Python можно преобразовать в дробь, передав их Fraction().
🔹С модулем fractions устраняются проблемы с ошибками представления, возникающие в числах с плавающей точкой.
#код
🔥14👍5👏1
🤓 Более эффективный метод объединения строк
Про объединение (конкатенацию) строк с помощью оператора + говорят в каждом туториале по Python для новичков. Однако иногда это не самый эффективный способ решить задачу.
Дело в том, что строки — неизменяемые объекты в Python. Это означает, что каждый раз при конкатенации вы создаёте новую строку с объединённым содержимым.
💡Более экономно по памяти и быстрее будет использовать метод join() для списков. При вызове он создаёт единственную строку.
#код
Про объединение (конкатенацию) строк с помощью оператора + говорят в каждом туториале по Python для новичков. Однако иногда это не самый эффективный способ решить задачу.
Дело в том, что строки — неизменяемые объекты в Python. Это означает, что каждый раз при конкатенации вы создаёте новую строку с объединённым содержимым.
💡Более экономно по памяти и быстрее будет использовать метод join() для списков. При вызове он создаёт единственную строку.
#код
👍28❤2
🐍 Что делает класс ChainMap() модуля collections
Он позволяет объединять несколько словарей так, чтобы их можно было рассматривать как единое целое.
✏️Лучше всего посмотреть на примере:
Экземпляр ChainMap не копирует входные словари, а хранит ссылки на них. Поэтому он может быть более эффективным по памяти по сравнению с другими методами, которые создают копии словарей.
✏️Обновление или вставка в ChainMap затрагивают только первый входной словарь. Снова посмотрим на примере:
#код
Он позволяет объединять несколько словарей так, чтобы их можно было рассматривать как единое целое.
✏️Лучше всего посмотреть на примере:
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}
#код
👍23❤2
🐍Выражения-генераторы в Python
Внешне похожи на List comprehension, который позволяет создавать списки. Однако выражение-генератор возвращает итератор, что более эффективно по памяти. Это значит, что элементы коллекции вызываются по очереди вместо создания полной коллекции сразу.
В примере выше по запросу вычисляются квадраты чисел от 0 до 999. После вызова функции next() дважды цикл for продолжит выводить оставшиеся квадраты чисел, начиная с 4 (2^2). genexpr сохраняет своё состояние между запросами.
#код
Внешне похожи на 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
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
👍12❤2