Ну, что-то здесь не так...
Почему в первом выводе у нас получилось 10, а не 100?
Это потому что мы смешали табуляцию и пробелы. Символ, непосредственно предшествующий возвращению, является "табуляцией", и в другом месте примера код имеет отступ, кратный "4 пробелам".
"tab" в последней строке square функции заменяется восемью пробелами, и она попадает в цикл.
Зато Python 3 достаточно любезен, чтобы автоматически выдавать ошибку в таких случаях.
#theory // Just Python
Почему в первом выводе у нас получилось 10, а не 100?
Это потому что мы смешали табуляцию и пробелы. Символ, непосредственно предшествующий возвращению, является "табуляцией", и в другом месте примера код имеет отступ, кратный "4 пробелам".
"tab" в последней строке square функции заменяется восемью пробелами, и она попадает в цикл.
Зато Python 3 достаточно любезен, чтобы автоматически выдавать ошибку в таких случаях.
#theory // Just Python
+= быстрее
Почему +- быстрее?
+= быстрее, чем + в объединениях более двух строк, потому что первая строка (например, s1 для s1 += s2 + s3) не уничтожается при вычислении полной строки.
#theory // Just Python
Почему +- быстрее?
+= быстрее, чем + в объединениях более двух строк, потому что первая строка (например, s1 для s1 += s2 + s3) не уничтожается при вычислении полной строки.
#theory // Just Python
Давайте создадим гигантскую строку!
Для создании длинной строки не используйте +. В Python str является неизменяемым, поэтому левая и правая строки должны копироваться в новую строку для каждой пары конкатенаций. Если вы объедините четыре строки длиной 10, вы будете копировать (10+10) + ((10+10)+10) + (((10+10)+10)+10) = 90 символы вместо всего лишь 40 символов. Ситуация ухудшается квадратично по мере увеличения количества и размера строки
Поэтому рекомендуется использовать синтаксис .format. or % (однако они работают немного медленнее, чем + для очень коротких строк).
Или лучше, если у вас уже есть содержимое, доступное в виде итеративного объекта, тогда используйте ''.join(iterable_object) который намного быстрее.
#theory // Just Python
Для создании длинной строки не используйте +. В Python str является неизменяемым, поэтому левая и правая строки должны копироваться в новую строку для каждой пары конкатенаций. Если вы объедините четыре строки длиной 10, вы будете копировать (10+10) + ((10+10)+10) + (((10+10)+10)+10) = 90 символы вместо всего лишь 40 символов. Ситуация ухудшается квадратично по мере увеличения количества и размера строки
Поэтому рекомендуется использовать синтаксис .format. or % (однако они работают немного медленнее, чем + для очень коротких строк).
Или лучше, если у вас уже есть содержимое, доступное в виде итеративного объекта, тогда используйте ''.join(iterable_object) который намного быстрее.
#theory // Just Python
Замедление dict поиска
CPython имеет общую функцию поиска по словарю, которая обрабатывает все типы ключей (str, int, любой объект ...), и специализированную для общего случая словарей, состоящих только из str ключей.
Специализированная функция знает, что все существующие ключи являются строками, и использует более быстрое и простое сравнение строк для сравнения ключей вместо вызова eq метода.
При первом обращении к dict экземпляру с помощью не-str ключа он модифицируется, поэтому в будущих поисковых системах используется универсальная функция.
#theory // Just Python
CPython имеет общую функцию поиска по словарю, которая обрабатывает все типы ключей (str, int, любой объект ...), и специализированную для общего случая словарей, состоящих только из str ключей.
Специализированная функция знает, что все существующие ключи являются строками, и использует более быстрое и простое сравнение строк для сравнения ключей вместо вызова eq метода.
При первом обращении к dict экземпляру с помощью не-str ключа он модифицируется, поэтому в будущих поисковых системах используется универсальная функция.
#theory // Just Python
Раздувающийся экземпляр dict (ч.1)
Как мы видим, при каждом новом выводе словари становятся раздутыми. Почему это происходит?
CPython способен повторно использовать один и тот же объект "keys" в нескольких словарях. Это было добавлено в PEP 412 с целью уменьшить использование памяти, особенно в словарях экземпляров, где ключи (атрибуты экземпляра), как правило, являются общими для всех экземпляров.
Эта оптимизация полностью выполняется, например, для словарей, но она отключается, если нарушаются определенные допущения.
#theory // Just Python
Как мы видим, при каждом новом выводе словари становятся раздутыми. Почему это происходит?
CPython способен повторно использовать один и тот же объект "keys" в нескольких словарях. Это было добавлено в PEP 412 с целью уменьшить использование памяти, особенно в словарях экземпляров, где ключи (атрибуты экземпляра), как правило, являются общими для всех экземпляров.
Эта оптимизация полностью выполняется, например, для словарей, но она отключается, если нарушаются определенные допущения.
#theory // Just Python
Раздувающийся экземпляр dict (ч.2)
Словари общего доступа к ключам не поддерживают удаление; если атрибут экземпляра удален, словарь становится "неразделяемым", и общий доступ к ключам отключается для всех будущих экземпляров того же класса.
Кроме того, если размеры ключей словаря были изменены (из-за вставки новых ключей), они остаются общими только в том случае, если они используются точно одним словарем (это позволяет добавлять множество атрибутов в init самого первого созданного экземпляра, не вызывая "общего доступа"). Если при изменении размера существует несколько экземпляров, совместное использование ключей отключается для всех будущих экземпляров одного и того же класса: CPython не может определить, используют ли ваши экземпляры тот же набор атрибутов, и решает отказаться от попыток совместного использования своих ключей.
#theory // Just Python
Словари общего доступа к ключам не поддерживают удаление; если атрибут экземпляра удален, словарь становится "неразделяемым", и общий доступ к ключам отключается для всех будущих экземпляров того же класса.
Кроме того, если размеры ключей словаря были изменены (из-за вставки новых ключей), они остаются общими только в том случае, если они используются точно одним словарем (это позволяет добавлять множество атрибутов в init самого первого созданного экземпляра, не вызывая "общего доступа"). Если при изменении размера существует несколько экземпляров, совместное использование ключей отключается для всех будущих экземпляров одного и того же класса: CPython не может определить, используют ли ваши экземпляры тот же набор атрибутов, и решает отказаться от попыток совместного использования своих ключей.
#theory // Just Python
Изменение ссылок
При постоянной работе с URL часто возникает необходимость сократить длинную ссылку. Для этого есть специальные онлайн-сервисы типа bit.ly, которые сокращают URL до 50 символов. Мы можем создать собственный инструмент для сокращения ссылок при помощи библиотеки pyshorteners.
#theory // Just Python
При постоянной работе с URL часто возникает необходимость сократить длинную ссылку. Для этого есть специальные онлайн-сервисы типа bit.ly, которые сокращают URL до 50 символов. Мы можем создать собственный инструмент для сокращения ссылок при помощи библиотеки pyshorteners.
#theory // Just Python
Проверка на оригинальность
Один из важнейших факторов работы с текстовым контентом — плагиат. Не всегда возможно проверить каждый файл вручную, особенно, если у вас целый пакет файлов. Тут пригодится инструмент для выявления плагиата. Мы можем создать собственный детектор при помощи библиотеки difflib. Ее можно использовать для поиска сходства между двумя или несколькими файлами на одном устройстве.
#theory // Just Python
Один из важнейших факторов работы с текстовым контентом — плагиат. Не всегда возможно проверить каждый файл вручную, особенно, если у вас целый пакет файлов. Тут пригодится инструмент для выявления плагиата. Мы можем создать собственный детектор при помощи библиотеки difflib. Ее можно использовать для поиска сходства между двумя или несколькими файлами на одном устройстве.
#theory // Just Python
Локальный переводчик
Мы живем в многоязычном мире. А поскольку каждый человек может выучить не так уж много языков, то, чтобы понимать друг друга, нам нужны переводчики. Переводчиком может быть и программа. Для создания таких программ в Python есть специальная библиотека — Translator.
#theory // Just Python
Мы живем в многоязычном мире. А поскольку каждый человек может выучить не так уж много языков, то, чтобы понимать друг друга, нам нужны переводчики. Переводчиком может быть и программа. Для создания таких программ в Python есть специальная библиотека — Translator.
#theory // Just Python
Локальный переводчик
Мы живем в многоязычном мире. А поскольку каждый человек может выучить не так уж много языков, то, чтобы понимать друг друга, нам нужны переводчики. Переводчиком может быть и программа. Для создания таких программ в Python есть специальная библиотека — Translator.
#theory // Just Python
Мы живем в многоязычном мире. А поскольку каждый человек может выучить не так уж много языков, то, чтобы понимать друг друга, нам нужны переводчики. Переводчиком может быть и программа. Для создания таких программ в Python есть специальная библиотека — Translator.
#theory // Just Python
Метод remove() для удаления элемента из списка
В этом списке есть строки и целые числа. Есть повторяющиеся элементы: строка «Mars» и число 12.
#theory // Just Python
В этом списке есть строки и целые числа. Есть повторяющиеся элементы: строка «Mars» и число 12.
#theory // Just Python
Второстепенные (ч.1)
Учитывая, что a это число, ++a и --a оба являются допустимыми операторами Python, но ведут себя по-другому по сравнению с аналогичными операторами в таких языках, как C, C ++ или Java.
В грамматике Python нет ++ оператора. На самом деле это два + оператора.
++a разбирается как, +(+a) что переводится как a. Аналогично, вывод инструкции --a может быть оправдан.
В этом потоке StackOverflow обсуждается обоснование отсутствия операторов увеличения и уменьшения в Python.
#theory // Just Python
Учитывая, что a это число, ++a и --a оба являются допустимыми операторами Python, но ведут себя по-другому по сравнению с аналогичными операторами в таких языках, как C, C ++ или Java.
В грамматике Python нет ++ оператора. На самом деле это два + оператора.
++a разбирается как, +(+a) что переводится как a. Аналогично, вывод инструкции --a может быть оправдан.
В этом потоке StackOverflow обсуждается обоснование отсутствия операторов увеличения и уменьшения в Python.
#theory // Just Python
Второстепенные (ч.2)
Вы, должно быть, знаете о операторе Walrus в Python. Но слышали ли вы когда-нибудь о операторе space-invader?
Он используется в качестве альтернативного оператора увеличения вместе с другим
Эта шутка взята из твита Рэймонда Хеттингера. Оператор space invader на самом деле просто неправильно отформатирован a -= (-1). Что эквивалентно a = a - (- 1). Аналогично для a += (+ 1) случая.
#theory // Just Python
Вы, должно быть, знаете о операторе Walrus в Python. Но слышали ли вы когда-нибудь о операторе space-invader?
Он используется в качестве альтернативного оператора увеличения вместе с другим
Эта шутка взята из твита Рэймонда Хеттингера. Оператор space invader на самом деле просто неправильно отформатирован a -= (-1). Что эквивалентно a = a - (- 1). Аналогично для a += (+ 1) случая.
#theory // Just Python
Оператор обратной импликации.
В Python есть недокументированный оператор обратной импликации.
Если вы замените False и True на 0 и 1 и выполните математические вычисления, таблица истинности эквивалентна оператору обратной импликации.
#theory // Just Python
В Python есть недокументированный оператор обратной импликации.
Если вы замените False и True на 0 и 1 и выполните математические вычисления, таблица истинности эквивалентна оператору обратной импликации.
#theory // Just Python
Оператор @
Поскольку мы говорим об операторах, есть также @ оператор для умножения матриц (не волнуйтесь, на этот раз все по-настоящему).
Оператор @ был добавлен в Python 3.5 с учетом интересов научного сообщества. Любой объект может перегрузить matmul магический метод, чтобы определить поведение для этого оператора.
#theory // Just Python
Поскольку мы говорим об операторах, есть также @ оператор для умножения матриц (не волнуйтесь, на этот раз все по-настоящему).
Оператор @ был добавлен в Python 3.5 с учетом интересов научного сообщества. Любой объект может перегрузить matmul магический метод, чтобы определить поведение для этого оператора.
#theory // Just Python
Сколько может хранить переменных функция?
Python использует 2 байта для хранения локальных переменных в функциях. Теоретически это означает, что в функции может быть определено только 65536 переменных. Однако в python встроено удобное решение, которое можно использовать для хранения более 2 ^ 16 имен переменных. Следующий код демонстрирует, что происходит в стеке, когда определено более 65536 локальных переменных (Внимание: этот код печатает около 2 ^ 18 строк текста, так что будьте готовы!)
#theory // Just Python
Python использует 2 байта для хранения локальных переменных в функциях. Теоретически это означает, что в функции может быть определено только 65536 переменных. Однако в python встроено удобное решение, которое можно использовать для хранения более 2 ^ 16 имен переменных. Следующий код демонстрирует, что происходит в стеке, когда определено более 65536 локальных переменных (Внимание: этот код печатает около 2 ^ 18 строк текста, так что будьте готовы!)
#theory // Just Python
f-string
Начиная с Python 3.8, вы можете использовать типичный синтаксис f-string, например f'{some_var=}, для быстрой отладки
#theory // Just Python
Начиная с Python 3.8, вы можете использовать типичный синтаксис f-string, например f'{some_var=}, для быстрой отладки
#theory // Just Python
Сколько может хранить переменных функция?
Python использует 2 байта для хранения локальных переменных в функциях. Теоретически это означает, что в функции может быть определено только 65536 переменных. Однако в python встроено удобное решение, которое можно использовать для хранения более 2 ^ 16 имен переменных. Следующий код демонстрирует, что происходит в стеке, когда определено более 65536 локальных переменных (Внимание: этот код печатает около 2 ^ 18 строк текста, так что будьте готовы!)
#theory // Just Python
Python использует 2 байта для хранения локальных переменных в функциях. Теоретически это означает, что в функции может быть определено только 65536 переменных. Однако в python встроено удобное решение, которое можно использовать для хранения более 2 ^ 16 имен переменных. Следующий код демонстрирует, что происходит в стеке, когда определено более 65536 локальных переменных (Внимание: этот код печатает около 2 ^ 18 строк текста, так что будьте готовы!)
#theory // Just Python
Print
Иногда print метод может выводить значения не сразу.
Это выведет wtfpython через 3 секунды из-за end аргумента, потому что выходной буфер очищается либо после обнаружения, \n либо когда программа завершает выполнение. Мы можем принудительно очистить буфер, передав flush=True аргумент.
#theory // Just Python
Иногда print метод может выводить значения не сразу.
Это выведет wtfpython через 3 секунды из-за end аргумента, потому что выходной буфер очищается либо после обнаружения, \n либо когда программа завершает выполнение. Мы можем принудительно очистить буфер, передав flush=True аргумент.
#theory // Just Python
Count
'abc'.count('') == 4. Вот приблизительная реализация count метода, которая сделала бы вещи более понятными.
Такое поведение обусловлено сопоставлением пустой подстроки ('') с фрагментами длины 0 в исходной строке.
#theory // Just Python
'abc'.count('') == 4. Вот приблизительная реализация count метода, которая сделала бы вещи более понятными.
Такое поведение обусловлено сопоставлением пустой подстроки ('') с фрагментами длины 0 в исходной строке.
#theory // Just Python