Cool and Fun Python
540 subscribers
30 photos
8 videos
1 file
33 links
Крутой и весёлый Python. Случаи из практики и не только.
Download Telegram
This media is not supported in your browser
VIEW IN TELEGRAM
Угадайте кто из великодушных диктаторов сегодня отмечает свой день рождения? 🤔
Поздравляем Гвидо Ван Россума с 0b1000100 летием🎂
Please open Telegram to view this post
VIEW IN TELEGRAM
3🍾2
Какие числовые типы данных есть в Python?

Отличный вопрос для начала собеседования. Забавно, но большинство отвечают на него: «float и int». И это хороший, но неполный ответ новичка.
Что же творится с числами в Python на самом деле?

- float - вещественные числа. Точнее они хотят казаться вещественными. Но фиксированное число байт для их хранения не позволяет добиться желаемой точности. float - имеют ограниченную точность для хранения вещественных чисел. Зато умеют быть бесконечностью - float("inf") и даже не числом - float("Nan").

- int - целые числа. В Python они "резиновые". Для хранения целого выделяется столько байт, сколько нужно для его хранения. Никаких big int, long и т.п. в Python нет, потому что обычный int их заменяет.

- bool - логический тип, который в Python частный случай int. Представлен в двух вариантах: True и False. При приведению к int превращаются в 1 и 0 соответственно. Преобразование int -> bool даёт True для любых целых кроме нуля.

- complex - комплексные числа, они же числа с мнимой единицей. Особенностью является то, что в математике мнимая единица записывается как i, а в Python как j. Впрочем, к записям подобным 3+2j быстро привыкаешь.

- decimal - отдельный модуль для хранения вещественных чисел без проблем с точностью. Выделяет столько памяти, сколько нужно для хранения мантиссы и основания. Обязательно заменяет float везде, где важна каждая цифра после запятой: деньги, расчёты с высокой точностью и т.п.

- fraction - дробные числа. Если надо посчитать ⅓+⅘ и вообще работать с дробями, не нужно изобретать велосипед. Модуль отлично справляется с дробной математикой.
👍7🔥3🤓1
Раскладываем по полочкам очевидное (как показывает практика не для всех)

CRUD расшифровывается как:
- create (создать);
- read (прочитать);
- update (обновить);
- delete (удалить).

Когда речь идёт о работе с базой данных используются следующие команды:
- INSERT (вставить);
- SELECT (выбрать);
- UPDATE (обновить);
- DELETE (удалить).

Как видим есть схожие с CRUD команды, а есть отличные.

Идём дальше. При взаимодействии клиента с сервером часто используют REST API, отправляют следующие запросы:
- POST (опубликовать)
- GET (получить);
- PUT (положить);
- DELETE (удалить).

Так, удаление есть и тут. Хоть где-то стабильность.

Смотрим в код, а там функции с именами вида:
- add (добавить);
- get (получить);
- change (изменить);
- delete (удалить).

Вот мы и добрались до истины. Все хотят удалять. Все варианты имеют единую логику создания, просмотра, изменения и удаления. Просто названия отличаются. Но нас же это не запутает?

P.S. Спасибо Кэпу за post. Надеюсь он поможет новичкам найти свой put в мире IT 😉
👍5🆒2
Воскресный привет!

На связи морж и его оператор. Ловите вариант использования := внутри if
def func(num: str):
if num.isdigit() and (index := int(num)) < MAX_INDEX:
...
Как вам?

✍️ - беру на вооружение
🤯 - как это работает?
🎉 - выходные для отдыха, а не кода
🤯105🎉3🔥1😁1
Изначально планировал давать поясняющий пост (ПП), если основной наберёт ≈10% взрывных мозгов 🤯 Получилось не 10%, а 5 ÷ 101 ≈ 4.95%. Но ПП готов, поэтому ловите и изучайте.

Давайте детально разберём код:

def func(num: str):
0). Определяем функцию func, которая принимает один аргумент num строкового типа.
Нам нужно число, а не строка, чтобы корректно сравнить num с MAX_INDEX

    if num.isdigit()
1). num.isdigit() проверяет, является ли строка num числом. Метод isdigit() возвращает True, если в строке есть только цифры. Т.е. там записано натуральное число или ноль.

Познавательная минутка 🤓
Натура‌льные чи‌сла (от лат. naturalis «естественный») - числа, возникающие естественным образом при счёте (1, 2, 3, 4, 5, 6, 7 и так далее).

    if num.isdigit() and ...
