Just Python
10.2K subscribers
4.39K photos
11 videos
4.38K links
🐍Простое изучение Python.

Ссылка: @Portal_v_IT

Сотрудничество: @oleginc, @tatiana_inc

Канал на бирже: telega.in/c/justpython_it

РКН: clck.ru/3MnbSc
Download Telegram
Как не использовать оператор is

Тут оба a и b ссылаются на один и тот же объект при инициализации с одинаковым значением в одной строке. Это происходит когда a и b устанавливаются в 257 значения в одной строке, интерпретатор Python создает новый объект, а затем одновременно ссылается на вторую переменную.

Если вы делаете это в отдельных строках, он не "знает", что уже существует 257 как объект. Это оптимизация компилятора, и она особенно применима к интерактивной среде. Когда вы вводите две строки в живой интерпретатор, они компилируются отдельно, следовательно, оптимизируются отдельно.

#theory // Just Python
Хэш брауни (ч.1)

Уникальность ключей в словаре Python определяется эквивалентностью, а не идентичностью. Итак, даже несмотря на то, что 5, 5.0 и 5 + 0j являются различными объектами разных типов, поскольку они равны, они не могут оба находиться в одном и том же dict (или set). Как только вы вставите любой из них, попытка поиска любого отдельного, но эквивалентного ключа завершится успехом с исходным отображенным значением (вместо сбоя с KeyError)

#theory // Just Python
Хэш брауни (ч.2)

Итак, как мы можем обновить ключ на 5 (вместо 5.0)? На самом деле мы не можем выполнить это обновление на месте, но что мы можем сделать, это сначала удалить ключ (del some_dict[5.0]), а затем установить его (some_dict[5]), чтобы получить целое число 5 в качестве ключа вместо плавающего 5.0, хотя это должно быть необходимо в редких случаях.

#theory // Just Python
Хэш-функций (ч.1)

Когда вы это делаете some_dict[5] = "Python", Python находит существующий элемент с эквивалентным ключом 5.0 -> "Ruby", перезаписывает его значение на месте и оставляет исходный ключ в покое.

#theory // Just Python
Хэш-функций (ч.2)

Как Python нашел 5 в словаре, содержащем 5.0? Python делает это за постоянное время без необходимости сканировать каждый элемент с помощью хэш-функций. Когда Python ищет ключ foo в dict, он сначала выполняет вычисления hash(foo) (которые выполняются в постоянном времени). Поскольку в Python требуется, чтобы объекты, которые сравниваются равными, также имели одинаковое хэш-значение (docs здесь), 5, 5.0 и 5 + 0j имеют одинаковое хэш-значение.

#theory // Just Python
Как вывести переменную и строку в Python, разделив их запятыми

Вы можете указать строку и переменную в качестве аргументов функции print(), просто перечислив их через запятую.

#theory // Just Python
В глубине души мы все одинаковые (ч.1)

При id вызове Python создал объект WTF класса и передал его id функции. id Функция берет его id (его ячейку памяти) и выбрасывает объект. Объект уничтожен. Когда мы делаем это дважды подряд, Python выделяет ту же ячейку памяти и для этого второго объекта.

Поскольку (в CPython) id в качестве идентификатора объекта используется ячейка памяти, идентификатор двух объектов одинаков.

#theory // Just Python
В глубине души мы все одинаковые (ч.2)

Идентификатор объекта уникален только на протяжении всего срока службы объекта. После уничтожения объекта или до его создания что-то еще может иметь тот же идентификатор.

Как вы можете заметить, порядок, в котором уничтожаются объекты, - это то, что имеет здесь решающее значение.

#theory // Just Python
В связи с нынешними ограничениями по работе Telegram, создали аналог канала в Max — Заметки Питониста

Если у вас возникают проблемы с загрузкой контента, переходите в наш дублированный канал — https://max.ru/pythontest_it
Just Python pinned a photo
Осталось 24 часа, чтобы забрать 👇🏼

- доступ к бесплатному интенсиву "Первые деньги на вайбкодинге" (старт уже завтра 7.04 в 19.00)

- уроки по программированию с нейронками

- 50 бесплатных нейросетей, чтобы кодить без остановки

- «Библиотека промптов для заработка на вайбкодинге», которые помогут упаковать портфолио и общаться с клиентами так, чтобы покупали

Все бонусы уже ждут тебя в закрытом канале по вайбкодингу👇

Вступить в закрытый канал
Вступить в закрытый канал
Вступить в закрытый канал
Беспорядок внутри порядка * (ч.1)

Причина, по которой непереходное равенство не соблюдалось среди dictionary, ordered_dict и another_ordered_dict, заключается в том, как eq метод реализован в OrderedDict классе.

А причина такого равенства в поведении заключается в том, что он позволяет OrderedDict заменять объекты напрямую везде, где используется обычный словарь.

#theory // Just Python
Беспорядок внутри порядка * (ч.2)

Хорошо, так почему изменение порядка повлияло на длину сгенерированного set объект? Ответ заключается только в отсутствии непереходного равенства.

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

#theory // Just Python
Лови список полезных IT каналов в Max 🇷🇺

Архиватор – крупная база слитых айти курсов по программированию

Сливакер – отобранный архив полезных курсов для программистов

Полка Разработчика – сборник книг для изучения 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
Please open Telegram to view this post
VIEW IN TELEGRAM
Для чего? (ч.1)

Оператор 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
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
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
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
Please open Telegram to view this post
VIEW IN TELEGRAM