Код на салфетке
2.38K subscribers
770 photos
21 videos
2 files
811 links
Канал для тех, кому интересно программирование на Python и не только.

Сайт: https://pressanybutton.ru/
Чат: https://t.me/+Li2vbxfWo0Q4ZDk6
Заметки автора: @writeanynotes

Реклама и взаимопиар: @Murzyev1995
Сотрудничество и др.: @proDreams
Download Telegram
Знаете ли вы, что and и or возвращают не True/False, а сами операнды?

Пишем result = x or y, ждем булево значение, а там объект x или y. Или используем value = a and b для проверки, а в переменной оказывается один из операндов, вместо True/False. Дело тут в том, что and и or в Python не преобразуют результат в bool – они возвращают один из операндов как есть, в зависимости от их истинности.

Простой пример – or возвращает первый истинный операнд:

result = 5 or 10
print(result) # 5, а не True

result = 0 or 10
print(result) # 10

result = None or "default"
print(result) # "default"

result = "" or "fallback"
print(result) # "fallback"


or проверяет первый операнд – если он правдив (не 0, не None, не пустая строка), то возвращает его. Иначе – вернет второй операнд, не проверяя его на истинность.

С and работает наоборот – он возвращает первый ложный или просто последний операнд:

result = 5 and 10
print(result) # 10, а не True

result = 0 and 10
print(result) # 0

result = "hello" and "world"
print(result) # "world"

result = [] and "never evaluated"
print(result) # []


and проверяет первый операнд – если он ложный, возвращает его сразу. Если истинный, возвращает второй операнд как есть, не преобразуя в bool.

Это позволяет делать короткие условные выражения:

# Установка значения по умолчанию
name = input("Имя: ") or "Аноним"
print(f"Привет, {name}")
# Если ввели пустую строку, name = "Аноним"

# Безопасное обращение к атрибуту
config = None
debug = config and config.get('debug')
print(debug) # None, без ошибки
# Если config = None, второй операнд не вычисляется

# Выбор первого непустого значения
first_name = ""
last_name = "Петров"
display_name = first_name or last_name or "Неизвестно"
print(display_name) # "Петров"


Второй операнд and и or не вычисляется если результат уже известен (short-circuit evaluation).

Особенно опасно в словарях и списках:

# Устанавливаем значение по умолчанию
data = {'name': ''}
processed = data.get('name') or 'Unknown'
print(processed) # 'Unknown'

# Но если значение может быть 0
scores = {'player1': 0}
score = scores.get('player1') or 100
print(score) # то получится 100 – настоящий 0 утерян

# Правильно через get с дефолтным значением
score = scores.get('player1', 100)
print(score) # 0


Пустая строка и 0 являются ложными, поэтому or их пропускает, хотя это валидные значения.

Вот где это полезно – ленивая инициализация:

class Cache:
def __init__(self):
self._data = None

def get_data(self):
# Инициализируем только при первом обращении
self._data = self._data or self._load_expensive_data()
return self._data

def _load_expensive_data(self):
print("Loading...")
return {'key': 'value'}

cache = Cache()
print(cache.get_data()) # Loading... {'key': 'value'}
print(cache.get_data()) # {'key': 'value'} - без Loading


or проверяет кеш, и если он None, вызывает дорогую функцию только один раз.

Операторы and и or возвращают сами операнды, а не True/False. or возвращает первый истинный операнд или последний, and возвращает первый ложный, либо последний. Это полезно для значений по умолчанию и условных выражений, но может создать баги если не учитывать что пустая строка, 0 или пустой список тоже ложны.

Код на салфетке x Кусочки кода
🔥1422
Всем доброго вечера пятницы!

«Побег из плена» (2025)

Это военная драма о британском лётчике Джеймсе Райте, который в 1942 году попадает в японский лагерь на Филиппинах. Жизнь там сводится к выживанию и подчинению жестоким правилам охраны.

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

Фильм про честь, страх и готовность рискнуть всем ради свободы. Зайдёт, если любите военное кино, лагерные истории и жёсткие, но эмоциональные сюжеты.

Приятного просмотра!
🔥41
Всем привет!

Как многие из вас знают, я преподаю и менторю в IT-академии Lad. Решили начать февраль активно: запускаем серию открытых практикумов по разным IT-направлениям.

Разумеется, один из них веду я. Тема — «Разработка Telegram-бота с ИИ».

Что будем делать? Не будем грузить вас сложной архитектурой и «умными» терминами. Моя цель — показать то, что реально работает. Мы напишем бота, которого сможет повторить любой новичок, сразу протестировать и получить первый результат в Python-разработке.