2). Если в num есть символы помимо цифр, isdigit возвращает False. В этом случае команда and не выполняет код справа. Нас автоматом перекидывает в блок else. Happy end

    ... (index := int(num))
3). Преобразуем строку num в целое число и присваиваем его переменной index. Ошибку ValueError при преобразовании мы исключили левой проверкой.
Конструкция в скобках называется оператором присваивания с объявлением переменной (walrus operator). Моржовый оператор или просто морж доступен с Python 3.8+

...(index := int(num)) < MAX_INDEX:
4). Благодаря круглым скобкам вокруг моржового присваивания, код "волшебным" образом превращается в обычное сравнение:
index < MAX_INDEX
сравниваем значение index с некоторой константой MAX_INDEX.


Общий смысл этого кода заключается в проверке строки num на то, что она является натуральным числом или нулём и что это число меньше чем константа MAX_INDEX 😉
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥61👍1
В Python всё объект. И иногда надо убедиться, что объект именно того типа, который нам нужен. Как же проверить тип объекта?

Допустим у нас есть переменная spam. И мы хотим убедится, что она указывает на объект типа int.
spam = 42

0. Способ новичка-принтовичка
print(type(spam))
Простой и понятный способ для новичков. Но не подходит для использования в продакшн-коде, так как выводит информацию на экран.

1. Сравнительный
if type(spam) == int:
...
Простой способ сравнить тип переменной с конкретным типом.

2. Сравнительный +
if type(spam) is int:
...
Более строгая проверка на совпадение объектов.

Познавательная минутка🤓
Оператор is проверяет не только тип, но и идентичность объекта. И когда вы прочитали в начале статьи: «В Python всё объект», речь шла действительно обо всём в Python.
Да, тип объекта так же является объектом:
- 42 - объект типа int
- int - объект типа type
- type - объект типа type

В Python type является базовым типом, от которого наследуются другие типы.
Так вот, is проверяет являются ли объекты справа и слева от оператора одним и тем же объектом или нет

3. Функциональный
if isinstance(spam,  int):
    ...
Гибкий способ проверить, является ли объект экземпляром определенного класса или его подкласса. One love forever ❤️

4. Бонусный способ. Проверка на несколько типов, or
if isinstance(spam,  (int, float, complex,)):
    ...
Передача кортежа позволяет проверить объект на принадлежность к нескольким типам одновременно. Работает как цепочка сравнений через or. Достаточно совпасть с одним из типов, чтобы получить истину
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥8👍3🤯1
О чём питоническом написать на следующей неделе?
Anonymous Poll
45%
Регулярные выражения
9%
Строки
36%
Мультимножества
11%
Свой вариант в комментариях
This media is not supported in your browser
VIEW IN TELEGRAM
Благодарю всех проголосовавших 🤝
На следующей неделе выйдет пост про мультимножества. Пожелания в комментариях так же будут учтены.

А пока у всех воскресенье, ловите немного Python кода со строками. Судя по голосованию с ними (строками) и так всё ясно. Поэтому только код и результат, no comments

from os.path import getsize as gs
from sys import getsizeof as gso


words = ("АВТОМЕХАТРОН", "AВТOМEХAТРOН", "АBTОMЕXАTPОH", "ABTOMEXATPOH")
for i, word in enumerate(words):
path = f"word_{i}.txt"
with open(path, "w", encoding="utf-8") as file:
file.write(word)
print(f"{len(word) = }, {gso(word) = }, {gs(path) = }")


Результат
len(word) = 12, gso(word) = 98, gs(path) = 24
len(word) = 12, gso(word) = 98, gs(path) = 19
len(word) = 12, gso(word) = 98, gs(path) = 17
len(word) = 12, gso(word) = 61, gs(path) = 12
👍3🎉3🤯21
Мультимножество. Часть 1, теоретическая

Для начала немного теории о множествах не только в Python, но и в математике в целом.

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

Пример множества: 1, 2, 3, 4, 5. В этом множестве каждое число встречается только один раз. А если вы посмотрите вокруг себя и перечислите окружающие предметы (без повторов), то тоже получите множество: компьютер, телефон, кресло, стол.

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

Пример мультимножества: 1, 2, 2, 3, 3, 3. В этом мультимножестве число 2 встречается два раза, а число 3 - три раза.

👍 - отличное начало, продолжай
🥱 - долой теорию, давай код
👍23🥱2
Всем привет 👋

