В глубине души мы все одинаковые (ч.1)
При id вызове Python создал объект WTF класса и передал его id функции. id Функция берет его id (его ячейку памяти) и выбрасывает объект. Объект уничтожен. Когда мы делаем это дважды подряд, Python выделяет ту же ячейку памяти и для этого второго объекта.
Поскольку (в CPython) id в качестве идентификатора объекта используется ячейка памяти, идентификатор двух объектов одинаков.
#theory // Just Python
При id вызове Python создал объект WTF класса и передал его id функции. id Функция берет его id (его ячейку памяти) и выбрасывает объект. Объект уничтожен. Когда мы делаем это дважды подряд, Python выделяет ту же ячейку памяти и для этого второго объекта.
Поскольку (в CPython) id в качестве идентификатора объекта используется ячейка памяти, идентификатор двух объектов одинаков.
#theory // Just Python
В глубине души мы все одинаковые (ч.2)
Идентификатор объекта уникален только на протяжении всего срока службы объекта. После уничтожения объекта или до его создания что-то еще может иметь тот же идентификатор.
Как вы можете заметить, порядок, в котором уничтожаются объекты, - это то, что имеет здесь решающее значение.
#theory // Just Python
Идентификатор объекта уникален только на протяжении всего срока службы объекта. После уничтожения объекта или до его создания что-то еще может иметь тот же идентификатор.
Как вы можете заметить, порядок, в котором уничтожаются объекты, - это то, что имеет здесь решающее значение.
#theory // Just Python
В связи с нынешними ограничениями по работе Telegram, создали аналог канала в Max — Заметки Питониста
Если у вас возникают проблемы с загрузкой контента, переходите в наш дублированный канал — https://max.ru/pythontest_it
Если у вас возникают проблемы с загрузкой контента, переходите в наш дублированный канал — https://max.ru/pythontest_it
Осталось 24 часа, чтобы забрать 👇🏼
- доступ к бесплатному интенсиву "Первые деньги на вайбкодинге" (старт уже завтра 7.04 в 19.00)
- уроки по программированию с нейронками
- 50 бесплатных нейросетей, чтобы кодить без остановки
- «Библиотека промптов для заработка на вайбкодинге», которые помогут упаковать портфолио и общаться с клиентами так, чтобы покупали
Все бонусы уже ждут тебя в закрытом канале по вайбкодингу👇
Вступить в закрытый канал
Вступить в закрытый канал
Вступить в закрытый канал
- доступ к бесплатному интенсиву "Первые деньги на вайбкодинге" (старт уже завтра 7.04 в 19.00)
- уроки по программированию с нейронками
- 50 бесплатных нейросетей, чтобы кодить без остановки
- «Библиотека промптов для заработка на вайбкодинге», которые помогут упаковать портфолио и общаться с клиентами так, чтобы покупали
Все бонусы уже ждут тебя в закрытом канале по вайбкодингу👇
Вступить в закрытый канал
Вступить в закрытый канал
Вступить в закрытый канал
Беспорядок внутри порядка * (ч.1)
Причина, по которой непереходное равенство не соблюдалось среди dictionary, ordered_dict и another_ordered_dict, заключается в том, как eq метод реализован в OrderedDict классе.
А причина такого равенства в поведении заключается в том, что он позволяет OrderedDict заменять объекты напрямую везде, где используется обычный словарь.
#theory // Just Python
Причина, по которой непереходное равенство не соблюдалось среди dictionary, ordered_dict и another_ordered_dict, заключается в том, как eq метод реализован в OrderedDict классе.
А причина такого равенства в поведении заключается в том, что он позволяет OrderedDict заменять объекты напрямую везде, где используется обычный словарь.
#theory // Just Python
Беспорядок внутри порядка * (ч.2)
Хорошо, так почему изменение порядка повлияло на длину сгенерированного set объект? Ответ заключается только в отсутствии непереходного равенства.
Поскольку наборы представляют собой "неупорядоченные" коллекции уникальных элементов, порядок, в котором вставляются элементы, не должен иметь значения. Но в данном случае это действительно имеет значение.
#theory // Just Python
Хорошо, так почему изменение порядка повлияло на длину сгенерированного set объект? Ответ заключается только в отсутствии непереходного равенства.
Поскольку наборы представляют собой "неупорядоченные" коллекции уникальных элементов, порядок, в котором вставляются элементы, не должен иметь значения. Но в данном случае это действительно имеет значение.
#theory // Just Python
Лови список полезных IT каналов в Max 🇷🇺
Архиватор – крупная база слитых айти курсов по программированию
Сливакер – отобранный архив полезных курсов для программистов
Полка Разработчика – сборник книг для изучения Python, JS, Java и других языков программирования;
Записки Фронтендера -- опытный Frontend-разработчик собрал все самое основное
Записки Бэкендера -- а тут опытный Backend-разработчик подбирает самое полезное
Записки Питониста -- здесь думаю итак понятно, питонисты заходите
Code Learning – ютуб в мире программистов, сборник видео для обучения
Графика и Дизайн – сборник полезных курсов и видео для полного погружения в дизайн
Нейролента – публикуем самое актуальное из мира нейросетей
Windows Community -- все что связанно с Windows
DevHumor – все что выше, без юмора не понять
Находки Программиста – подбираем все самое нужно для программистов
Архиватор – крупная база слитых айти курсов по программированию
Сливакер – отобранный архив полезных курсов для программистов
Полка Разработчика – сборник книг для изучения Python, JS, Java и других языков программирования;
Записки Фронтендера -- опытный Frontend-разработчик собрал все самое основное
Записки Бэкендера -- а тут опытный Backend-разработчик подбирает самое полезное
Записки Питониста -- здесь думаю итак понятно, питонисты заходите
Code Learning – ютуб в мире программистов, сборник видео для обучения
Графика и Дизайн – сборник полезных курсов и видео для полного погружения в дизайн
Нейролента – публикуем самое актуальное из мира нейросетей
Windows Community -- все что связанно с Windows
DevHumor – все что выше, без юмора не понять
Находки Программиста – подбираем все самое нужно для программистов
Please open Telegram to view this post
VIEW IN TELEGRAM
Продолжай пытаться... *
Когда return, break или continue инструкция выполняется в try набор инструкций "try ... finally", finally предложение также выполняется при выходе.
Возвращаемое значение функции определяется последним return выполняется инструкция. Поскольку finally предложение всегда выполняется, a return инструкция, выполняемая в finally предложение всегда будет выполняться последним.
Предостережение здесь в том, что если предложение finally выполняет return или break инструкция, временно сохраненное исключение отбрасывается.
Канал в Max🇷🇺
#theory // Just Python
Когда return, break или continue инструкция выполняется в try набор инструкций "try ... finally", finally предложение также выполняется при выходе.
Возвращаемое значение функции определяется последним return выполняется инструкция. Поскольку finally предложение всегда выполняется, a return инструкция, выполняемая в finally предложение всегда будет выполняться последним.
Предостережение здесь в том, что если предложение finally выполняет return или break инструкция, временно сохраненное исключение отбрасывается.
Канал в Max
#theory // Just Python
Please open Telegram to view this post
VIEW IN TELEGRAM
Для чего? (ч.1)
Оператор for определен в Python как:
Где exprlist является ли назначение целевым. Это означает, что эквивалент {exprlist} = {next_value} выполняется для каждого элемента в итерируемом.
В enumerate(some_string) функция выдает новое значение i (счетчик растет) и символ из some_string в каждой итерации. Затем он устанавливает (только что назначенный) i ключ к словарю some_dict к этому персонажу.
Канал в Max🇷🇺
#theory // Just Python
Оператор for определен в Python как:
for_stmt: 'for' exprlist 'in' testlist ':' suite ['else' ':' suite]
Где exprlist является ли назначение целевым. Это означает, что эквивалент {exprlist} = {next_value} выполняется для каждого элемента в итерируемом.
В enumerate(some_string) функция выдает новое значение i (счетчик растет) и символ из some_string в каждой итерации. Затем он устанавливает (только что назначенный) i ключ к словарю some_dict к этому персонажу.
Канал в Max
#theory // Just Python
Please open Telegram to view this post
VIEW IN TELEGRAM
Для чего? (ч.2)
Оператор присваивания i = 10 никогда не влияет на итерации цикла из-за способа работы циклов for в Python. Перед началом каждой итерации следующий элемент, предоставляемый итератором (range(4) в данном случае) распаковывается и присваивается переменным целевого списка (i в данном случае).
Канал в Max🇷🇺
#theory // Just Python
Оператор присваивания i = 10 никогда не влияет на итерации цикла из-за способа работы циклов for в Python. Перед началом каждой итерации следующий элемент, предоставляемый итератором (range(4) в данном случае) распаковывается и присваивается переменным целевого списка (i в данном случае).
Канал в Max
#theory // Just Python
Please open Telegram to view this post
VIEW IN TELEGRAM
Несоответствие во времени оценки (ч.1)
В выражении генератора in предложение вычисляется во время объявления, но условное предложение вычисляется во время выполнения.
Итак, перед выполнением, array повторно присваивается списку [2, 8, 22], и поскольку из 1, 8 и 15 только количество 8 больше 0, генератор выдает только 8.
Канал в Max🇷🇺
#theory // Just Python
В выражении генератора in предложение вычисляется во время объявления, но условное предложение вычисляется во время выполнения.
Итак, перед выполнением, array повторно присваивается списку [2, 8, 22], и поскольку из 1, 8 и 15 только количество 8 больше 0, генератор выдает только 8.
Канал в Max
#theory // Just Python
Please open Telegram to view this post
VIEW IN TELEGRAM
Несоответствие во времени оценки (ч.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]).
Канал в Max🇷🇺
#theory // Just Python
Различия в выходных данных 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]).
Канал в Max
#theory // Just Python
Please open Telegram to view this post
VIEW IN TELEGRAM
Несоответствие во времени оценки (ч.3)
Хорошо, следуя логике, обсуждавшиеся до сих пор, не должно ли значение list(gen) в третьем фрагменте быть [11, 21, 31, 12, 22, 32, 13, 23, 33]? (потому что array_3 и array_4 будут вести себя точно так же, как array_1). Причина, по которой были обновлены (только) array_4 значения, объясняется в PEP-289.
Немедленно вычисляется только самое внешнее выражение for, остальные выражения откладываются до запуска генератора.
Канал в Max🇷🇺
#theory // Just Python
Хорошо, следуя логике, обсуждавшиеся до сих пор, не должно ли значение list(gen) в третьем фрагменте быть [11, 21, 31, 12, 22, 32, 13, 23, 33]? (потому что array_3 и array_4 будут вести себя точно так же, как array_1). Причина, по которой были обновлены (только) array_4 значения, объясняется в PEP-289.
Немедленно вычисляется только самое внешнее выражение for, остальные выражения откладываются до запуска генератора.
Канал в Max
#theory // Just Python
Please open Telegram to view this post
VIEW IN TELEGRAM
is not ... не является is (not ...)
is not это один двоичный оператор, и его поведение отличается от использования is и not разделенных.
is not вычисляется, False если переменные по обе стороны от оператора указывают на один и тот же объект и True в противном случае.
В примере (not None) вычисляется как True, поскольку значение None находится False в логическом контексте, поэтому выражение становится 'something' is True.
Канал в Max🇷🇺
#theory // Just Python
is not это один двоичный оператор, и его поведение отличается от использования is и not разделенных.
is not вычисляется, False если переменные по обе стороны от оператора указывают на один и тот же объект и True в противном случае.
В примере (not None) вычисляется как True, поскольку значение None находится False в логическом контексте, поэтому выражение становится 'something' is True.
Канал в Max
#theory // Just Python
Please open Telegram to view this post
VIEW IN TELEGRAM
Крестики-нолики, где X побеждает с первой попытки!
Когда мы инициализируем row переменную, эта визуализация объясняет, что происходит в памяти.
И когда board инициализируется путем умножения row, вот что происходит внутри памяти (каждый из элементов board[0], board[1] и board[2] является ссылкой на один и тот же список, на который ссылается row).
Мы можем избежать этого сценария здесь, не используя row переменную для генерации board.
Канал в Max🇷🇺
#theory // Just Python
Когда мы инициализируем row переменную, эта визуализация объясняет, что происходит в памяти.
И когда board инициализируется путем умножения row, вот что происходит внутри памяти (каждый из элементов board[0], board[1] и board[2] является ссылкой на один и тот же список, на который ссылается row).
Мы можем избежать этого сценария здесь, не используя row переменную для генерации board.
Канал в Max
#theory // Just Python
Please open Telegram to view this post
VIEW IN TELEGRAM
Переменная Шредингера (ч.1)
Значения x были разными на каждой итерации до добавления some_func к funcs, но все функции возвращают 6, когда они вычисляются после завершения цикла.
Канал в Max🇷🇺
#theory // Just Python
Значения x были разными на каждой итерации до добавления some_func к funcs, но все функции возвращают 6, когда они вычисляются после завершения цикла.
Канал в Max
#theory // Just Python
Please open Telegram to view this post
VIEW IN TELEGRAM
Переменная Шредингера (ч.2)
При определении функции внутри цикла, которая использует переменную цикла в своем теле, закрытие функции цикла привязывается к переменной, а не к ее значению. Функция ищет x в окружающем контексте, вместо того, чтобы использовать значение x во время создания функции. Итак, все функции используют для вычислений последнее значение, присвоенное переменной. Мы можем видеть, что он использует x из окружающего контекста (т.е. не локальную переменную) с:
Канал в Max🇷🇺
#theory // Just Python
При определении функции внутри цикла, которая использует переменную цикла в своем теле, закрытие функции цикла привязывается к переменной, а не к ее значению. Функция ищет x в окружающем контексте, вместо того, чтобы использовать значение x во время создания функции. Итак, все функции используют для вычислений последнее значение, присвоенное переменной. Мы можем видеть, что он использует x из окружающего контекста (т.е. не локальную переменную) с:
Канал в Max
#theory // Just Python
Please open Telegram to view this post
VIEW IN TELEGRAM
Переменная Шредингера (ч.3)
Поскольку x это глобальное значение, мы можем изменить значение, которое funcs будет искать и возвращать, обновив x.
Чтобы получить желаемое поведение, вы можете передать переменную цикла в качестве именованной переменной в функцию. Почему это работает? Потому что это определит переменную внутри области видимости функции. Он больше не будет обращаться к окружающей (глобальной) области видимости для поиска значений переменных, но создаст локальную переменную, которая хранит значение x на данный момент времени.
Канал в Max🇷🇺
#theory // Just Python
Поскольку x это глобальное значение, мы можем изменить значение, которое funcs будет искать и возвращать, обновив x.
Чтобы получить желаемое поведение, вы можете передать переменную цикла в качестве именованной переменной в функцию. Почему это работает? Потому что это определит переменную внутри области видимости функции. Он больше не будет обращаться к окружающей (глобальной) области видимости для поиска значений переменных, но создаст локальную переменную, которая хранит значение x на данный момент времени.
Канал в Max
#theory // Just Python
Please open Telegram to view this post
VIEW IN TELEGRAM
Проблема с куриным яйцом (ч.1)
Итак, какой "окончательный" базовый класс?
type это метакласс в Python. Все является object на Python, который включает в себя классы, а также их объекты (экземпляры). Класс type - это метакласс class object, и каждый класс (включая type) прямо или косвенно унаследован от object.
Канал в Max🇷🇺
#theory // Just Python
Итак, какой "окончательный" базовый класс?
type это метакласс в Python. Все является object на Python, который включает в себя классы, а также их объекты (экземпляры). Класс type - это метакласс class object, и каждый класс (включая type) прямо или косвенно унаследован от object.
Канал в Max
#theory // Just Python
Please open Telegram to view this post
VIEW IN TELEGRAM
Проблема с куриным яйцом (ч.2)
Среди object и type нет реального базового класса. Путаница в приведенных выше фрагментах возникает из-за того, что мы думаем об этих взаимосвязях (issubclass и isinstance) в терминах классов Python. Связь между object и type не может быть воспроизведена в чистом python.
Канал в Max🇷🇺
#theory // Just Python
Среди object и type нет реального базового класса. Путаница в приведенных выше фрагментах возникает из-за того, что мы думаем об этих взаимосвязях (issubclass и isinstance) в терминах классов Python. Связь между object и type не может быть воспроизведена в чистом python.
Канал в Max
#theory // Just Python
Please open Telegram to view this post
VIEW IN TELEGRAM