Приходите кодить и общаться 8 февраля в 13:00.


Если Python — не единственное, что вам интересно, очень советую заглянуть на эфиры к моим коллегам (это реально крутые практики):
• Frontend-разработка
• UX/UI-дизайн
• Backend на JavaScript
• Управление проектами (PM)

Регистрируйтесь по ссылке и выбирайте интересные темы!

Кстати, новый поток моего курса стартует уже в феврале. Если практикума вам покажется мало и захочется погрузиться в профессию полностью — сейчас самое время.

P.S. По моему личному промокоду press_any_button действует скидка 10 000 рублей на обучение. Он вечный, но лучше успеть к старту группы!
🔥114👍21😱1
Код на салфетке pinned a photo
This media is not supported in your browser
VIEW IN TELEGRAM
👨‍💻🔥Тимлид поневоле: как не задушить команду и не выгореть самому

В IT любят красивые слова про "интеллектуальный капитал". Но на деле многими командами управляют как бригадой на заводе. Отчет каждые 15 минут, вопрос "почему задача висит три часа" и прочие радости микроменеджмента. Удаленка эти проблемы только подсветила.

Если вчера вы были крутым разработчиком, а сегодня проснулись тимлидом - вам предстоит сложная трансформация. Иначе вы рискуете стать тем самым начальником, от которого сбегают сеньоры.

➡️➡️⤴️⤴️🔄⤴️⤴️➡️🔘

🥰 Почему ломаются заводские настройки

Главная ошибка новичка - непонимание времени. Пол Грэм (прим. ред.: американский предприниматель, программист, эссеист, известный сторонник и пропагандист использования языка программирования Lisp) называл это конфликтом расписаний.

У менеджера день нарезан на часовые слоты. Переключиться между задачами каждые полчаса для него нормально. Поговорил с заказчиком, ответил на почту. Он продуктивен именно в переключении.

У Творца (разработчика) все иначе. Ему нужны длинные куски времени, часа по четыре минимум. Чтобы спроектировать архитектуру, надо погрузиться в контекст. Одно "быстрое совещание на 15 минут" в середине дня не просто отнимает время. Оно разбивает день на два бесполезных куска и выбивает человека из потока.

На удаленке начальники теряют визуальный контроль и начинают паниковать, обрывая мессенджеры.
🏃‍♀️ Совет: Хотите результата - учитесь асинхронности. Не ждите мгновенного ответа, если прод не горит. Дайте людям работать.


😑 Когда включать диктатора

В учебниках стили управления раскладывают по полочкам, но в жизни приходится постоянно менять маски.
🆓Диктатор. Нужен, когда "упал прод" и бизнес теряет деньги. Здесь демократия вредна, нужны жесткие команды.
🆓🟡Лидер-слуга. Работает в спокойное время. Вы перестаете быть надсмотрщиком и становитесь бульдозером. Ваша задача - расчищать путь и убирать бюрократию.

Используйте ситуационное лидерство. Новичку нужны инструкции. Сомневающемуся - поддержка. А профи нужно просто делегировать полномочия и отойти в сторону.

😇 Топ-3 ошибки выжившего

Переход из инженеров в менеджеры - всегда стресс. Раньше вы отвечали за предсказуемый код, теперь за иррациональных людей.

🆓0️⃣ Микроменеджмент от страха. Кажется, если не проверить каждую строку, все рухнет. Вы начинаете стоять над душой, порождая у команды выученную беспомощность.
🆓Лечим так: Правило 30/70. Если вы техлид, тратьте на менеджмент 30% времени, остальное на технику. Не пытайтесь кодить за всех.

🆓1️⃣ Отказ от личных встреч (1:1). Многие считают их пустой тратой времени. Но обычно сотрудники приходят сами уже с заявлением об увольнении.
🆓Лекарство: Регулярные 1:1 нужны не для статусов по задачам, а для разговора о человеке. Закройте рот и слушайте, это время сотрудника.

🆓2️⃣ Созвоны ради ритуала. Ежедневные стендапы часто превращаются в бубнеж сонных людей о вчерашних задачах.
🆓Лекарство: Если команда сработанная, переведите отчеты в текстовый чат. Введите "дни тишины" без совещаний.


➡️➡️⤴️⤴️🔄⤴️⤴️➡️🔘

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

Узнали в описании себя или своего босса? 😉


Код на салфетке
x Мозг в данных
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥9💯1
Привет, друзья! 👋

Еще одна неделя позади, и у нас накопилось много интересного контента. Вот самые полезные и увлекательные материалы, которые мы выбрали для вас на этой неделе:

