Уступая от ... return! в Python (ч.2)
В случае с some_func(3), StopIteration возникает в начале из-за return заявления. StopIteration Исключение автоматически перехватывается внутри list(...) оболочки и for цикла. Следовательно, два приведенных выше фрагмента приводят к пустому списку.
Чтобы получить ["wtf"] от генератора some_func, нам нужно перехватить StopIteration исключение,
#theory // Just Python & Max
В случае с some_func(3), StopIteration возникает в начале из-за return заявления. StopIteration Исключение автоматически перехватывается внутри list(...) оболочки и for цикла. Следовательно, два приведенных выше фрагмента приводят к пустому списку.
Чтобы получить ["wtf"] от генератора some_func, нам нужно перехватить StopIteration исключение,
#theory // Just Python & Max
Nan-рефлексивность в Python (ч.1)
'inf' и 'nan' - это специальные строки (без учета регистра), которые при явном приведении к float типу используются для представления математической "бесконечности" и "не числа" соответственно.
Поскольку, согласно стандартам IEEE NaN != NaN, соблюдение этого правила нарушает предположение о рефлексивности элемента коллекции в Python, т. Е. если x является частью коллекции, подобной list, реализации, подобные comparison, основаны на предположении, что x == x.
#theory // Just Python & Max
'inf' и 'nan' - это специальные строки (без учета регистра), которые при явном приведении к float типу используются для представления математической "бесконечности" и "не числа" соответственно.
Поскольку, согласно стандартам IEEE NaN != NaN, соблюдение этого правила нарушает предположение о рефлексивности элемента коллекции в Python, т. Е. если x является частью коллекции, подобной list, реализации, подобные comparison, основаны на предположении, что x == x.
#theory // Just Python & Max
Nan-рефлексивность в Python (ч.2)
Из-за прошлого предположения сначала сравнивается идентификатор (поскольку это быстрее) при сравнении двух элементов, а значения сравниваются только тогда, когда идентификаторы не совпадают.
Поскольку идентификаторы x и y различны, учитываются значения, которые также различны; следовательно, сравнение возвращается False на этот раз.
#theory // Just Python & Max
Из-за прошлого предположения сначала сравнивается идентификатор (поскольку это быстрее) при сравнении двух элементов, а значения сравниваются только тогда, когда идентификаторы не совпадают.
Поскольку идентификаторы x и y различны, учитываются значения, которые также различны; следовательно, сравнение возвращается False на этот раз.
#theory // Just Python & Max
Чтение файлов и запись в них в Python
Чтобы выполнить любую из операций чтения и записи, нам нужно сделать три основных шага:
Открыть файл
Выполнить операцию
Закрыть файл
Мы можем проделывать эти шаги, используя два паттерна. Объяснить их на словах сложно, но мы сделаем это при помощи кода.
#theory // Just Python & Max
Чтобы выполнить любую из операций чтения и записи, нам нужно сделать три основных шага:
Открыть файл
Выполнить операцию
Закрыть файл
Мы можем проделывать эти шаги, используя два паттерна. Объяснить их на словах сложно, но мы сделаем это при помощи кода.
#theory // Just Python & Max
Изменение неизменяемого! в Python (ч.1)
Это может показаться тривиальным, если вы знаете, как работают ссылки в Python.
Цитирую из https://docs.python.org/3/reference/datamodel.html
Неизменяемые последовательности Объект неизменяемого типа последовательности не может измениться после его создания. (Если объект содержит ссылки на другие объекты, эти другие объекты могут быть изменяемыми и могут быть изменены; однако коллекция объектов, на которые непосредственно ссылается неизменяемый объект, не может измениться.)
#theory // Just Python & Max
Это может показаться тривиальным, если вы знаете, как работают ссылки в Python.
Цитирую из https://docs.python.org/3/reference/datamodel.html
Неизменяемые последовательности Объект неизменяемого типа последовательности не может измениться после его создания. (Если объект содержит ссылки на другие объекты, эти другие объекты могут быть изменяемыми и могут быть изменены; однако коллекция объектов, на которые непосредственно ссылается неизменяемый объект, не может измениться.)
#theory // Just Python & Max
Изменение неизменяемого! в Python (ч.2)
+= оператор изменяет список на месте. Назначение элемента не работает, но когда возникает исключение, элемент уже был изменен на месте.
Также есть объяснение в официальном FAQ по Python.
#theory // Just Python & Max
+= оператор изменяет список на месте. Назначение элемента не работает, но когда возникает исключение, элемент уже был изменен на месте.
Также есть объяснение в официальном FAQ по Python.
#theory // Just Python & Max
Исчезающая переменная из внешней области в Python (ч.1)
Когда исключение было назначено с использованием as target, оно очищается в конце except предложения.
Это означает, что исключению должно быть присвоено другое имя, чтобы иметь возможность ссылаться на него после предложения except. Исключения удаляются, потому что с привязкой к ним обратной трассировки они образуют ссылочный цикл с фреймом стека, сохраняя все локальные файлы в этом фрейме живыми до тех пор, пока не произойдет следующая сборка мусора.
#theory // Just Python & Max
Когда исключение было назначено с использованием as target, оно очищается в конце except предложения.
Это означает, что исключению должно быть присвоено другое имя, чтобы иметь возможность ссылаться на него после предложения except. Исключения удаляются, потому что с привязкой к ним обратной трассировки они образуют ссылочный цикл с фреймом стека, сохраняя все локальные файлы в этом фрейме живыми до тех пор, пока не произойдет следующая сборка мусора.
#theory // Just Python & Max
Исчезающая переменная из внешней области в Python (ч.2)
Эти предложения не ограничены в Python. Все в примере присутствует в той же области видимости, а переменная e была удалена из-за выполнения except предложения. То же самое не относится к функциям, которые имеют свои отдельные внутренние области.
В Python 2.x имя переменной e присваивается Exception() экземпляру, поэтому при попытке печати ничего не выводится.
#theory // Just Python & Max
Эти предложения не ограничены в Python. Все в примере присутствует в той же области видимости, а переменная e была удалена из-за выполнения except предложения. То же самое не относится к функциям, которые имеют свои отдельные внутренние области.
В Python 2.x имя переменной e присваивается Exception() экземпляру, поэтому при попытке печати ничего не выводится.
#theory // Just Python & Max
Таинственное преобразование типа ключа в Python (ч.1)
И объект, s и строка "s" имеют одинаковое значение, потому что SomeClass наследуют hash метод str класса.
SomeClass("s") == "s" вычисляется как, True потому что SomeClass также наследует eq метод от str класса.
#theory // Just Python & Max
И объект, s и строка "s" имеют одинаковое значение, потому что SomeClass наследуют hash метод str класса.
SomeClass("s") == "s" вычисляется как, True потому что SomeClass также наследует eq метод от str класса.
#theory // Just Python & Max
Таинственное преобразование типа ключа в Python (ч.2)
Поскольку оба объекта имеют одинаковое значение и равны, они представлены одним и тем же ключом в словаре.
Для желаемого поведения мы можем переопределить eq метод в SomeClass
#theory // Just Python & Max
Поскольку оба объекта имеют одинаковое значение и равны, они представлены одним и тем же ключом в словаре.
Для желаемого поведения мы можем переопределить eq метод в SomeClass
#theory // Just Python & Max
Давайте посмотрим, сможете ли вы догадаться об этом в Python? (ч.1)
Согласно справочнику по языку Python, операторы присваивания имеют вид
Оператор присваивания вычисляет список выражений (помните, что это может быть одно выражение или список, разделенный запятыми, последний выдает кортеж) и присваивает отдельный результирующий объект каждому из целевых списков слева направо.
+ In (target_list "=")+ означает, что может быть один или более целевых списков. В данном случае целевыми списками являются a, b и a[b] (обратите внимание, что список выражений равен ровно одному, что в нашем случае и есть {}, 5).
После вычисления списка выражений его значение распаковывается в целевые списки слева направо. Итак, в нашем случае сначала {}, 5 кортеж распаковывается в a, b, и теперь у нас есть a = {} и b = 5.
a теперь присвоен {}, который является изменяемым объектом.
#theory // Just Python & Max
Согласно справочнику по языку 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 & Max
Давайте посмотрим, сможете ли вы догадаться об этом в Python? (ч.2)
Теперь мы устанавливаем ключ 5 в словаре на кортеж, ({}, 5) создающий циклическую ссылку ({...} в выходных данных ссылается на тот же объект, на который a уже ссылается). Другим более простым примером циклической ссылки может быть.
Аналогично обстоит дело в нашем примере (a[b][0] это тот же объект, что и a)
#theory // Just Python & Max
Теперь мы устанавливаем ключ 5 в словаре на кортеж, ({}, 5) создающий циклическую ссылку ({...} в выходных данных ссылается на тот же объект, на который a уже ссылается). Другим более простым примером циклической ссылки может быть.
Аналогично обстоит дело в нашем примере (a[b][0] это тот же объект, что и a)
#theory // Just Python & Max
Превышен лимит на преобразование целых строк в 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 & Max
Этот вызов 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 & Max
Упрямая del операция в Python(ч.1)
Фух, наконец-то удалил. Возможно, вы уже догадались, что спасло del от вызова при нашей первой попытке удаления x.
del x напрямую не вызывает x.del().
При del x обнаружении Python удаляет имя x из текущей области видимости и уменьшает на 1 количество ссылок на объект, на который x ссылается. del() вызывается только тогда, когда количество ссылок на объект достигает нуля.
#theory // Just Python & Max
Фух, наконец-то удалил. Возможно, вы уже догадались, что спасло del от вызова при нашей первой попытке удаления x.
del x напрямую не вызывает x.del().
При del x обнаружении Python удаляет имя x из текущей области видимости и уменьшает на 1 количество ссылок на объект, на который x ссылается. del() вызывается только тогда, когда количество ссылок на объект достигает нуля.
#theory // Just Python & Max
Упрямая del операция в Python(ч.2)
Во втором фрагменте вывода del() не был вызван, потому что предыдущий оператор (>>> y) в интерактивном интерпретаторе создал другую ссылку на тот же объект (в частности, на _ магическую переменную, которая ссылается на результирующее значение последнего не None выражения в REPL), таким образом предотвращая достижение нулевого значения количества ссылок при del y обнаружении.
Вызов globals (или, на самом деле, выполнение чего-либо, что не будет иметь None результата) заставил _ ссылаться на новый результат, отбрасывая существующую ссылку. Теперь количество ссылок достигло 0, и мы видим, что "Удалено!" печатается (наконец-то!).
#theory // Just Python & Max
Во втором фрагменте вывода del() не был вызван, потому что предыдущий оператор (>>> y) в интерактивном интерпретаторе создал другую ссылку на тот же объект (в частности, на _ магическую переменную, которая ссылается на результирующее значение последнего не None выражения в REPL), таким образом предотвращая достижение нулевого значения количества ссылок при del y обнаружении.
Вызов globals (или, на самом деле, выполнение чего-либо, что не будет иметь None результата) заставил _ ссылаться на новый результат, отбрасывая существующую ссылку. Теперь количество ссылок достигло 0, и мы видим, что "Удалено!" печатается (наконец-то!).
#theory // Just Python & Max
Переменная вне области видимости в Python(ч.1)
Когда вы присваиваете переменной в области видимости, она становится локальной для этой области. Таким образом, a становится локальным для области another_func, но он не был инициализирован ранее в той же области, что выдает ошибку.
#theory // Just Python & Max
Когда вы присваиваете переменной в области видимости, она становится локальной для этой области. Таким образом, a становится локальным для области another_func, но он не был инициализирован ранее в той же области, что выдает ошибку.
#theory // Just Python & Max
Переменная вне области видимости в Python(ч.2)
Чтобы изменить переменную внешней области a в another_func, мы должны использовать global ключевое слово.
В another_closure_func, a становится локальным для области another_inner_func, но он не был инициализирован ранее в той же области, поэтому выдает ошибку.
#theory // Just Python & Max
Чтобы изменить переменную внешней области a в another_func, мы должны использовать global ключевое слово.
В another_closure_func, a становится локальным для области another_inner_func, но он не был инициализирован ранее в той же области, поэтому выдает ошибку.
#theory // Just Python & Max
Переменная вне области видимости в Python (ч.3)
Чтобы изменить переменную внешней области a в another_inner_func, используйте nonlocal ключевое слово. Нелокальный оператор используется для ссылки на переменные, определенные в ближайшей внешней (исключая глобальную) области видимости.
Ключевые слова global и nonlocal говорят интерпретатору python не объявлять новые переменные и искать их в соответствующих внешних областях.
Прочтите это короткое, но потрясающее руководство, чтобы узнать больше о том, как работают пространства имен и разрешение области видимости в Python.
#theory // Just Python & Max
Чтобы изменить переменную внешней области a в another_inner_func, используйте nonlocal ключевое слово. Нелокальный оператор используется для ссылки на переменные, определенные в ближайшей внешней (исключая глобальную) области видимости.
Ключевые слова global и nonlocal говорят интерпретатору python не объявлять новые переменные и искать их в соответствующих внешних областях.
Прочтите это короткое, но потрясающее руководство, чтобы узнать больше о том, как работают пространства имен и разрешение области видимости в Python.
#theory // Just Python & Max
Удаление элемента списка во время итерации в Python (ч.1)
Никогда не стоит менять объект, над которым вы выполняете итерацию. Правильный способ сделать это - выполнить итерацию по копии объекта вместо этого, и list_3[:] делает именно это.
Разница между del, remove и pop:
del var_name просто удаляет привязку var_name из локального или глобального пространства имен (вот почему list_1 это не влияет).
remove удаляет первое совпадающее значение, а не конкретный индекс, повышает ValueError, если значение не найдено.
pop удаляет элемент с определенным индексом и возвращает его, поднимает, IndexError если указан недопустимый индекс.
#theory // Just Python & Max
Никогда не стоит менять объект, над которым вы выполняете итерацию. Правильный способ сделать это - выполнить итерацию по копии объекта вместо этого, и list_3[:] делает именно это.
Разница между del, remove и pop:
del var_name просто удаляет привязку var_name из локального или глобального пространства имен (вот почему list_1 это не влияет).
remove удаляет первое совпадающее значение, а не конкретный индекс, повышает ValueError, если значение не найдено.
pop удаляет элемент с определенным индексом и возвращает его, поднимает, IndexError если указан недопустимый индекс.
#theory // Just Python & Max
Удаление элемента списка во время итерации в Python (ч.2)
Почему вывод такой[2, 4]?
Итерация списка выполняется индекс за индексом, и когда мы удаляем 1 из list_2 или list_4, содержимое списков теперь [2, 3, 4]. Остальные элементы сдвинуты вниз, т.Е. 2 находятся с индексом 0, а 3 - с индексом 1. Поскольку следующая итерация будет смотреть на индекс 1 (который является 3), 2 он полностью пропускается. Аналогичная вещь произойдет с каждым альтернативным элементом в последовательности списков.
Обратитесь к этому потоку StackOverflow, объясняющему пример
Смотрите также этот приятный поток StackOverflow для аналогичного примера, связанного со словарями в Python.
#theory // Just Python & Max
Почему вывод такой[2, 4]?
Итерация списка выполняется индекс за индексом, и когда мы удаляем 1 из list_2 или list_4, содержимое списков теперь [2, 3, 4]. Остальные элементы сдвинуты вниз, т.Е. 2 находятся с индексом 0, а 3 - с индексом 1. Поскольку следующая итерация будет смотреть на индекс 1 (который является 3), 2 он полностью пропускается. Аналогичная вещь произойдет с каждым альтернативным элементом в последовательности списков.
Обратитесь к этому потоку StackOverflow, объясняющему пример
Смотрите также этот приятный поток StackOverflow для аналогичного примера, связанного со словарями в Python.
#theory // Just Python & Max