Увидел в одном канале вот такой код на картинке И немного загрустил. Ведь в нём куча повторяющихся блоков кода

Познавательная минутка 🤓
Принцип DRY (don't repeat yourself) рекомендует программистам не писать повторяющиеся строчки кода. И современные высокоуровневые языки программирования легко с этим справляются. Можно использовать функции и методы классов. А иногда достаточно обычного цикла.

Немного магии и картинка превращается в улучшению версию кода, в лучших традициях DRY
import time


def happy_birthday(name):
name = name.capitalize()
data = [("Happy Birthday to you.", 2, 1),
(f"Happy Birthday to {name}!", 1, 1),
("Happy Birthday to you.", 1, 1),
("Hip Hip Hooray!", 3, 0)]

for text, count, delay in data:
for step in range(count):
print(text)
time.sleep(delay)


happy_birthday("Python")

Кстати, с днём рождения языка. Python исполнилось 0b100001 годиков 🎂🍾🎉
Please open Telegram to view this post
VIEW IN TELEGRAM
🎉8🍾3❤‍🔥1
Мультимножество. Часть 2, хардкодинг
👉начало👈

Для создания мультимножества в Python не нужно изобретать ни велосипед, ни варп двигатель. Достаточно взять словарь dict 🤓
Ключ словаря - элемент мультимножества.
Значение словаря - целое число, которое подсчитывает сколько раз элемент встречается в мультимножестве

# обычный список предметов в комнате
room = ['компьютер', 'телефон', 'кресло', 'стол', 'кресло', 'телефон', 'светильник']

# немного магии и получаем словарь как мультиможество
multiset = {}
for item in room:
if item in multiset:
multiset[item] += 1
else:
multiset[item] = 1

print(multiset)

Отлично! Теперь мы легко можем узнать сколько телефонов в комнате
print(multiset['телефон'])

И это всё, что нужно для создания и работы с мультимножествами?
Неа. Надо немного больше. Строчек 450(!) Python кода. Вот такого: https://telegra.ph/Multimnozhestvo-02-20
Что это за код расскажу в финальной части трилогии 😉
👍3👏2🤯1
This media is not supported in your browser
VIEW IN TELEGRAM
Мультимножество. Часть 3, финал
👉часть 1, теория👈
👉часть 2, хардкодинг👈

Что имеем "из коробки"?
1). В Python есть модуль collections.
2). В модуле написано ≈450 строк кода для создания класса Counter.
3). Counter расширяет возможности словаря dict, превращая его в мультимножество.

Как результат работы с готовым объектом Counter:
- возможность подсчитывать объекты итеририуемых последовательностей;
- складывать и вычитать мультимножества;
- проводить логические операции AND и OR с мультимножествами
- получать наиболее частые элементы мультимножества и многое др.

✍️ - беру на вооружение
🤯 - как это работает?

Ссылка с подробностями про мультимножество Counter
4🤯4👍2
Всех причастных к дню Защитника Отечества поздравляю с прошедшими праздником 🫡

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

0). Подсчет количества вхождений элементов в списке:
from collections import Counter

lst = [1, 2, 3, 1, 2, 3, 4, 5, 1, 2, 3]
counter = Counter(lst)

print(counter)
Кстати, вместо чисел могут быть любые объекты. Counter посчитает и bool'ы и классы.

1). Подсчет количества слов в тексте:
from collections import Counter

text = "Обычный текст. Обычно пословно разбиваем текст. Обычный подсчёт слов в тексте."
words = text.split()
counter = Counter(words)

print(counter)
Обратите внимание, что такой подход реагирует на знак препинания.

2). Подсчет количества символов в строке:
from collections import Counter

string = "abracadabra"
counter = Counter(string)

print(counter)

Лирическое отступление 😃
Когда-то давно вёл мероприятие онлайн. И показывал пример со словом «abracadabra». Стоило произнести его вслух, как платформа давала сбой, трансляция прерывалась. После трёх абракадабр решили вместе с участниками мероприятия заменить слово

3). На финал оставил пример посложнее. 10 самых используемых слов в тексте. Например в Войне и мир Л.Н. Толстого.
import re
from collections import Counter

def top_10_words(filename):
words_count = Counter()

with open(filename, 'r', encoding='utf-8') as file:
for line in file:
words = re.findall(r'\b\w+\b', line.lower())
words_count.update(words)

top_10 = words_count.most_common(10)
return top_10