📋 Новое на канале:

🔄 Понедельник, 19.01.2026Дайджест

🤖 Вторник, 20.01.2026 — Знаете ли вы, что and и or возвращают не True/False, а сами операнды?

🎬 Пятница, 23.01.2026Пятничный кинорелакс

⚙️ Воскресенье, 25.01.2026 — Приглашение на практикум по Python

🤖 Воскресенье, 25.01.2026 — Тимлид поневоле: как не задушить команду и не выгореть самому


🔗 Будьте ближе к нам:

🌐 Читайте полные статьи на сайте

💬 Присоединитесь к обсуждению в чате

Спасибо, что остаетесь с нами! Надеемся, что эти материалы будут вам полезны. Удачи в новой неделе! 🚀

#дайджест #код #python #полезное #код_на_салфетке
🔥6
Знаете ли вы, что copy.copy() не копирует вложенные объекты?

Копируете список со вложенными списками через copy.copy(), меняете элемент внутреннего списка в копии – а он меняется и в оригинале. Дело в том, что copy.copy() делает shallow copy – копирует только верхний уровень структуры, а вложенные изменяемые объекты остаются общими между оригиналом и копией.

Простой пример с мутацией вложенного списка:

import copy

original = [[1, 2, 3], [4, 5, 6]]
shallow = copy.copy(original)

# Изменяем содержимое вложенного списка
shallow[0][0] = 999

print(original) # [[999, 2, 3], [4, 5, 6]]
print(shallow) # [[999, 2, 3], [4, 5, 6]]
# Оба изменились: внутренние списки – один объект


Проверим через id():

import copy

original = [[1, 2], [3, 4]]
shallow = copy.copy(original)

print("Внешний список:", id(original), "vs", id(shallow))
# Разные объекты

print("Внутренний [1,2]:", id(original[0]), "vs", id(shallow[0]))
# Один и тот же объект


Важный нюанс: перезапись не равно изменение. Если заменить весь вложенный список, а не его элемент – оригинал не пострадает:

original = [[1, 2], [3, 4]]
shallow = copy.copy(original)

shallow[0] = [9, 9] # Перезаписываем элемент, а не меняем содержимое
print(original) # [[1, 2], [3, 4]] – без изменений
print(shallow) # [[9, 9], [3, 4]]


Для полного копирования всех уровней нужен deepcopy:

import copy

original = [[1, 2, 3], [4, 5, 6]]
deep = copy.deepcopy(original)

deep[0][0] = 999
print(original) # [[1, 2, 3], [4, 5, 6]]
print(deep) # [[999, 2, 3], [4, 5, 6]]


copy.copy() создает новый контейнер, но делится вложенными изменяемыми объектами. С неизменяемыми вложенными объектами (числа, строки, кортежи) shallow copy работает безопасно. Для полного независимого копирования используйте copy.deepcopy().

Код на салфетке x Кусочки кода
🔥863
Kawai-Focus 2.2: Python-бинарник в Tauri — проблемы и альтернативы
Автор: Eugene Kaddo

Данная статья посвящена:
- Проблемам с текущим бинарником Python в Tauri проекте;
- Поиску лучшего архитектурного решения для бекенд логики;


Читать статью на сайте
Читать статью на Хабр

Поддержать проект через YooMoney
Поддержать проект через Tribute в Telegram
Поддержать проект через наш Telegram-бот

#Python #JS #Open_source #Наши_Open_Source_проекты #Rust #Kawai-Focus #Tauri #Ionic #Vue.js
1🔥4❤‍🔥1
Привет, любители советского кино!

«Курьер» (1986)

Этот фильм — история 17‑летнего Ивана, который после провала экзаменов становится курьером и случайно попадает в интеллигентную среду. Одна доставка — и его жизнь пересекается с семьёй профессора Кузнецова.

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

«Курьер» — фильм о взрослении, одиночестве и попытке понять своё место в жизни. Коротко, просто и очень по‑человечески — поэтому он до сих пор цепляет.

Приятного просмотра!
🔥12👎1
Привет, друзья! 👋

Еще одна неделя позади, и у нас накопилось много интересного контента. Вот самые полезные и увлекательные материалы, которые мы выбрали для вас на этой неделе:

📋 Новое на канале:

🔄 Понедельник, 26.01.2026Дайджест

🤖 Вторник, 27.01.2026 — Знаете ли вы, что copy.copy() не копирует вложенные объекты?

🎬 Пятница, 30.01.2026Пятничный кинорелакс

Пятница, 30.01.2026 — Kawai-Focus 2.2: Python-бинарник в Tauri — проблемы и альтернативы


