Код на салфетке
2.21K subscribers
747 photos
15 videos
2 files
790 links
Канал для тех, кому интересно программирование на Python и не только.

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

Реклама и взаимопиар: @Murzyev1995
Сотрудничество и др.: @proDreams
Download Telegram
Что выведет этот код? №45

Задача:
Вы работаете над обработкой данных из внешнего источника. В процессе обработки требуется отфильтровать данные на основе сложного условия. На просторах StackOverflow вы нашли следующий код для проверки логики.

Внимательно изучите код и ответьте: что выведет этот код?
🔥3🤯2
Что выведет код с изображения? №45
Anonymous Quiz
23%
[1, 2, 3, 4, 5]
3%
[1, 2, 3]
35%
[4, 5]
26%
[]
13%
TypeError
🤔2
Вчера мы предложили вам довольно хитрую задачу, которая требовала внимательного подхода. Несмотря на её видимую простоту, код оказался обманчиво сложным. Проголосовало 23 человека, и только 4 из них справились правильно. Разберем всё подробно.

Задача:
Вы работаете над обработкой данных из внешнего источника. В процессе обработки требуется отфильтровать данные на основе сложного условия. На просторах StackOverflow вы нашли следующий код для проверки логики.

Внимательно изучите код и ответьте: что выведет этот код?

Код задачи:

from typing import Any  

def filter_data(
data: list[Any], condition: Any
) -> list[Any]:
def matches_condition(item):
nonlocal condition
if callable(condition):
condition = item
return False
return condition == item

return [
item
for item in data
if matches_condition(item)
]

data = [1, 2, 3, 4, 5]
condition = lambda x: x > 3

result = filter_data(data, condition)
print(result)



Разбор:
На первый взгляд задача кажется достаточно простой: нужно отфильтровать список data, основываясь на переданном условии condition. Однако несколько деталей делают этот код действительно коварным.

1. Что делает функция `matches_condition`?
- Проверяет, является ли condition вызываемым объектом (например, функцией).
- Если condition — вызываемый объект, оно перезаписывается текущим элементом item, а функция возвращает False.
- Если condition — не вызываемый объект, то возвращается результат сравнения condition == item.

2. Что происходит внутри списка?
Список создается с помощью вхождения:
[item for item in data if matches_condition(item)]


Для каждого элемента item из data вызывается matches_condition.

3. Перезапись переменной `condition`:
При первом вызове matches_condition, condition — это функция (lambda). Для первого элемента списка (1) происходит следующее:
- condition заменяется на 1.
- matches_condition возвращает False.

4. Дальнейшие итерации:
Начиная со второго элемента списка, condition уже не является функцией. Теперь это число, и на каждой итерации проверяется равенство condition == item.

Таким образом:
- На первом шаге 1 != 2, проверка завершается.
- На втором шаге 1 != 3.
- И так далее.


Что здесь происходит?
1. `condition` на старте содержит lambda-функцию, определяющую условие: x > 3.

2. `nonlocal condition` позволяет изменять значение переменной condition, объявленной в функции-родителе, прямо во время работы функции.

3. Логика проверки в `matches_condition`:
- Если condition — функция (то есть callable), она заменяется на текущий элемент item, а элемент исключается из итогового списка (возвращается False).
- Если condition уже не функция, проверяется равенство condition == item.

4. Итоговый процесс фильтрации:
Каждый элемент списка проверяется с помощью matches_condition. Поскольку condition меняется уже на первом шаге, последующие проверки будут отличаться от ожидаемого поведения.


Верный ответ: []


Почему ответ — пустой список?

Ключевую роль играет изменение переменной `condition` на первом шаге. Изначально это была лямбда-функция, которая после первой итерации заменяется на число. В итоге фильтрация ломается: condition больше не проверяет изначальное условие x > 3, а просто сравнивает элементы с числом 1. Так как ни один элемент не равен 1, результатом становится пустой список.

Всегда обращайте внимание на использование замыканий, изменяемых переменных и ключевых слов, таких как nonlocal. Они могут существенно повлиять на выполнение программы.
🔥3🤩1
Что нового в Telegram Bot API 8.0?
Автор: Иван Ашихмин

Вышло масштабное обновление Telegram Bot API 8.0, которое стало одним из крупнейших за последнее время. Оно добавило сразу несколько революционных возможностей для Mini Apps и ботов, включая платные подписки, полноэкранный режим, и многое другое. Подробности в посте.


Читать пост в Telegram

Пост на сайте
Поддержать проект на Boosty
Поддержать проект в Telegram

#Telegram #Bot_API #новости #aiogram #изменения #боты
🔥6🥱2
Привет, друзья!

Прошла еще одна неделя, и у нас накопилось много интересных материалов: статьи, новости и полезные советы. Вот наш недельный дайджест:

Понедельник (11.112024) Дайджест за предыдущую неделю

Вторник (12.11.2024) Хотите узнать, как использовать генераторы в Python для эффективной работы с большими данными?

Среда (13.11.2024)

Четверг (14.11.2024) Вхожу в IT - telegram-bot (часть 2)

Пятница (15.11.2024) Пятничный кинорелакс

Суббота (16.11.2024) Задача

Воскресенье (17.11.2024) Текстовый разбор задачи и Что нового в Telegram Bot API 8.0?


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

С уважением,
Команда канала "Код на салфетке".

#дайджест #материалы #новости #код_на_салфетке
👍3🔥2
Знаете ли вы разницу между deep copy и shallow copy в Python?

Поверхностное и глубокое копирование объектов в Python различается по тому, как они обрабатывают вложенные объекты:

- Поверхностное копирование создает новый объект и сохраняет ссылки на вложенные объекты. Подходит для копирования объектов с иммутабельными вложенными элементами.
- Глубокое копирование создает полностью независимую копию объекта с вложенными элементами. Полезно при необходимости полностью отделить копию от оригинала.

import copy

original = [1, [2, 3], 4]
shallow_copied = copy.copy(original)
deep_copied = copy.deepcopy(original)

original[1][0] = 'изменено'
print(original) # [1, ['изменено', 3], 4]
print(shallow_copied) # [1, ['изменено', 3], 4] — вложенный список изменился
print(deep_copied) # [1, [2, 3], 4] — сохранено исходное состояние


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

Код на салфетке x Кусочки кода
🔥7
Python-проект в EXE-файл и обфускация кода
Автор: Иван Ашихмин

В этом посте познакомимся с инструментами, позволяющими превратить Python-проект в exe-файл, а также узнаем, что такое обфускация кода.


Читать пост в Telegram

Пост на сайте
Поддержать проект на Boosty
Поддержать проект в Telegram

#Гайды #Полезные_инструменты #защита #pyinstaller #python_minifier #обфускация #компиляция #nuitka #pyarmor #exe
👍4🤯2🔥1🤩1
Приветствую, друзья!

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

Фильм: Не говори никому

Год: 2024

Отдыхая в Италии, переехавшие в Лондон американцы Бэн и Луиз с дочерью знакомятся с семьёй британцев. По возвращении домой они получают от новых знакомых приглашение погостить в их загородном доме. Вскоре обещавший быть приятным отдых становится напряжённым — хотя Бэн находит оправдания странному поведению хозяев, у Луиз они вызывают всё больше отторжения.

Устраивайтесь поудобнее. Всем приятного просмотра!
🔥5
Приветствую, друзья!

Мы всё ещё находимся в поисках авторов на наш канал и сайт.

Писать код не то же самое, что объяснять его. В программировании есть множество практик, каких-то личных "лайф-хаков" и наработок, которыми можно и нужно делиться с новичками.

Приглашаем всех, кто хочет раскрыть себя как:
- Автор статей на сайт и канал.
- Автор рубрики на канал.
- Автор активностей (задачи/опросы) на канал.

Для авторов у нас есть памятка с основными требованиями и рекомендациями.

Если заинтересовались, пишите @proDreams
🔥42
Привет, друзья!

Прошла еще одна неделя, и у нас накопилось много интересных материалов: статьи, новости и полезные советы. Вот наш недельный дайджест:

Понедельник (18.112024) Дайджест за предыдущую неделю

Вторник (19.11.2024) Знаете ли вы разницу между deep copy и shallow copy в Python?

Среда (20.11.2024)

Четверг (21.11.2024) Python-проект в EXE-файл и обфускация кода

Пятница (22.11.2024) Пятничный кинорелакс

Суббота (23.11.2024)

Воскресенье (24.11.2024) Мы ищем авторов

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

С уважением,
Команда канала "Код на салфетке".

#дайджест #материалы #новости #код_на_салфетке
🔥4👍1
Хотите разобраться в основах сетей Docker и как связывать контейнеры?

В Docker есть несколько способов организовать сеть между контейнерами, основные из которых:

