else - Предложение для циклов
Наверняка вы знаете, что в пайтоне для циклов for и while предусмотрен блок else. И с этим блоком возникает много путаницы, потому что его действие на первый взгляд неинтуитивно. Но с этим легко справиться.
else Предложение после цикла выполняется только тогда, когда после всех итераций нет явного break. Вы можете думать об этом как о предложении "nobreak".
Наверняка вы знаете, что в пайтоне для циклов for и while предусмотрен блок else. И с этим блоком возникает много путаницы, потому что его действие на первый взгляд неинтуитивно. Но с этим легко справиться.
else Предложение после цикла выполняется только тогда, когда после всех итераций нет явного break. Вы можете думать об этом как о предложении "nobreak".
Многоточие
В Python Ellipsis это глобально доступный встроенный объект, который эквивалентен ... .
1) В качестве заполнителя для кода, который еще не был написан (точно так же, как pass инструкция)
2) В синтаксисе нарезки для представления полных фрагментов в оставшемся направлении
В Python Ellipsis это глобально доступный встроенный объект, который эквивалентен ... .
>>> ...
Ellipsis
В основном многоточие используются для нескольких целей,1) В качестве заполнителя для кода, который еще не был написан (точно так же, как pass инструкция)
2) В синтаксисе нарезки для представления полных фрагментов в оставшемся направлении
else - Предложение в обработке исключений
При написании кода по обработке помимо необязательного finally блока есть еще и необязательный else блок. Напомню, что этот блок кода выполняется если try блок завершился успешно, без летящих исключений.
Зачем нужен else блок, если все можно поместить в try блок?
Пока мое понимание на уровне правила: Если понадобился else блок, то код функции сложноват. Код в else следует поместить в отдельный метод и вызывать не в том куске кода, где хочется написать else, а уровнем по выше, т.е. более высокоуровневой функции.
При написании кода по обработке помимо необязательного finally блока есть еще и необязательный else блок. Напомню, что этот блок кода выполняется если try блок завершился успешно, без летящих исключений.
Зачем нужен else блок, если все можно поместить в try блок?
Пока мое понимание на уровне правила: Если понадобился else блок, то код функции сложноват. Код в else следует поместить в отдельный метод и вызывать не в том куске кода, где хочется написать else, а уровнем по выше, т.е. более высокоуровневой функции.
Inpinity
Как можно представить бесконечное число в python? Независимо от того, какое число вы вводите в программу, ни одно число не должно быть больше этого представления бесконечности.
Это возможно реализовать с помощью inpinity.
При этом хэш бесконечности равен 10⁵ x π. Интересно, что хэш float('-inf') в Python 3 равен "-10⁵ x π", тогда как в Python 2 "-10⁵ x e".
Как можно представить бесконечное число в python? Независимо от того, какое число вы вводите в программу, ни одно число не должно быть больше этого представления бесконечности.
Это возможно реализовать с помощью inpinity.
При этом хэш бесконечности равен 10⁵ x π. Интересно, что хэш float('-inf') в Python 3 равен "-10⁵ x π", тогда как в Python 2 "-10⁵ x e".
Давайте переделаем (ч.1)
Искажение имен используется, чтобы избежать конфликтов именования между различными пространствами имен.
В Python интерпретатор изменяет (искажает) имена членов класса, начинающиеся с __ (двойное подчеркивание, также известное как "dunder") и не заканчивающиеся более чем одним завершающим подчеркиванием, добавляя _NameOfTheClass впереди.
Искажение имен используется, чтобы избежать конфликтов именования между различными пространствами имен.
В Python интерпретатор изменяет (искажает) имена членов класса, начинающиеся с __ (двойное подчеркивание, также известное как "dunder") и не заканчивающиеся более чем одним завершающим подчеркиванием, добавляя _NameOfTheClass впереди.
Давайте переделаем (ч.2)
Итак, чтобы получить доступ к атрибуту __honey в первом фрагменте, нам пришлось добавить _Yo в начало, что предотвратило бы конфликты с атрибутом того же имени, определенным в любом другом классе.
Но тогда почему это не сработало во втором фрагменте? Потому что искажение имен исключает имена, заканчивающиеся двойным подчеркиванием.
Итак, чтобы получить доступ к атрибуту __honey в первом фрагменте, нам пришлось добавить _Yo в начало, что предотвратило бы конфликты с атрибутом того же имени, определенным в любом другом классе.
Но тогда почему это не сработало во втором фрагменте? Потому что искажение имен исключает имена, заканчивающиеся двойным подчеркиванием.
Давайте переделаем (ч.3)
Третий фрагмент также был следствием искажения имени. Имя __variable в инструкции return __variable было искажено до _A__variable, которое также является именем переменной, объявленной нами во внешней области видимости.
Кроме того, если искаженное имя длиннее 255 символов, произойдет усечение.
Третий фрагмент также был следствием искажения имени. Имя __variable в инструкции return __variable было искажено до _A__variable, которое также является именем переменной, объявленной нами во внешней области видимости.
Кроме того, если искаженное имя длиннее 255 символов, произойдет усечение.
Телепортация
Обратите внимание, что массив numpy, созданный в energy_send функции, не возвращается, так что пространство памяти свободно для перераспределения.
numpy.empty() возвращает следующий свободный слот памяти без его повторной инициализации. Эта область памяти просто оказывается той же, которая была только что освобождена (обычно, но не всегда).
Обратите внимание, что массив numpy, созданный в energy_send функции, не возвращается, так что пространство памяти свободно для перераспределения.
numpy.empty() возвращает следующий свободный слот памяти без его повторной инициализации. Эта область памяти просто оказывается той же, которая была только что освобождена (обычно, но не всегда).
Ну, что-то здесь не так...
Почему в первом выводе у нас получилось 10, а не 100?
Это потому что мы смешали табуляцию и пробелы. Символ, непосредственно предшествующий возвращению, является "табуляцией", и в другом месте примера код имеет отступ, кратный "4 пробелам".
"tab" в последней строке square функции заменяется восемью пробелами, и она попадает в цикл.
Зато Python 3 достаточно любезен, чтобы автоматически выдавать ошибку в таких случаях.
Почему в первом выводе у нас получилось 10, а не 100?
Это потому что мы смешали табуляцию и пробелы. Символ, непосредственно предшествующий возвращению, является "табуляцией", и в другом месте примера код имеет отступ, кратный "4 пробелам".
"tab" в последней строке square функции заменяется восемью пробелами, и она попадает в цикл.
Зато Python 3 достаточно любезен, чтобы автоматически выдавать ошибку в таких случаях.
Давайте создадим гигантскую строку!
Для создании длинной строки не используйте +. В Python str является неизменяемым, поэтому левая и правая строки должны копироваться в новую строку для каждой пары конкатенаций. Если вы объедините четыре строки длиной 10, вы будете копировать (10+10) + ((10+10)+10) + (((10+10)+10)+10) = 90 символы вместо всего лишь 40 символов. Ситуация ухудшается квадратично по мере увеличения количества и размера строки
Поэтому рекомендуется использовать синтаксис .format. or % (однако они работают немного медленнее, чем + для очень коротких строк).
Или лучше, если у вас уже есть содержимое, доступное в виде итеративного объекта, тогда используйте ''.join(iterable_object) который намного быстрее.
Для создании длинной строки не используйте +. В Python str является неизменяемым, поэтому левая и правая строки должны копироваться в новую строку для каждой пары конкатенаций. Если вы объедините четыре строки длиной 10, вы будете копировать (10+10) + ((10+10)+10) + (((10+10)+10)+10) = 90 символы вместо всего лишь 40 символов. Ситуация ухудшается квадратично по мере увеличения количества и размера строки
Поэтому рекомендуется использовать синтаксис .format. or % (однако они работают немного медленнее, чем + для очень коротких строк).
Или лучше, если у вас уже есть содержимое, доступное в виде итеративного объекта, тогда используйте ''.join(iterable_object) который намного быстрее.
Замедление dict поиска
CPython имеет общую функцию поиска по словарю, которая обрабатывает все типы ключей (str, int, любой объект ...), и специализированную для общего случая словарей, состоящих только из str ключей.
Специализированная функция знает, что все существующие ключи являются строками, и использует более быстрое и простое сравнение строк для сравнения ключей вместо вызова eq метода.
При первом обращении к dict экземпляру с помощью не-str ключа он модифицируется, поэтому в будущих поисковых системах используется универсальная функция.
CPython имеет общую функцию поиска по словарю, которая обрабатывает все типы ключей (str, int, любой объект ...), и специализированную для общего случая словарей, состоящих только из str ключей.
Специализированная функция знает, что все существующие ключи являются строками, и использует более быстрое и простое сравнение строк для сравнения ключей вместо вызова eq метода.
При первом обращении к dict экземпляру с помощью не-str ключа он модифицируется, поэтому в будущих поисковых системах используется универсальная функция.
Раздувающийся экземпляр dict (ч.1)
Как мы видим, при каждом новом выводе словари становятся раздутыми. Почему это происходит?
CPython способен повторно использовать один и тот же объект "keys" в нескольких словарях. Это было добавлено в PEP 412 с целью уменьшить использование памяти, особенно в словарях экземпляров, где ключи (атрибуты экземпляра), как правило, являются общими для всех экземпляров.
Эта оптимизация полностью выполняется, например, для словарей, но она отключается, если нарушаются определенные допущения.
Как мы видим, при каждом новом выводе словари становятся раздутыми. Почему это происходит?
CPython способен повторно использовать один и тот же объект "keys" в нескольких словарях. Это было добавлено в PEP 412 с целью уменьшить использование памяти, особенно в словарях экземпляров, где ключи (атрибуты экземпляра), как правило, являются общими для всех экземпляров.
Эта оптимизация полностью выполняется, например, для словарей, но она отключается, если нарушаются определенные допущения.
🗓 Время учить Python. 5 июля старт Подготовительного курса!
✔️Упражняемся в браузерном тренажере — учимся понимать и писать код на Python.
✔️Погружаемся в реальный продакшен — создаем конвертер валют вместе с наставником.
✔️ Размещаем изменения на GitHub — получаем основу для своего первого пет-проекта.
🐍 База по Python за 14 дней. На практике. За 990 рублей.
✔️Упражняемся в браузерном тренажере — учимся понимать и писать код на Python.
✔️Погружаемся в реальный продакшен — создаем конвертер валют вместе с наставником.
✔️ Размещаем изменения на GitHub — получаем основу для своего первого пет-проекта.
🐍 База по Python за 14 дней. На практике. За 990 рублей.
Раздувающийся экземпляр dict (ч.2)
Словари общего доступа к ключам не поддерживают удаление; если атрибут экземпляра удален, словарь становится "неразделяемым", и общий доступ к ключам отключается для всех будущих экземпляров того же класса.
Кроме того, если размеры ключей словаря были изменены (из-за вставки новых ключей), они остаются общими только в том случае, если они используются точно одним словарем (это позволяет добавлять множество атрибутов в init самого первого созданного экземпляра, не вызывая "общего доступа"). Если при изменении размера существует несколько экземпляров, совместное использование ключей отключается для всех будущих экземпляров одного и того же класса: CPython не может определить, используют ли ваши экземпляры тот же набор атрибутов, и решает отказаться от попыток совместного использования своих ключей.
Словари общего доступа к ключам не поддерживают удаление; если атрибут экземпляра удален, словарь становится "неразделяемым", и общий доступ к ключам отключается для всех будущих экземпляров того же класса.
Кроме того, если размеры ключей словаря были изменены (из-за вставки новых ключей), они остаются общими только в том случае, если они используются точно одним словарем (это позволяет добавлять множество атрибутов в init самого первого созданного экземпляра, не вызывая "общего доступа"). Если при изменении размера существует несколько экземпляров, совместное использование ключей отключается для всех будущих экземпляров одного и того же класса: CPython не может определить, используют ли ваши экземпляры тот же набор атрибутов, и решает отказаться от попыток совместного использования своих ключей.
Изменение ссылок
При постоянной работе с URL часто возникает необходимость сократить длинную ссылку. Для этого есть специальные онлайн-сервисы типа bit.ly, которые сокращают URL до 50 символов. Мы можем создать собственный инструмент для сокращения ссылок при помощи библиотеки pyshorteners.
При постоянной работе с URL часто возникает необходимость сократить длинную ссылку. Для этого есть специальные онлайн-сервисы типа bit.ly, которые сокращают URL до 50 символов. Мы можем создать собственный инструмент для сокращения ссылок при помощи библиотеки pyshorteners.