🔗 Будьте ближе к нам:

🌐 Читайте полные статьи на сайте

💬 Присоединитесь к обсуждению в чате

Спасибо, что остаетесь с нами! Надеемся, что эти материалы будут вам полезны. Удачи в новой неделе! 🚀

#дайджест #код #python #полезное #код_на_салфетке
🔥41
Знаете ли вы, что kill -9 не всегда убивает процесс?

Запускаем kill -9 <PID>, ждем что процесс будет убит – а он продолжает висеть в ps aux. Пробуем еще раз от рута, с разными сигналами – ничего не помогает. Проблема здесь в том, что процесс в статусе D (uninterruptible sleep) просто игнорирует все сигналы, включая SIGKILL. Это происходит потому что процесс находится в системном вызове ядра и ждет завершения I/O операции – пока ядро не закончит работу, процесс не может быть убит.

Представим себе такой неубиваемый процесс:

# Запустим что-то с подвисшим NFS
ls /mnt/broken_nfs &

# Посмотрим на статус процесса
ps aux | grep ls
# USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
# user 1234 0.0 0.1 2345 678 ? D 10:30 0:00 ls /mnt/broken_nfs

# D в STAT означает тот самый uninterruptible sleep
# Попробуем его убить
kill -9 1234

# Но процесс все еще жив:
ps aux | grep 1234
# kill -9 не сработал


Статус D означает что процесс в системном вызове ядра и не может быть прерван. Обычно это операции ввода-вывода – чтение с диска, сетевой запрос, ожидание блокировки.

Но мы можем увидеть ВСЕ процессы в D-состоянии:

# Через ps aux
ps aux | awk '$8 ~ /D/ { print $0 }'

# Или через top/htop
top
# Прожимаем 'o' для фильтра, вводим: S=D
# Покажутся только D-процессы

# Смотрим stack trace процесса
cat /proc/1234/stack
# [<0>] wait_on_page_bit+0x123/0x456
# [<0>] read_pages+0x234/0x567
# [<0>] __do_page_cache_readahead+0x345/0x678
# Будет видно что процесс ждет чтения страницы


Stack trace показывает где именно процесс застрял в ядре. Обычно это функции работы с файловой системой, сетью или устройствами.

Процесс в D можно убить, но только через перезагрузку или починив то, что он ждет:

# Для NFS – размонтировать принудительно
umount -f /mnt/nfs
# Или ленивое размонтирование
umount -l /mnt/nfs


Процессы будут убиты, когда NFS отвалится; для сломанного диска – только перезагрузка.

Почему SIGKILL не сработает? Потому что сигналы обрабатываются только когда процесс возвращается в user space. D-процесс находится в kernel space системного вызова, а ядро не проверяет сигналы пока вызов не завершится. Но мы можем увидеть где процесс застрял:

cat /proc/1234/wchan
# wait_on_page_bit
# Процесс ждет страницу в памяти


Процессы в состоянии D (uninterruptible sleep) не реагируют на сигналы, включая SIGKILL. Они застревают в системных вызовах ядра, обычно при I/O операциях с зависшими устройствами (NFS, сломанный диск, RAID). Убить такой процесс можно только решив проблему ввода-вывода – размонтировав файловую систему, отключив устройство или через перезагрузку. Проверяйте статус процесса через ps – если в колонке STAT стоит значение D – значит kill -9 не поможет.

Код на салфетке x Кусочки кода
🔥11👍51
Всем доброго вечера пятницы!

«Искусство самообороны» (2019)

«Искусство самообороны» — чёрная комедия о тихом бухгалтере Кейси, которого жестоко избивает банда мотоциклистов. Вместо пистолета он выбирает додзё каратэ и попадает под влияние харизматичного, но очень токсичного сенсея.

Тренировки постепенно превращают его из забитого «офисного мыша» в агрессивного фаната насилия, а додзё — в секту с ночными уроками, жестокими правилами и мрачными секретами. Кейси шаг за шагом узнаёт правду о сенсее, преступлениях школы и своём собственном страхе.

Фильм одновременно высмеивает культ «мужественности на стероидах» и показывает, как легко хрупкого человека сломать под видом «закалки характера». Подойдёт, если любите странное, неловкое кино с юмором на грани и неожиданно жёсткой развязкой.

Приятного просмотра!
🔥3👍21
Всем привет!

Уже завтра в 13:00 МСК, мы встречаемся на практикуме по Python!

Что будем делать?
В прямом эфире, вместе со мной, вы:
👉 Напишете код Telegram-бота.
👉 Подключите к нему искусственный интеллект GigaChat.
👉 Задеплоите его, чтобы он работал.

