Just Python
11.2K subscribers
3.66K photos
11 videos
3.65K links
🐍Простое изучение Python.

Ссылка: @Portal_v_IT

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

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

РКН: clck.ru/3MnbSc
Download Telegram
Атрибуты класса и атрибуты экземпляра (ч.2)

+= Оператор изменяет изменяемый объект на месте, не создавая новый объект. Таким образом, изменение атрибута одного экземпляра влияет на другие экземпляры, а также на атрибут class.

#theory // Just Python
Нет результата

Это ошибка в обработке CPython yield в генераторах и пониманиях.

Источник и объяснение можно найти здесь: https://stackoverflow.com/questions/32139885/yield-in-list-comprehensions-and-generator-expressions

Сообщение об ошибке по теме:https://bugs.python.org/issue10544

Python 3.8+ больше не допускает yield понимания внутри списка и выдает SyntaxError.

#theory // Just Python
Уступая от ... return! (ч.1)

Куда "wtf" делся? Это из-за какого-то особого эффекта yield from?

Начиная с Python 3.3, стало возможным использовать return инструкцию со значениями внутри генераторов (см. PEP380). В официальных документах говорится, что,
"... return expr в генераторе возникают причины StopIteration(expr), которые возникают при выходе из генератора".

#theory // Just Python
Уступая от ... return! (ч.2)

В случае с some_func(3), StopIteration возникает в начале из-за return заявления. StopIteration Исключение автоматически перехватывается внутри list(...) оболочки и for цикла. Следовательно, два приведенных выше фрагмента приводят к пустому списку.

Чтобы получить ["wtf"] от генератора some_func, нам нужно перехватить StopIteration исключение.

#theory // Just Python
Nan-рефлексивность (ч.1)

'inf' и 'nan' - это специальные строки (без учета регистра), которые при явном приведении к float типу используются для представления математической "бесконечности" и "не числа" соответственно.

Поскольку, согласно стандартам IEEE NaN != NaN, соблюдение этого правила нарушает предположение о рефлексивности элемента коллекции в Python, т. Е. если x является частью коллекции, подобной list, реализации, подобные comparison, основаны на предположении, что x == x.

#theory // Just Python
Как использовать генераторы для экономии памяти?

Отрабатывают эффективнее вместо самописных итераторов и вызываются с помощью специального синтаксиса — круглых скобок и конструкции i for i in range(10000).

#theory // Just Python
Выполнение валидации входных данных

Стоит фильтровать пользовательский ввод на наличие определенных символов. В разработке веб-приложений это особенно важно, потому что помогает предотвратить различные атаки, такие как SQL-инъекции и межсайтовый скриптинг (XSS).

#theory // Just Python
Nan-рефлексивность (ч.2)

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

Поскольку идентификаторы x и y различны, учитываются значения, которые также различны; следовательно, сравнение возвращается False на этот раз.

#theory // Just Python
Чтение файлов и запись в них

Чтобы выполнить любую из операций чтения и записи, нам нужно сделать три основных шага:

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

#theory // Just Python
Распаковка словаря в аргументы функции

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

data автоматически распакует ключи словаря как имена аргументов, а значения — как аргументы функции.

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

#theory // Just Python
"Изменение" неизменяемого! (ч.1)

Это может показаться тривиальным, если вы знаете, как работают ссылки в Python.

Цитирую из https://docs.python.org/3/reference/datamodel.html

Неизменяемые последовательности Объект неизменяемого типа последовательности не может измениться после его создания. (Если объект содержит ссылки на другие объекты, эти другие объекты могут быть изменяемыми и могут быть изменены; однако коллекция объектов, на которые непосредственно ссылается неизменяемый объект, не может измениться.)

#theory // Just Python
"Изменение" неизменяемого! (ч.2)

+= оператор изменяет список на месте. Назначение элемента не работает, но когда возникает исключение, элемент уже был изменен на месте.

Также есть объяснение в официальном FAQ по Python.

#theory // Just Python
Исчезающая переменная из внешней области (ч.1)

Когда исключение было назначено с использованием as target, оно очищается в конце except предложения.

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

#theory // Just Python
Исчезающая переменная из внешней области (ч.2)

Эти предложения не ограничены в Python. Все в примере присутствует в той же области видимости, а переменная e была удалена из-за выполнения except предложения. То же самое не относится к функциям, которые имеют свои отдельные внутренние области.

В Python 2.x имя переменной e присваивается Exception() экземпляру, поэтому при попытке печати ничего не выводится.

#theory // Just Python
Таинственное преобразование типа ключа (ч.1)

И объект, s и строка "s" имеют одинаковое значение, потому что SomeClass наследуют hash метод str класса.

SomeClass("s") == "s" вычисляется как, True потому что SomeClass также наследует eq метод от str класса.

#theory // Just Python
Таинственное преобразование типа ключа (ч.2)

Поскольку оба объекта имеют одинаковое значение и равны, они представлены одним и тем же ключом в словаре.

Для желаемого поведения мы можем переопределить eq метод в SomeClass

#theory // Just Python
Давайте посмотрим, сможете ли вы догадаться об этом? (ч.1)

Согласно справочнику по языку Python, операторы присваивания имеют вид
(target_list "=")+ (expression_list | yield_expression)

Оператор присваивания вычисляет список выражений (помните, что это может быть одно выражение или список, разделенный запятыми, последний выдает кортеж) и присваивает отдельный результирующий объект каждому из целевых списков слева направо.

+ In (target_list "=")+ означает, что может быть один или более целевых списков. В данном случае целевыми списками являются a, b и a[b] (обратите внимание, что список выражений равен ровно одному, что в нашем случае и есть {}, 5).

После вычисления списка выражений его значение распаковывается в целевые списки слева направо. Итак, в нашем случае сначала {}, 5 кортеж распаковывается в a, b, и теперь у нас есть a = {} и b = 5.

a теперь присвоен {}, который является изменяемым объектом.

#theory // Just Python
Давайте посмотрим, сможете ли вы догадаться об этом? (ч.2)

Теперь мы устанавливаем ключ 5 в словаре на кортеж, ({}, 5) создающий циклическую ссылку ({...} в выходных данных ссылается на тот же объект, на который a уже ссылается). Другим более простым примером циклической ссылки может быть.

Аналогично обстоит дело в нашем примере (a[b][0] это тот же объект, что и a)

#theory // Just Python
Превышен лимит на преобразование целых строк

Этот вызов int() отлично работает в Python 3.10.6 и вызывает ошибку ValueError в Python 3.10.8. Обратите внимание, что Python все еще может работать с большими целыми числами. Ошибка возникает только при преобразовании между целыми числами и строками.

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

Флаг командной строки -X int_max_str_digits

Функция set_int_max_str_digits() из модуля sys

Переменная среды PYTHONINTMAXSTRDIGITS

#theory // Just Python
Упрямая del операция (ч.1)

Фух, наконец-то удалил. Возможно, вы уже догадались, что спасло del от вызова при нашей первой попытке удаления x.

del x напрямую не вызывает x.del().

При del x обнаружении Python удаляет имя x из текущей области видимости и уменьшает на 1 количество ссылок на объект, на который x ссылается. del() вызывается только тогда, когда количество ссылок на объект достигает нуля.

#theory // Just Python