Кэширование строк
Стоит отметить, что это очень сильно зависит от интерпретатора Python. Также правила могут измениться в будущем.
Короткие строки в Python кэшируются интерпретатором при инициализации. Это используется для сохранения памяти.
Если вы хотите поэкспериментировать, можете установить Python 2.7 и поиграться с функцией
#объяснение
Стоит отметить, что это очень сильно зависит от интерпретатора Python. Также правила могут измениться в будущем.
Короткие строки в Python кэшируются интерпретатором при инициализации. Это используется для сохранения памяти.
Если вы хотите поэкспериментировать, можете установить Python 2.7 и поиграться с функцией
intern()
, которая принудительно кэширует строку.#объяснение
👍21🤔2
Python оптимизировал создание строки
С помощью dis мы можем посмотреть байт-код программы.
Здесь мы видим, что 'hello' и 'hell' + 'o' ничем не отличается друг от друга, а значит Python поступил по умному и оптимизировал код.
#объяснение
С помощью dis мы можем посмотреть байт-код программы.
Здесь мы видим, что 'hello' и 'hell' + 'o' ничем не отличается друг от друга, а значит Python поступил по умному и оптимизировал код.
#объяснение
👍26❤🔥3🤔2
Разница между is и ==
Каждый объект хранится в памяти и имеет свой номер, по которому можно его найти. Этот номер можно получить с помощью функции
is занимается сравниванием этих самых адресов. В то время как == вызывает функцию
Представьте куб, а потом ещё один такой же. Они одинаковые, но это два абсолютно разных объекта. Также и в программировании.
#объяснение
Каждый объект хранится в памяти и имеет свой номер, по которому можно его найти. Этот номер можно получить с помощью функции
id()
.is занимается сравниванием этих самых адресов. В то время как == вызывает функцию
__eq__
и предназначения для сравнения значений класса.Представьте куб, а потом ещё один такой же. Они одинаковые, но это два абсолютно разных объекта. Также и в программировании.
#объяснение
👍39🤔3❤1
Булевые операции
#объяснение
x or y
— если x правда (True), возвращает x, иначе y.x and y
— если x правда (True), возвращает y, иначе x.#объяснение
🤯108👍47👎4
Про переменные и их названия
В python можно встретить переменные по типу
#объяснение
В python можно встретить переменные по типу
name
, _name
, __name
. Но что значат эти подчёркивания перед названием?_name
— индикатор того, что это внутренняя переменная и работать с ней напрямую не стоит. Также при from M import *
не импортирует объекты, что начинаются на _. __name
— заменяет имя на _classname__name
, где classname — это имя текущего класса с удаленными начальными символами подчеркивания. Используется для определения частных переменных, которыми никто не должен пользоваться.#объяснение
👍57🤔16❤1👎1
Что такое
Это декоратор из модуля functools, который используется для создания декораторов.
Он обновляет значения
Подробнее можно почитать в документации.
#объяснение
@wraps
?Это декоратор из модуля functools, который используется для создания декораторов.
Он обновляет значения
__module__
, __name__
, __doc__
на значение реальной функции, а не декоратора, а также добавляет __wrapped__
для получения доступа к декорируемой функции.Подробнее можно почитать в документации.
#объяснение
👍12👏8🤯6🤔2
Про copy
В python есть модуль, который называется copy. У него только две функции:
#модули
В python есть модуль, который называется copy. У него только две функции:
copy()
и deepcopy()
.copy(x)
— поверхностно копирует объект и вставляет в него ссылки на объекты, обнаруженные в оригинале.deepcopy(x)
— Создаёт новый объект и рекурсивно вставляет в него копии объектов, которые нашёл в оригинале.#модули
🤔23👍14🤯6❤3😱3🔥2
__getattribute__
и __getattr__
Это особые методы, которые вызываются при попытке получить какой-либо атрибут класса. Например, foo.var вызовет __getattribute__
, а после, возможно __getattr__
.Отличие между методами только в том, что
__getattribute__
используется всегда, а __getattr__
только если атрибут не найден.#объяснение
👍26🔥5🤔3❤1
Статические переменные
Это переменная, которая создаётся вместе с типом и существует до закрытия приложения.
Все переменные, что находится внутри класса, но не попадают в ни один метод являются статическими.
#объяснение
Это переменная, которая создаётся вместе с типом и существует до закрытия приложения.
Все переменные, что находится внутри класса, но не попадают в ни один метод являются статическими.
#объяснение
👍14🔥3
Оператор моржа
Это фишка Python c версии 3.9. Она позволяет задавать значение переменной и одновременно его возвращать для последующей обработки.
Его довольно удобно использовать в генераторных выражениях, ведь это делает код не только чище, но и быстрее.
#объяснение
Это фишка Python c версии 3.9. Она позволяет задавать значение переменной и одновременно его возвращать для последующей обработки.
Его довольно удобно использовать в генераторных выражениях, ведь это делает код не только чище, но и быстрее.
#объяснение
👍42🤯23🔥4🥰1
Возможности срезов
С помощью срезов мы можем менять элементы списка. Называют это так: «Изменение путем присваивания».
Таким образом мы заменяем элементы внутри этого среза другими из итератора (list, tuple, range).
С их помощью мы также можем добавлять/удалять элементы, опустошать список и многое другое.
Стоит отметить, что в разреженных срезах ([::2]) такое не работает, если длина итератора не равна длине результата среза.
#объяснение
С помощью срезов мы можем менять элементы списка. Называют это так: «Изменение путем присваивания».
Таким образом мы заменяем элементы внутри этого среза другими из итератора (list, tuple, range).
С их помощью мы также можем добавлять/удалять элементы, опустошать список и многое другое.
Стоит отметить, что в разреженных срезах ([::2]) такое не работает, если длина итератора не равна длине результата среза.
#объяснение
👍51🤯12❤🔥1👾1
Сравнение последовательностей
При использовании оператор больше (>) или меньше (<) с строками, котрежами, списками, они сравниваются последовательно, то есть элемент с элементом.
Есть только небольшой нюанс при проверке строк. Они сравниваются по их позиции в таблице Unicode, которую можно получить с помощью
#объяснение
При использовании оператор больше (>) или меньше (<) с строками, котрежами, списками, они сравниваются последовательно, то есть элемент с элементом.
Есть только небольшой нюанс при проверке строк. Они сравниваются по их позиции в таблице Unicode, которую можно получить с помощью
ord(char)
.#объяснение
👍28❤7
Нижние подчёркивание между цифрами
Они никак не влияют на приложение и используются для того, чтобы числа было удобнее считывать при больших значениях.
Таким образом можно разделять десятки, сотни, тысячи и так далее.
#объяснение
Они никак не влияют на приложение и используются для того, чтобы числа было удобнее считывать при больших значениях.
Таким образом можно разделять десятки, сотни, тысячи и так далее.
#объяснение
👍60🤯16❤5🤔3
Про упаковку и распаковку
Распаковку задаёт переменным значения итерируемого объекта (список, кортеж, строка, генератор).
Упаковка позволяет собрать несколько значений в один список и после работать с ними.
Эти фишки делают код более красивым и элегантным, но стоит знать меру.
#объяснение
Распаковку задаёт переменным значения итерируемого объекта (список, кортеж, строка, генератор).
Упаковка позволяет собрать несколько значений в один список и после работать с ними.
Эти фишки делают код более красивым и элегантным, но стоит знать меру.
#объяснение
👍52❤6🤩2
Что такое
Каждый раз, когда мы импортируем код, он весь выполняется точно так же, словно мы его просто запустили. Чтобы избежать странного поведения, как на картинке, стоит использовать
Переменная получает значение '
#теория
__name__
?Каждый раз, когда мы импортируем код, он весь выполняется точно так же, словно мы его просто запустили. Чтобы избежать странного поведения, как на картинке, стоит использовать
__name__
.Переменная получает значение '
__main__
', если программу запустили напрямую (python file.py
). Если же файл импортировали как модуль, он получает своё название.#теория
👍10🍌1
⚡️ Фабричный метод
Фабричный метод используется как средство предоставления фабричных интерфейсов для создания объектов.
Они позволяют ослабить связи в коде и упростить его: чаще всего он используется, если вам нужно создать объект по какому-то условию.
Таким образом, мы перемещаем большое количество if/elif/else-кода в отдельный метод.
#паттерны
Фабричный метод используется как средство предоставления фабричных интерфейсов для создания объектов.
Они позволяют ослабить связи в коде и упростить его: чаще всего он используется, если вам нужно создать объект по какому-то условию.
Таким образом, мы перемещаем большое количество if/elif/else-кода в отдельный метод.
#паттерны
👍11
args и kwargs
Бывает ситуации, когда мы не знаем, сколько пользователей передаст параметров функции. В таком случае используют
Эти имена не имеют никакого значения, самое главное — символы звёздочки в начале.
#объяснение
Бывает ситуации, когда мы не знаем, сколько пользователей передаст параметров функции. В таком случае используют
*args
и **kwargs
.*args
— кортеж со всем позиционными аргументами. Позиционные это те, что передаются по позиции (спасибо, капитан очевидность).**kwargs
— словарь с ключевыми аргументами. Ключевые, как вы поняли, передаются по ключу, то есть key=value
.Эти имена не имеют никакого значения, самое главное — символы звёздочки в начале.
#объяснение
👍36🔥2👎1
try/except
Эта конструкция используется для «ловли» ошибок и их обработки. Например, если пользователь неправильно ввёл число, попросить его сделать это заново.
#объяснение
Эта конструкция используется для «ловли» ошибок и их обработки. Например, если пользователь неправильно ввёл число, попросить его сделать это заново.
try
— здесь хранится код, который может выдать ошибку.except Exception
— если появилась ошибка, будет выполняться код из этого блока.else
— ошибок не было? Отлично, значит после try выполняем этот блок.finally
— выполняется всегда. Выдало ошибку, не выдало ошибку, функция использовала return — не имеет значение.#объяснение
👍57🔥1