И всё это — за одну встречу.
Даже если вы никогда раньше не программировали, у вас получится рабочий проект. Это лучший способ понять, подходит ли вам Python.

Как попасть?
Эфир закрытый. Чтобы получить доступ, нужна регистрация:
Зарегистрироваться

ВАЖНО: Подготовка к эфиру
Это не вебинар "послушать под чай", а практикум. Чтобы мы успели всё сделать, нужно подготовить рабочее окружение заранее.

Сразу после регистрации вы попадете в чат участников. Там в закрепе лежит инструкция. Пожалуйста, выполните её сегодня вечером, чтобы завтра в 13:00 мы сразу начали творить магию, а не устанавливать программы.

До встречи завтра в эфире! 🚀
🔥82❤‍🔥2👏21
Привет, друзья! 👋

Еще одна неделя позади, и у нас накопилось много интересного контента. Вот самые полезные и увлекательные материалы, которые мы выбрали для вас на этой неделе:

📋 Новое на канале:

🔄 Понедельник, 02.02.2026Дайджест

🤖 Вторник, 03.02.2026 — Знаете ли вы, что kill -9 не всегда убивает процесс?

🎬 Пятница, 06.02.2026Пятничный кинорелакс

⚙️ Суббота, 07.02.2026 — Практикум по Python


🔗 Будьте ближе к нам:

🌐 Читайте полные статьи на сайте

💬 Присоединитесь к обсуждению в чате

Спасибо, что остаетесь с нами! Надеемся, что эти материалы будут вам полезны. Удачи в новой неделе! 🚀

#дайджест #код #python #полезное #код_на_салфетке

😼 @napkincode
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥62
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥12
Всем привет!

В это воскресенье прошёл практикум по Разработке Telegram-бота с ИИ.

На практикуме было очень активно! Большинство зрителей повторяли вместе со мной. У кого-то были трудности, но мы их решали вместе. Также было море интересных (а порой и внезапных) вопросов!

Запись практикума доступна на YouTube: смотреть

Буду рад, если лайкнете видео и напишете комментарий как вам практикум. Жду ваши отзывы.

P.S. И подписывайтесь на наш канал, надо его оживлять и делать видео! https://www.youtube.com/@codeonanapkin

😼 @napkincode
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥12👍4👏4🍾3❤‍🔥2
Знаете ли вы, что > затирает файл до выполнения команды?

Бывает, нужно изменить файл на месте, напишешь cat file.txt > file.txt – а файл пустой. Дело в том, что Shell открывает файл для записи и обрезает его в ноль до того, как запустится команда. К моменту когда cat пытается его прочитать, в файле уже ничего нет.

Посмотрим:

echo "Hello World" > test.txt
cat test.txt
# Hello World

cat test.txt > test.txt
cat test.txt
# (пусто - ничего не выводит, файл 0 байт)


Файл обнулился до того как cat успел его прочитать. То же самое с любой командой – grep pattern file.txt > file.txt или sort file.txt > file.txt дадут пустой файл:

1. Shell видит > file.txt и открывает файл для записи
2. Файл обрезается до 0 байт
3. Команда запускается и читает уже пустой файл

Правильно – сделать временный файл:

echo -e "3\n1\n2" > numbers.txt
sort numbers.txt > temp.txt && mv temp.txt numbers.txt
cat numbers.txt
# 1
# 2
# 3


Shell обрабатывает редиректы до запуска команды – файл обнуляется в момент открытия для записи, еще до выполнения. Для модификации на месте используйте временный файл или утилиты с флагом -i типа sed -i.

Код на салфетке x Кусочки кода
🔥8👍5👏1
Ну штош! Прошёл почти месяц и вот оно, свершилось!

Библиотеку добавили на страницу со сторонними решениями. И не только мою, по всей видимости, раньше тут было меньше.

https://yookassa.ru/developers/using-api/using-sdks#community
🔥14👍2
Привет, любители мрачной антиутопии!

«Бегущий человек» (1987)

«Бегущий человек» — бодрый антиутопический боевик с Арнольдом Шварценеггером, который до сих пор смотрится актуально. Действие перенесено в мрачное будущее, где военная диктатура держит страну под контролем с помощью жестокого телешоу: заключённых бросают в смертельную игру, а за ними охотятся яркие, карикатурные киллеры-звезды эфира.

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

Пафосные фразы, гротескные злодеи, критика ТВ и власти — тот редкий случай, когда под «олдскульным» экшеном скрывается довольно злая сатира.

Приятного просмотра!

😼 @napkincode
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥101