Python School
82.3K subscribers
2.4K photos
8 videos
572 links
Уроки по Python, которые упростят вам жизнь. Без идиотских туториалов.

Наши мемы для программистов: @conhum

Сотрудничество - @alivian

Канал сотрудничает с рекламным сервисом @Tgpodbor_official

РКН: clck.ru/3G6pBb
加入频道
Попробуйте себя в роли разработчика на Python, даже если никогда не занимались этим! На бесплатном онлайн-интенсиве Skillbox по программированию вы на практике попробуете себя в разработке на языке Python и узнаете, как работают его популярные алгоритмы. Проанализируете данные с помощью Data Science и освоите базовые навыки по разным направлениям IT, а также получите советы по развитию карьеры.

Подробная программа: https://epic.st/r_oriM

🎁 Всех участников ждут полезные подарки.

Выберите свой путь в мире IT с 4 по 6 мая в 19:00 по московскому времени.
Для чего? (ч.2)

Оператор присваивания i = 10 никогда не влияет на итерации цикла из-за способа работы циклов for в Python. Перед началом каждой итерации следующий элемент, предоставляемый итератором (range(4) в данном случае) распаковывается и присваивается переменным целевого списка (i в данном случае).
Несоответствие во времени оценки (ч.1)

В выражении генератора in предложение вычисляется во время объявления, но условное предложение вычисляется во время выполнения.

Итак, перед выполнением, array повторно присваивается списку [2, 8, 22], и поскольку из 1, 8 и 15 только количество 8 больше 0, генератор выдает только 8.
Несоответствие во времени оценки (ч.2)

Различия в выходных данных g1 и g2 во второй части обусловлены тем, как переменным array_1 и array_2 повторно присваиваются значения.

В первом случае, array_1 привязан к новому объекту [1,2,3,4,5] и поскольку in предложение вычисляется во время объявления, оно все еще ссылается на старый объект [1,2,3,4] (который не уничтожается).

Во втором случае назначение фрагмента для array_2 обновляет тот же самый старый объект [1,2,3,4] до [1,2,3,4,5]. Следовательно, g2 и array_2 все еще имеют ссылку на один и тот же объект (который теперь был обновлен до [1,2,3,4,5]).
Несоответствие во времени оценки (ч.3)

Хорошо, следуя логике, обсуждавшиеся до сих пор, не должно ли значение list(gen) в третьем фрагменте быть [11, 21, 31, 12, 22, 32, 13, 23, 33]? (потому что array_3 и array_4 будут вести себя точно так же, как array_1). Причина, по которой были обновлены (только) array_4 значения, объясняется в PEP-289.

Немедленно вычисляется только самое внешнее выражение for, остальные выражения откладываются до запуска генератора.
У Яндекс Практикума есть бесплатный курс по основам анализа данных. В нём забавный интерактивный сюжет и много практики: четыре реальных кейса из разных областей. Вам предстоит:

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

На курсе вы напишете первый код на Python и поймёте, чем занимаются специалисты в сфере.
Приходите учиться бесплатно
is not ... не является is (not ...)

is not это один двоичный оператор, и его поведение отличается от использования is и not разделенных.

is not вычисляется, False если переменные по обе стороны от оператора указывают на один и тот же объект и True в противном случае.

В примере (not None) вычисляется как True, поскольку значение None находится False в логическом контексте, поэтому выражение становится 'something' is True.
Обучаемся дизайну целых 6 месяцев за 0₽.

Лучший способ понять подойдет ли вам дизайн-профессия — попробовать её на практике. Ребята из Yudaev School дают вам такую возможность.

Оформите обучение в рассрочку и платите за обучение через целых 6 месяцев, за которые вы сможете основательно понять подойдет ли вам профессия или нет. Решите продолжить обучаться дальше — школа гарантирует вам трудоустройство у своих партнеров с зп на старте от 60 000₽.

Записаться на обучение: https://clck.ru/34CqpN
Крестики-нолики, где X побеждает с первой попытки!

Когда мы инициализируем row переменную, эта визуализация объясняет, что происходит в памяти.

И когда board инициализируется путем умножения row, вот что происходит внутри памяти (каждый из элементов board[0], board[1] и board[2] является ссылкой на один и тот же список, на который ссылается row).

Мы можем избежать этого сценария здесь, не используя row переменную для генерации board.
Переменная Шредингера (ч.1)

Значения x были разными на каждой итерации до добавления some_func к funcs, но все функции возвращают 6, когда они вычисляются после завершения цикла.
Переменная Шредингера (ч.2)

При определении функции внутри цикла, которая использует переменную цикла в своем теле, закрытие функции цикла привязывается к переменной, а не к ее значению. Функция ищет x в окружающем контексте, вместо того, чтобы использовать значение x во время создания функции. Итак, все функции используют для вычислений последнее значение, присвоенное переменной. Мы можем видеть, что он использует x из окружающего контекста (т.е. не локальную переменную) с:
⚡️ Турция раздаёт 2456 билетов бесплатно. Взяли и поехали. А в 5-звездочном отеле можно пожить бесплатно — надо просто использовать специальный код. Кстати, билет в любую страну можно купить с 90% скидкой — но об этом не говорят.

И такие лазейки публикуют в Travel Media. Это лучший канал про путешествия, визы и заграницу.

Внутри: как летать по ценам сотрудников, что сделать, чтобы Airbnb бесплатно дал жилье и как путешествовать без заграника.

Лето — уже близко. Дерзайте: Travel Media.
Переменная Шредингера (ч.3)

Поскольку x это глобальное значение, мы можем изменить значение, которое funcs будет искать и возвращать, обновив x.

Чтобы получить желаемое поведение, вы можете передать переменную цикла в качестве именованной переменной в функцию. Почему это работает? Потому что это определит переменную внутри области видимости функции. Он больше не будет обращаться к окружающей (глобальной) области видимости для поиска значений переменных, но создаст локальную переменную, которая хранит значение x на данный момент времени.
Проблема с куриным яйцом (ч.1)

Итак, какой "окончательный" базовый класс?

type это метакласс в Python. Все является object на Python, который включает в себя классы, а также их объекты (экземпляры). Класс type - это метакласс class object, и каждый класс (включая type) прямо или косвенно унаследован от object.
Нейросети сейчас — как интернет в 1990 году. Тот, кто первым в них разберется — сможет что угодно и сорвёт куш.

Сами посмотрите: MidJourney рисует кручего любого дизайнера, ChatGPT сделает всю работу за вас, а DeepMind умеет лечить как врач.

А чтобы разобраться уже сегодня — держите в подписках Киллер-фича. Это лучший канал про технологии, ИИ и нейросети.

Там на пальцах рассказывают, как заставить нейронки работать на вас, как использовать ChatGPT и что не так с новым ИИ от Google.

Подписывайтесь, такие знания в 2023 году — на вес золота: Киллер-фича.
Проблема с куриным яйцом (ч.2)

Среди object и type нет реального базового класса. Путаница в приведенных выше фрагментах возникает из-за того, что мы думаем об этих взаимосвязях (issubclass и isinstance) в терминах классов Python. Связь между object и type не может быть воспроизведена в чистом python.
Проблема с куриным яйцом (ч.3)

Чтобы быть более точным, следующие взаимосвязи не могут быть воспроизведены в чистом Python:

Класс A является экземпляром класса B, а класс B является экземпляром класса A.
Класс A является экземпляром самого себя.

Эти отношения между object и type (оба являются экземплярами друг друга, а также самих себя)
Отношения подклассов

Отношения подклассов не обязательно являются транзитивными в Python. Любому разрешено определять свой собственный, произвольный subclasscheck в метаклассе.

Когда issubclass(cls, Hashable) вызывается, он просто ищет не ложный "hash" метод в cls или что-либо, от чего он наследуется.

Поскольку object является хешируемым, но list не является хешируемым, это нарушает отношение транзитивности.
Равенство методов и идентичность (ч.1)

Функции - это дескрипторы. Всякий раз, когда к функции обращаются как к атрибуту, вызывается дескриптор, создающий объект метода, который "связывает" функцию с объектом, владеющим атрибутом. При вызове метод вызывает функцию, неявно передавая связанный объект в качестве первого аргумента (именно так мы получаем self в качестве первого аргумента, несмотря на то, что не передаем его явно).
Равенство методов и идентичность (ч.2)

Обращаясь classm дважды, мы получаем одинаковый объект, но не тот же? Давайте посмотрим, что происходит с экземплярами SomeClass

Обращение к classm or method дважды создает одинаковые, но не одинаковые объекты для одного и того же экземпляра SomeClass.
Python — один из самых популярных языков в мире, а разработчики на нём востребованы в самых разных IT-направлениях. Познакомьтесь с различными сферами применения языка, узнайте, какие навыки сейчас востребованы на фрилансе и как начать работать на удалёнке, на бесплатном онлайн-интенсиве: ▶️https://epic.st/X_We7

Вы научитесь:
📍 Получать данные с сайтов, которые помогают аналитикам и владельцам бизнеса изучать рынок, конкурентов и динамику цен.
📍 Работать с API — специальными программными инструкциями, с помощью которых можно получить данные с сайтов.
📍 Парсить HTML. Узнаете, как автоматизировать сбор информации прямо из HTML-кода сайта.
📍 Автоматически выделять важное из огромных массивов данных с помощью Python.
📍 Писать программы для автоматической отправки важных писем по расписанию, тем самым автоматизировать email-рассылки.
📍 Разбираться в рынке фриланса на Python.

Спикером выступит руководитель направления по исследованию данных в Сбере Анастасия Борнева. Она с 2018 года занимается автоматизацией процессов с помощью искусственного интеллекта.

🎁 Всем участникам, прошедшим интенсив, подарим электронную книгу Роджера Сайпа и Робба Збиерски «Разум под контролем» издательства МИФ. А каждый, кто оставит заявку на участие в интенсиве, получит материал с подборкой коротких и полезных программ на Python.

Подключайтесь, задавайте вопросы и получите сертификат на скидку 10 000 рублей на любой курс Skillbox.

Ждём вас в прямых эфирах с 15 по 17 мая в 19:00 по московскому времени!