filename = 'Война и мир.txt'
top_words = top_10_words(filename)
for word, count in top_words:
print(f'Слово "{word}" встретилось {count} раз')

Кстати, заметили как хитро закручен переход от мультимножества к регулярным выражениям? 🪄 Следующие несколько постов буду про них

✍️ - беру на вооружение
🤯 - как это работает?
🎉 - выходные для отдыха, а не кода
Please open Telegram to view this post
VIEW IN TELEGRAM
9🤯3🎉1
Немного философских мыслей мемов или просто делюсь наболевшим
🤣3👍2🔥1
Давным давно, в прошлом тысячелетии...
Регулярные выражения. Эпизод 4. Теоретический

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

По сути регулярные выражения являются отдельным языком. Они появились более пол сотни лет назад. Потом набрали популярность как часть языка программирования Perl. И лишь спустя годы перекочевали в уйму других ЯП.

В Python работа с регулярными выражениями осуществляется с помощью модуля re:
import re

Модуль предоставляет функции и методы для работы с регулярными выражениями, такие как re.search(), re.match(), re.findall() и кучу других.
Но если максимально упростить, модуль делает две вещи:

1). Позволяет создавать шаблоны. Обычные сырые строки с языком регулярных выражений внутри.

Познавательная минутка 🤓
Сырые строки (так же известные как raw string) в Python записываются как обычная строка, в одинарных или двойных кавычках. Но перед открывающей кавычкой ставится буквы r, сокращение от raw. Например сырая строка ниже может использоваться как шаблон для регулярного выражения из примера 3:
r'\b\w+\b'

2). Выбирать из большого текста маленький текст по шаблону.

Всё остальное - крутые навороты, упрощающие жизнь в поисках текста 🧠
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7🤯21
This media is not supported in your browser
VIEW IN TELEGRAM
Всех причастных к международному женскому дню поздравляю с прошедшими праздником 💐

А вот и поздравление с регулярками подоспело:
import re

def congratulate(name):
pattern = r'(?i)\b(женщин\w*|девушк\w*|леди|дам\w*)\b'
if re.search(pattern, name):
return f"С Международным женским днем, {name}!"
else:
return f"С Международным женским днем!"

Обратите внимание на шаблон:
- для поиска без учёта регистра используется (?i);
- чтобы слово было словом, а не частью большого слова, используем \b до и после;
- для учёта любого окончания применяем \w* - любая буква ноль и более раз;
- вертикальная черта | работает как or. Достаточно одного из четырёх совпадений.

Если запустить, получим ожидаемый результат с упоминанием женщин или просто с поздравлением:
>>> congratulate("Дорогие женщины"))
'С Международным женским днем, Дорогие женщины!'
>>> congratulate("Уважаемые господа"))
'С Международным женским днем!'

P.S. Данный шаблон не даёт 100% гарантии 😉
>>> congratulate("Жан-Клод Ван Дамм")
Please open Telegram to view this post
VIEW IN TELEGRAM
👍32🔥1😁1
This media is not supported in your browser
VIEW IN TELEGRAM
Регулярные выражения

Выражение ?P<name> (ага, именно так, с большой P и треугольными скобками) используется для именования групп в регулярных выражениях, что делает код более читаемым и понятным.

Ловите простой пример использования ?P<name>:
import re

text = "Имя: Алексей, Возраст: 32, Город: Москва"

pattern = re.compile(r"Имя: (?P<name>\w+), Возраст: (?P<age>\d+), Город: (?P<city>\w+)")

match = pattern.match(text)
if match:
print("Имя:", match.group('name'))
print("Возраст:", match.group('age'))
print("Город:", match.group('city'))

В этом примере мы используем регулярное выражение с именованными группами для извлечения имени, возраста и города из текста. Функция match.group('name') позволяет получить значение, соответствующее группе с именем 'name'.

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


Открытие номер 1, .groupdict()

Метод groupdict() используется для получения словаря, содержащего именованные группы из последнего успешного совпадения регулярного выражения. Он полезен, когда есть много именованных групп в регулярном выражении и вы хотите получить все значения в виде словаря.

Ловите пример с groupdict():
import re

text = "Имя: Алексей, Возраст: 30, Город: Москва"

pattern = re.compile(r"Имя: (?P<name>\w+), Возраст: (?P<age>\d+), Город: (?P<city>\w+)")

match = pattern.match(text)
if match:
group_dict = match.groupdict()
print(group_dict)

