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

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

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

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

РКН: clck.ru/3G6pBb
加入频道
Python-разработчики — одни из самых востребованных IT-специалистов на рынке. Они создают веб-приложения и чат-ботов, автоматизируют процессы. По данным HeadHunter, больше 8 000 компаний ищут специалистов разных уровней.

Зарегистрируйтесь на буткемп прямо сейчас и получите гайд по профессии. Из него узнаете, где используют Python, почему это идеальный язык для новичка и что думают о Python опытные разработчики. Подробная программа: https://epic.st/DHr--9

Что особенного в буткемпе по Python:
— Подходит новичкам — от вас не требуется знаний и опыта в IT.
— 4 крутых проекта для портфолио.
— Практические задания для проверки знаний.
— Живое общение со спикером.
— 5 полезных материалов в подарок.
— Бессрочный доступ к видео.

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

Успейте записаться и получить подарок!
Атрибуты класса и атрибуты экземпляра (ч.2)

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

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

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

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

Python 3.8+ больше не допускает yield понимания внутри списка и выдает SyntaxError.
Уступая от ... return! (ч.1)

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

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

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

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

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

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

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

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

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

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

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

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

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

→ 22 мая в 19:00

Вести вебинар будут действующие программисты — эксперты и выпускники Практикума. Они расскажут:
— что это за языки и зачем нужны;
— какой язык подойдёт для игр, корпоративных приложений, машинного обучения или автоматизации;
— какие сложности есть в изучении;
— как выбрать язык под себя;
— какие специалисты нужнее на рынке труда.

В конце встречи можно будет задать вопросы и получить совет.
→ Приходите на встречу, чтобы сделать первый шаг к карьере.
Изменение неизменяемого! (ч.2)

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

Также есть объяснение в официальном FAQ по Python.
Исчезающая переменная из внешней области (ч.1)

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

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

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

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

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

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

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

Для желаемого поведения мы можем переопределить eq метод в SomeClass
Давайте посмотрим, сможете ли вы догадаться об этом? (ч.1)

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

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

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

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

a теперь присвоен {}, который является изменяемым объектом.
Давайте посмотрим, сможете ли вы догадаться об этом? (ч.2)

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

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

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

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

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

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

Переменная среды PYTHONINTMAXSTRDIGITS
Упрямая del операция (ч.1)

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

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

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

Во втором фрагменте вывода del() не был вызван, потому что предыдущий оператор (>>> y) в интерактивном интерпретаторе создал другую ссылку на тот же объект (в частности, на _ магическую переменную, которая ссылается на результирующее значение последнего не None выражения в REPL), таким образом предотвращая достижение нулевого значения количества ссылок при del y обнаружении.

Вызов globals (или, на самом деле, выполнение чего-либо, что не будет иметь None результата) заставил _ ссылаться на новый результат, отбрасывая существующую ссылку. Теперь количество ссылок достигло 0, и мы видим, что "Удалено!" печатается (наконец-то!).