Беспорядок внутри порядка * (ч.1)
Причина, по которой непереходное равенство не соблюдалось среди dictionary, ordered_dict и another_ordered_dict, заключается в том, как eq метод реализован в OrderedDict классе.
А причина такого равенства в поведении заключается в том, что он позволяет OrderedDict заменять объекты напрямую везде, где используется обычный словарь.
Разъяснивший Python
Причина, по которой непереходное равенство не соблюдалось среди dictionary, ordered_dict и another_ordered_dict, заключается в том, как eq метод реализован в OrderedDict классе.
А причина такого равенства в поведении заключается в том, что он позволяет OrderedDict заменять объекты напрямую везде, где используется обычный словарь.
Разъяснивший 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
🤡1
Беспорядок внутри порядка * (ч.2)
Хорошо, так почему изменение порядка повлияло на длину сгенерированного set объект? Ответ заключается только в отсутствии непереходного равенства.
Поскольку наборы представляют собой "неупорядоченные" коллекции уникальных элементов, порядок, в котором вставляются элементы, не должен иметь значения. Но в данном случае это действительно имеет значение.
Разъяснивший Python
Хорошо, так почему изменение порядка повлияло на длину сгенерированного set объект? Ответ заключается только в отсутствии непереходного равенства.
Поскольку наборы представляют собой "неупорядоченные" коллекции уникальных элементов, порядок, в котором вставляются элементы, не должен иметь значения. Но в данном случае это действительно имеет значение.
Разъяснивший Python
Продолжай пытаться... *
Когда return, break или continue инструкция выполняется в try набор инструкций "try ... finally", finally предложение также выполняется при выходе.
Возвращаемое значение функции определяется последним return выполняется инструкция. Поскольку finally предложение всегда выполняется, a return инструкция, выполняемая в finally предложение всегда будет выполняться последним.
Предостережение здесь в том, что если предложение finally выполняет return или break инструкция, временно сохраненное исключение отбрасывается.
Разъяснивший Python
Когда return, break или continue инструкция выполняется в try набор инструкций "try ... finally", finally предложение также выполняется при выходе.
Возвращаемое значение функции определяется последним return выполняется инструкция. Поскольку finally предложение всегда выполняется, a return инструкция, выполняемая в finally предложение всегда будет выполняться последним.
Предостережение здесь в том, что если предложение finally выполняет return или break инструкция, временно сохраненное исключение отбрасывается.
Разъяснивший Python
Для чего? (ч.1)
Оператор for определен в Python как:
Где exprlist является ли назначение целевым. Это означает, что эквивалент {exprlist} = {next_value} выполняется для каждого элемента в итерируемом.
В enumerate(some_string) функция выдает новое значение i (счетчик растет) и символ из some_string в каждой итерации. Затем он устанавливает (только что назначенный) i ключ к словарю some_dict к этому персонажу.
Разъяснивший 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 к этому персонажу.
Разъяснивший Python
Для чего? (ч.2)
Оператор присваивания i = 10 никогда не влияет на итерации цикла из-за способа работы циклов for в Python. Перед началом каждой итерации следующий элемент, предоставляемый итератором (range(4) в данном случае) распаковывается и присваивается переменным целевого списка (i в данном случае).
Разъяснивший Python
Оператор присваивания i = 10 никогда не влияет на итерации цикла из-за способа работы циклов for в Python. Перед началом каждой итерации следующий элемент, предоставляемый итератором (range(4) в данном случае) распаковывается и присваивается переменным целевого списка (i в данном случае).
Разъяснивший Python
Несоответствие во времени оценки (ч.1)
В выражении генератора in предложение вычисляется во время объявления, но условное предложение вычисляется во время выполнения.
Итак, перед выполнением, array повторно присваивается списку [2, 8, 22], и поскольку из 1, 8 и 15 только количество 8 больше 0, генератор выдает только 8.
Разъяснивший Python
В выражении генератора in предложение вычисляется во время объявления, но условное предложение вычисляется во время выполнения.
Итак, перед выполнением, array повторно присваивается списку [2, 8, 22], и поскольку из 1, 8 и 15 только количество 8 больше 0, генератор выдает только 8.
Разъяснивший Python
Несоответствие во времени оценки (ч.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]).
Разъяснивший 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]).
Разъяснивший Python
Несоответствие во времени оценки (ч.3)
Хорошо, следуя логике, обсуждавшиеся до сих пор, не должно ли значение list(gen) в третьем фрагменте быть [11, 21, 31, 12, 22, 32, 13, 23, 33]? (потому что array_3 и array_4 будут вести себя точно так же, как array_1). Причина, по которой были обновлены (только) array_4 значения, объясняется в PEP-289.
Немедленно вычисляется только самое внешнее выражение for, остальные выражения откладываются до запуска генератора.
Разъяснивший Python
Хорошо, следуя логике, обсуждавшиеся до сих пор, не должно ли значение 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.
Разъяснивший Python
is not это один двоичный оператор, и его поведение отличается от использования is и not разделенных.
is not вычисляется, False если переменные по обе стороны от оператора указывают на один и тот же объект и True в противном случае.
В примере (not None) вычисляется как True, поскольку значение None находится False в логическом контексте, поэтому выражение становится 'something' is True.
Разъяснивший Python
👍2
Крестики-нолики, где X побеждает с первой попытки!
Когда мы инициализируем row переменную, эта визуализация объясняет, что происходит в памяти.
И когда board инициализируется путем умножения row, вот что происходит внутри памяти (каждый из элементов board[0], board[1] и board[2] является ссылкой на один и тот же список, на который ссылается row).
Мы можем избежать этого сценария здесь, не используя row переменную для генерации board.
Разъяснивший Python
Когда мы инициализируем row переменную, эта визуализация объясняет, что происходит в памяти.
И когда board инициализируется путем умножения row, вот что происходит внутри памяти (каждый из элементов board[0], board[1] и board[2] является ссылкой на один и тот же список, на который ссылается row).
Мы можем избежать этого сценария здесь, не используя row переменную для генерации board.
Разъяснивший Python
Переменная Шредингера (ч.1)
Значения x были разными на каждой итерации до добавления some_func к funcs, но все функции возвращают 6, когда они вычисляются после завершения цикла.
Разъяснивший Python
Значения x были разными на каждой итерации до добавления some_func к funcs, но все функции возвращают 6, когда они вычисляются после завершения цикла.
Разъяснивший Python
Переменная Шредингера (ч.2)
При определении функции внутри цикла, которая использует переменную цикла в своем теле, закрытие функции цикла привязывается к переменной, а не к ее значению. Функция ищет x в окружающем контексте, вместо того, чтобы использовать значение x во время создания функции. Итак, все функции используют для вычислений последнее значение, присвоенное переменной. Мы можем видеть, что он использует x из окружающего контекста (т.е. не локальную переменную) с:
Разъяснивший Python
При определении функции внутри цикла, которая использует переменную цикла в своем теле, закрытие функции цикла привязывается к переменной, а не к ее значению. Функция ищет x в окружающем контексте, вместо того, чтобы использовать значение x во время создания функции. Итак, все функции используют для вычислений последнее значение, присвоенное переменной. Мы можем видеть, что он использует x из окружающего контекста (т.е. не локальную переменную) с:
Разъяснивший Python
Переменная Шредингера (ч.3)
Поскольку x это глобальное значение, мы можем изменить значение, которое funcs будет искать и возвращать, обновив x.
Чтобы получить желаемое поведение, вы можете передать переменную цикла в качестве именованной переменной в функцию. Почему это работает? Потому что это определит переменную внутри области видимости функции. Он больше не будет обращаться к окружающей (глобальной) области видимости для поиска значений переменных, но создаст локальную переменную, которая хранит значение x на данный момент времени.
Разъяснивший Python
Поскольку x это глобальное значение, мы можем изменить значение, которое funcs будет искать и возвращать, обновив x.
Чтобы получить желаемое поведение, вы можете передать переменную цикла в качестве именованной переменной в функцию. Почему это работает? Потому что это определит переменную внутри области видимости функции. Он больше не будет обращаться к окружающей (глобальной) области видимости для поиска значений переменных, но создаст локальную переменную, которая хранит значение x на данный момент времени.
Разъяснивший Python
Проблема с куриным яйцом (ч.1)
Итак, какой "окончательный" базовый класс?
type это метакласс в Python. Все является object на Python, который включает в себя классы, а также их объекты (экземпляры). Класс type - это метакласс class object, и каждый класс (включая type) прямо или косвенно унаследован от object.
Разъяснивший Python
Итак, какой "окончательный" базовый класс?
type это метакласс в Python. Все является object на Python, который включает в себя классы, а также их объекты (экземпляры). Класс type - это метакласс class object, и каждый класс (включая type) прямо или косвенно унаследован от object.
Разъяснивший Python
Проблема с куриным яйцом (ч.2)
Среди object и type нет реального базового класса. Путаница в приведенных выше фрагментах возникает из-за того, что мы думаем об этих взаимосвязях (issubclass и isinstance) в терминах классов Python. Связь между object и type не может быть воспроизведена в чистом python.
Разъяснивший Python
Среди object и type нет реального базового класса. Путаница в приведенных выше фрагментах возникает из-за того, что мы думаем об этих взаимосвязях (issubclass и isinstance) в терминах классов Python. Связь между object и type не может быть воспроизведена в чистом python.
Разъяснивший Python
Отношения подклассов
Отношения подклассов не обязательно являются транзитивными в Python. Любому разрешено определять свой собственный, произвольный subclasscheck в метаклассе.
Когда issubclass(cls, Hashable) вызывается, он просто ищет не ложный "hash" метод в cls или что-либо, от чего он наследуется.
Поскольку object является хешируемым, но list не является хешируемым, это нарушает отношение транзитивности.
Разъяснивший Python
Отношения подклассов не обязательно являются транзитивными в Python. Любому разрешено определять свой собственный, произвольный subclasscheck в метаклассе.
Когда issubclass(cls, Hashable) вызывается, он просто ищет не ложный "hash" метод в cls или что-либо, от чего он наследуется.
Поскольку object является хешируемым, но list не является хешируемым, это нарушает отношение транзитивности.
Разъяснивший Python
Равенство методов и идентичность (ч.1)
Функции - это дескрипторы. Всякий раз, когда к функции обращаются как к атрибуту, вызывается дескриптор, создающий объект метода, который "связывает" функцию с объектом, владеющим атрибутом. При вызове метод вызывает функцию, неявно передавая связанный объект в качестве первого аргумента (именно так мы получаем self в качестве первого аргумента, несмотря на то, что не передаем его явно).
Разъяснивший Python
Функции - это дескрипторы. Всякий раз, когда к функции обращаются как к атрибуту, вызывается дескриптор, создающий объект метода, который "связывает" функцию с объектом, владеющим атрибутом. При вызове метод вызывает функцию, неявно передавая связанный объект в качестве первого аргумента (именно так мы получаем self в качестве первого аргумента, несмотря на то, что не передаем его явно).
Разъяснивший Python
Равенство методов и идентичность (ч.2)
Обращаясь classm дважды, мы получаем одинаковый объект, но не тот же? Давайте посмотрим, что происходит с экземплярами SomeClass
Обращение к classm or method дважды создает одинаковые, но не одинаковые объекты для одного и того же экземпляра SomeClass.
Разъяснивший Python
Обращаясь classm дважды, мы получаем одинаковый объект, но не тот же? Давайте посмотрим, что происходит с экземплярами SomeClass
Обращение к classm or method дважды создает одинаковые, но не одинаковые объекты для одного и того же экземпляра SomeClass.
Разъяснивший Python
Методы: classmethod (ч.1)
Обращение к атрибуту несколько раз каждый раз создает объект метода! Поэтому o1.method is o1.method никогда не бывает правдивым. Доступ к функциям как атрибутам класса (в отличие от экземпляра), однако, не создает методы; так SomeClass.method is SomeClass.method и есть на самом деле.
Разъяснивший Python
Обращение к атрибуту несколько раз каждый раз создает объект метода! Поэтому o1.method is o1.method никогда не бывает правдивым. Доступ к функциям как атрибутам класса (в отличие от экземпляра), однако, не создает методы; так SomeClass.method is SomeClass.method и есть на самом деле.
Разъяснивший Python