Результатом будет словарь group_dict, где ключами будут имена групп из шаблона pattern, а значениями - соответствующие значения из текста text.

Телеграм ограничивает размер сообщения. Поэтому про открытие номер два, расскажу в следующем посте 😉

✍️ - беру на вооружение
🤯 - как это работает?
🎉 - выходные для отдыха, а не кода
Please open Telegram to view this post
VIEW IN TELEGRAM
8👍3🤯3🎉3
Регулярные выражения. Открытие номер 2

Начало тут

Когда впервые познакомился с шаблоном ?P<name> в регулярках, прочитал в сети старую переписку Гвидо с...

Ага! С кем-то. Лично я запомнил его как Ларри Уолла, автора языка Perl. Но сейчас, при написании поста не смог найти ту самую древнюю переписку.
Если поделитесь ссылкой в комментариях, респект и уважуха. А пока будем считать это байкой старого айтишника. Садитесь поудобнее 😉


Когда Гвидо добавлял в язык Python регулярные выражения, он конечно же взял их из языка Perl. Почему?

Познавательная минутка 🤓
Perl был создан в 1987 году лингвистом Ларри Уоллом. И изначальная идея - язык для работы с текстом. А куда же тексту без регулярных выражений. Всё логично 🤓

Так вот, Гвидо захотел улучшить регулярки в Python. Он написал Ларри письмо, поинтересовался можно ли занять сочетание символов ?P (вопрос, заглавная P)? И Ларри сказал, что никаких планов на связку ?P у него нет.
После официально разрешения Гвидо использовал связку для расширения регулярок, добавил ?P<name>. Теперь он мог обращаться к найденным группам по имени. А заодно и складывать полученные группы в словарь по ключам.

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

Кстати, заглавная P в регулярке означает Python. Гвидо застолбил букву для своего языка. Вдруг регулярное выражение не прижилось бы.
Как показывает история, ?P<name> очень прижилось. И оно шикарно облегчает жизнь превращая объемный текст в словарь нужных данных.

Спасибо, Гвидо 🖖
👍6🔥2👨‍💻1
Несколько раз натыкался на вопросы и статьи про запуска кода по расписанию.

Хочет человек запускать свою функцию в 9:30 и 20:45. А ещё он пишет на Python. И начинаются варианты с time.sleep, с asyncio.sleep. Варианты с отдельными потоками или процессами. Кто-то использует сторонние модули, например schedule. Молодцы, ребята, чего уж. Много кодят ради запусков по расписанию 👍

Познавательная минутка 🤓
Запуск программ по расписанию использовался на компьютерах полсотни лет назад. Уже в 1970-х годах была программа (демон) для запуска других программ по расписанию. Вы когда-то слышали про cron? Это он претерпев несколько изменений запускает код по расписанию более 50 лет

Как вы догадались, для запуска когда по расписанию не нужно изобретать сложные Python костыли и велосипеды. Вводим в терминале crontab -e и добавим пару строк в конец файла:
30 9 * * * python /path/to/project.py
45 20 * * * python /path/to/project.py


Ура! Python файл project будет автоматически запущен дважды в сутки, в 9:30 (строка 1) и в 20:45 (строка 2) 😉

Заметили пустую строку после примера в cron? Как и Python фалы, файл crontab должен заканчиваться пустой строкой. Но в отличии от доброго Python, cron не прощает ошибки. Если пустой строки нет, cron проигнорирует последнюю. Ту, где запуск в 20:45.

P.S. Может ситуацию с последней пустой строкой и пофиксили. Но я за пару десятилетий привык её добавлять. Кому интересно, проверяйте, пишите результат в комментариях ✍️

#bash #crontab
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🔥31
И снова делюсь наболевшим. Улыбок вам и быстрых правок багов 💪😉

P.S. Пруфы из официальной документации

#юмор
😁51👍1
Гвидо ван Россум, создатель языка программирования Python, объявил о разработке собственной операционной системы. Отличительной особенностью новой ОС станет уникальная функция под названием GAL — Global Application Lock, позволяющая запускать за раз только одну программу.

«Мы стремимся к простоте и максимальной эффективности», — заявил ван Россум. «Без необходимости переключаться между задачами пользователи смогут полностью сосредоточиться на одной задаче, избежав отвлекающих факторов».

По словам разработчика, ОС будет идеальной для писателей, кодеров и всех, кто хочет уйти от многозадачности.

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

#юмор #неновости @notnewsgpt
😁4👍2🔥1