- bridge (по умолчанию): создает изолированную сеть для контейнеров на одном хосте.
- host: контейнер использует сетевой стек хост-машины.
- overlay: связывает контейнеры на разных хостах (для Docker Swarm).

docker network create mynetwork

docker run -d --name web --network mynetwork djangoapp
docker run -d --name db --network mynetwork postgres

Теперь контейнеры "дружат" между собой и в djangoapp можно настроить подключение к базе данных:
import psycopg2

conn = psycopg2.connect(
host='db',
database='mydb',
user='user',
password='password'
)

Это упрощает конфигурацию и позволяет контейнерам общаться друг с другом без явного указания IP-адресов. А для просмотра сетей и их подключения используйте:
docker network ls
docker network inspect mynetwork


Код на салфетке x Кусочки кода
🔥63👍1👏1
Неделя IT-донора: масштабируем добро

С 2 по 7 декабря пройдёт девятая акция IT-донор. Это социальный проект Artsofte. Его цель — создать донорское сообщество из специалистов IT-отрасли, которые готовы сдавать кровь. Идея сплотила комьюнити: проект стал федеральной акцией, привлёк более 650 IT-компаний и 40 Министерств.

В прошлую акцию:

❤️ Зарегистрировалось более 2600 добровольцев из 200 городов России;
❤️ Сдали почти 500 литров крови, которые помогли спасти жизни людей со всей России.

И это не предел — ведь скоро стартует декабрьская акция IT-донор.

Как участвовать в акции?

1. Регистрируйтесь через чат-бот IT-донора до 7 декабря включительно;
2. Приходите с 2 по 7 декабря сдавать кровь на станцию переливания в вашем городе. Найти ближайшую к вам станцию можно здесь.

Подробнее о неделе добра и о правилах участия в акции можно прочесть на сайте проекта.

А если у вас ещё остались вопросы, задавайте их в чате сообщества доноров из IT.
🔥6👍3👏3
Бесплатный аналог ChatGPT на своём ПК
Автор: Иван Ашихмин

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


Читать пост в Telegram

Пост на сайте
Поддержать проект на Boosty
Поддержать проект в Telegram

#ChatGPT #Гайды #Полезные_инструменты #AI #Квантированные_модели #OpenAI #LLM #GigaChat #GGUF #ИИ #Hugging_Face #YandexGPT
🔥7
Приветствую!

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

Фильм: Район №9

Год: 2009

Более 20 лет назад инопланетяне установили первый контакт с Землей. Люди были готовы ко всему — от враждебного вторжения до невероятного технологического прорыва. Ни того, ни другого не произошло. Пришельцы оказались беженцами со своей собственной планеты, и пока мировое сообщество решало, что с ними делать дальше, для них был организован временный лагерь в южноафриканском Районе N9.

Приятного просмотра!
👍3🔥3
Что выведет этот код? №46

Задача:
Вы работаете над оптимизацией обработки входящих данных. Для упрощения написания условий фильтрации вы решили использовать вложенные функции и модификацию списка в процессе его обработки. Коллега предложил свой вариант решения.

Посмотрите на код и скажите, что он выведет?
🔥4
Что выведет код с изображения? №46
Anonymous Quiz
25%
[1, 3, 5]
6%
[0, 2, 4, 1, 3, 5]
11%
[1, 3, 5, 0, 2, 4]
14%
[1, 2, 3, 4, 5, 6]
44%
IndexError
🔥4
Вчера мы предложили вам довольно простую задачу, в котором за, казалось бы, сложными операциями, скрывается сама простая ошибка. Задачу решило из проголосовавших человек. Давайте резберём правильный ответ.

Задача:
Вы экспериментируете с оптимизацией обработки данных. В представленном коде для фильтрации списка чисел используется вложенная функция и модификация самого списка во время его обработки. Цель задачи — понять, как работает данный код, и выяснить, какой результат будет выведен на экран.

Код задачи:

def process_data(data: list[int]) -> list[int]:  
def modify_and_filter():
for i in range(len(data)):
if data[i] % 2 == 0:
data.pop(i)
yield i

indices = list(modify_and_filter())
return indices + data


data_lst = [1, 2, 3, 4, 5, 6]
result = process_data(data_lst)
print(result)



Разбор кода
Давайте разберём этот код построчно и посмотрим, что происходит.

Функция process_data
Это основная функция, принимающая список целых чисел data и возвращающая обработанный результат.

Вложенная функция modify_and_filter
Эта функция должна:

