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

Синхронное выполнение 📄
По сути любая программа с переменными, ветвлениями, циклами и прочим, где действия выполняются строка за строкой. Классика, где Python создаёт один процесс с одним потоком внутри.

Многопоточное выполнение 🗂
Берём синхронный код и запускаем функцию несколько раз для "параллельного" выполнения. Снова один Python процесс внутри которого несколько потоков очень быстро переключаются между собой. Настолько быстро, что кажется словно работают одновременно. Но задействуется один поток в одном ядре CPU.

Многопроцессорное выполнение 📚
Основной Python процесс создаёт другие Python процессы. Внутри синхронное выполнение кода в одном потоке. Снаружи несколько процессов выполняемых одновременно разными ядрами/процессорами ПК.

Асинхронное выполнение 🔀
Снова один процесс с одним потоком внутри. Но синхронные функции превращаются в асинхронные сопрограммы - coroutine. Корутины работают по очереди, переключаясь между собой. Похоже на многопоточность, но переключаются не потоки, а функции внутри одного потока.
👍7🤯1
В продолжение поста о способах выполнения кода. Немного о том где какой вариант применять

📄 Синхронные решения отлично подходят для небольших, срочных и одноразовых задач. Быстро писать. Легко проводить отладку. Улучшения так же не требуют лишних усилий. И даже если ежечасно парсить сайт и тратить несколько секунд на обработку данных, синхронный код отлично справится с задачей.

🗂 Многопоточные решения создаются для задач с обилием ввода и вывода информации. I/O bound подразумевает ожидание ответов, длительное выполнение запросов и т.п. И пока один поток ждёт свой I/O, другой решает задачу. Тот же пример с парсингом, но не одного, а десятков сайтов одновременно. Быстро по очереди отправляем запросы по одному на поток, а потом обрабатываем в порядке получения ответов.

📚 Многопроцессорные решения нужны для CPU bound задач. Обычно это обработка большого объёма данных, которую можно разбить на части. Например парсим сайт, а он возвращает терабайт в ответ. Каждый процесс обрабатывает свой кусочек терабайта изолировано, а ПК нагружает все ядра процессора. Мы же не зря запустили по одному процессу на каждое ядро CPU.

🔀 Асинхронные решения подходят для I/O bound задач. Стоп! Но ведь потоки для них. Всё верно. Если не придираться к деталям, асинхронный подход можно считать современной альтернативой многопоточных решений. Вполне возможно кто-то из вас сталкивался с потоками в legacy проектах и при обновлении софта менял их на асинхронные корутины.
👍4👀1
Наткнулся на просторах сети на такой мем. Стало любопытно какую же тему любят больше.
Кликните опрос ниже 👇
😁1
Поздравляю всех подписчиков канала с Новым годом! 🎄

Творческих успехов, завершённых 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