1. Проходить по индексам списка data.
2. Проверять, является ли элемент чётным.
3. Если элемент чётный:
- Удалять его из списка (data.pop(i)).
- Возвращать индекс удалённого элемента (с помощью yield).

Ключевой момент: modify_and_filter — это генератор, так как она использует yield. Вызов этой функции не выполняет её код сразу, а создаёт генераторный объект, выполнение которого начинается только при итерации.

Цикл for i in range(len(data))
Цикл проходит по индексам от 0 до len(data) - 1. Внутри цикла вызывается data[i] для проверки условия.

Проблема: Во время работы цикла список data модифицируется. Это влияет на длину списка и смещение элементов, что приводит к несогласованности индексов.

Удаление элемента data.pop(i)
Удаление элемента приводит к изменению длины списка и смещению индексов остальных элементов. Например, если удалить элемент с индексом 1, то элемент с индексом 2 станет на место элемента 1, а длина списка уменьшится.

Генератор возвращает индексы
Функция modify_and_filter возвращает индексы удалённых элементов в процессе итерации.

Возврат результата
Функция process_data создаёт список из всех возвращённых генератором индексов (indices) и объединяет его с текущим состоянием списка data.

Правильный ответ: IndexError

Почему возникает ошибка IndexError?
Рассмотрим, что происходит при выполнении программы:

1. data_lst = [1, 2, 3, 4, 5, 6].
2. Вызов process_data(data_lst) запускает modify_and_filter.
3. Внутри генератора:
- На первой итерации i = 0, проверяется data[0] (значение 1). Условие не выполнено, идёт следующая итерация.
- На второй итерации i = 1, проверяется data[1] (значение 2). Условие выполнено:
- Удаляется data[1] (pop(1)), список становится [1, 3, 4, 5, 6].
- Возвращается i = 1.
- Следующая итерация пытается проверить data[2], но из-за удаления индексы изменились: на месте data[2] сейчас стоит 4, а длина списка уменьшилась. Попытка доступа к несуществующему индексу приводит к IndexError.

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

1. Не модифицировать список внутри цикла, итерирующегося по нему.
2. Использовать копию списка или собирать данные для изменения в отдельную структуру.

Модификация списка — распространённая ошибка новичков, но с пониманием устройства циклов и индексов её легко избежать.
🔥32
Привет, друзья!

Прошла еще одна неделя, и у нас накопилось много интересных материалов: статьи, новости и полезные советы. Вот наш недельный дайджест:

Понедельник (25.112024) Дайджест за предыдущую неделю

Вторник (26.11.2024) Хотите разобраться в основах сетей Docker и как связывать контейнеры?

Среда (27.11.2024)

Четверг (28.11.2024) Бесплатный аналог ChatGPT на своём ПК

Пятница (29.11.2024) Пятничный кинорелакс

Суббота (30.11.2024) Задача

Воскресенье (01.12.2024) Разбор задачи

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

С уважением,
Команда канала "Код на салфетке".

#дайджест #материалы #новости #код_на_салфетке
🔥3
Хотите узнать, как использовать SElinux для повышения безопасности в Linux?

Security-Enhanced Linux (SELinux) предоставляет механизм принудительного контроля доступа (MAC), который ограничивает права процессов и пользователей.

Проверка статуса SElinux:
sestatus

Изменение режима работы:
sudo setenforce Permissive  # или Enforcing


Создание пользовательской политики:
1. Запустите приложение и соберите ошибки SElinux в /var/log/audit/audit.log
2. Создайте модуль политики:
sudo audit2allow -a -M mypolicy

3. Установите модуль:
sudo semodule -i mypolicy.pp


- audit2allow
автоматически генерирует правила на основе логов (генерируемые правила audit2allow могут быть слишком широкими, поэтому их важно анализировать перед применением)
- semodule управляет модулями политик

Важно помнить, что хоть SElinux и помогает предотвратить несанкционированный доступ и повышает общую безопасность системы, он требует правильной настройки и даже с ней – это не панацея.

Код на салфетке x Кусочки кода
🔥4
Сравнение улучшения кода в Python и C++ (часть 1)
Автор: Eugene Kaddo

Данная статья посвящена теме улучшения кода в языках Python и C++, а именно обработке ошибок, валидации, аннотациям типов, повышению отказоустойчивости и переиспользованию кода.


Читать пост

Файлы к посту, можно получить в боте по коду: 108905

Поддержать проект на Boosty
Поддержать проект в Telegram

#exception #Cpp #Сравнение_Python_и_C_Cpp #annotation #validation
🔥72👏21