Just Python
10.2K subscribers
4.39K photos
11 videos
4.38K links
🐍Простое изучение Python.

Ссылка: @Portal_v_IT

Сотрудничество: @oleginc, @tatiana_inc

Канал на бирже: telega.in/c/justpython_it

РКН: clck.ru/3MnbSc
Download Telegram
Создание мелких копий существующих списков

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

Если же вам необходимо продублировать абсолютно всё, включая и элементы, то необходимо создать глубокую копию списка (copy.deepcopy(x)). Для этой цели пригодится встроенный модуль в Python copy.

#theory // Just Python
Ограничение использования процессора и памяти (ч.1)

Если вместо того, чтобы оптимизировать программу, или улучшить то, как она пользуется процессором, вам нужно просто задать жёсткое ограничение на доступные ей ресурсы, можно воспользоваться соответствующей библиотекой

Тут показано ограничение процессорного времени и объёма памяти. Для того чтобы ограничить использование программой процессора, мы сначала получаем значения нежёсткого и жёсткого (hard) лимитов для конкретного ресурса (RLIMIT_CPU).

#theory // Just Python
Ограничение использования процессора и памяти (ч.2)

Затем мы устанавливаем лимит, используя некое число секунд, задаваемое аргументом seconds, и ранее полученное значение жёсткого лимита. После этого мы регистрируем обработчик signal, который, при превышении выделенного программе процессорного времени, инициирует процедуру выхода. В случае с памятью, мы, опять же, получаем значения для нежёсткого и жёсткого лимитов, после чего устанавливаем ограничение с помощью метода setrlimit, которому передаём размер ограничения (size) и ранее полученное значение жёсткого лимита.

#theory // Just Python
Сравнение быстродействия def и lambda-функций Python. Функции для упрощения жизни

Кому захочется повторять одно и то действие, но с разными параметрами? Никому. Поэтому, есть некоторые вспомогательные функции, для рисования графика по заданным параметрам, для создания черепахи. Кстати, о последнем — черепахи тоже заносятся в общий словарь.

#theory // Just Python
Конкатенация строк

Если нужно конкатенировать список строк, сделать это можно в цикле for, по одной добавляя строки к итоговому результату. Однако такой подход будет весьма неэффективным, особенно в том случае, если список оказывается достаточно длинным. В Python строки являются иммутабельными сущностями. В результате каждая операция по конкатенации строк означает необходимость копирования пары строк в новую строку.

Более эффективный подход к решению этой задачи заключается в использовании функции join()

#theory // Just Python
Настраиваемый логгер-декоратор

Начнем с примера использования. Так мы не перегружаем внимание внутренней сложностью и повышаем шансы создать удачный интерфейс модуля. На этом принципе основана разработка через тестирование — test-driven development (TTD).

У класса Logger есть метод log_msg(), который можно использовать напрямую внутри функций.

#theory // Just Python
Сложение списков

Не всегда операторы в python ведут себя так, как мы привыкли. Например сложение списков.
Как видно, инструкция 28 в случае + простое сложение, а в случае += — сложение на месте, которое не приводит к созданию нового списка. += в данном случае сопоставим по производительности с list.extend.

#theory // Just Python
Анатомия декоратора в Python

Создадим декоратор @hello_decorator.

Декоратор в Python — функция, которая принимает функцию/класс и возвращает функцию/класс. В примере декоратор hello_decorator() принимает функцию f(), и возвращает функцию wrapper().

#theory // Just Python
Кэширование строк

Стоит отметить, что это очень сильно зависит от интерпретатора Python. Также правила могут измениться в будущем.

Короткие строки в Python кэшируются интерпретатором при инициализации. Это используется для сохранения памяти.

Если вы хотите поэкспериментировать, можете установить Python 2.7 и поиграться с функцией intern(), которая принудительно кэширует строку.

#theory // Just Python
Python оптимизировал создание строки

С помощью dis мы можем посмотреть байт-код программы.

Здесь мы видим, что 'hello' и 'hell' + 'o' ничем не отличается друг от друга, а значит Python поступил по умному и оптимизировал код.

#theory // Just Python
Разница между is и ==

Каждый объект хранится в памяти и имеет свой номер, по которому можно его найти. Этот номер можно получить с помощью функции id().

is занимается сравниванием этих самых адресов. В то время как == вызывает функцию __eq__ и предназначения для сравнения значений класса.

Представьте куб, а потом ещё один такой же. Они одинаковые, но это два абсолютно разных объекта. Также и в программировании.

#theory // Just Python
Булевые операции

x or y — если x правда (True), возвращает x, иначе y.

x and y — если x правда (True), возвращает y, иначе x.

#theory // Just Python
Про переменные и их названия

В python можно встретить переменные по типу name, _name, __name. Но что значат эти подчёркивания перед названием?

_name — индикатор того, что это внутренняя переменная и работать с ней напрямую не стоит. Также при from M import * не импортирует объекты, что начинаются на _.

__name — заменяет имя на _classname__name, где classname — это имя текущего класса с удаленными начальными символами подчеркивания. Используется для определения частных переменных, которыми никто не должен пользоваться.

#theory // Just Python
Что такое @wraps?

Это декоратор из модуля functools, который используется для создания декораторов.

Он обновляет значения __module__, __name__, __doc__ на значение реальной функции, а не декоратора, а также добавляет __wrapped__ для получения доступа к декорируемой функции.

Подробнее можно почитать в документации.

#theory // Just Python
Про copy

В python есть модуль, который называется copy. У него только две функции: copy() и deepcopy().

copy(x) — поверхностно копирует объект и вставляет в него ссылки на объекты, обнаруженные в оригинале.

deepcopy(x) — Создаёт новый объект и рекурсивно вставляет в него копии объектов, которые нашёл в оригинале.

#theory // Just Python
__getattribute__ и __getattr__

Это особые методы, которые вызываются при попытке получить какой-либо атрибут класса. Например, foo.var вызовет __getattribute__, а после, возможно __getattr__.

Отличие между методами только в том, что __getattribute__ используется всегда, а __getattr__ только если атрибут не найден.

#theory // Just Python
Нижние подчёркивание между цифрами

Они никак не влияют на приложение и используются для того, чтобы числа было удобнее считывать при больших значениях.

Таким образом можно разделять десятки, сотни, тысячи и так далее.

#theory // Just Python
Возможности срезов

С помощью срезов мы можем менять элементы списка. Называют это так: «Изменение путем присваивания».

Таким образом мы заменяем элементы внутри этого среза другими из итератора (list, tuple, range).

С их помощью мы также можем добавлять/удалять элементы, опустошать список и многое другое.

Стоит отметить, что в разреженных срезах ([::2]) такое не работает, если длина итератора не равна длине результата среза.

#theory // Just Python
Статические переменные

Это переменная, которая создаётся вместе с типом и существует до закрытия приложения.

Все переменные, что находится внутри класса, но не попадают в ни один метод являются статическими.

#theory // Just Python
Про упаковку и распаковку

Распаковку задаёт переменным значения итерируемого объекта (список, кортеж, строка, генератор).

Упаковка позволяет собрать несколько значений в один список и после работать с ними.

Эти фишки делают код более красивым и элегантным, но стоит знать меру.

#theory // Just Python
Что такое __name__ ?

Каждый раз, когда мы импортируем код, он весь выполняется точно так же, словно мы его просто запустили. Чтобы избежать странного поведения, как на картинке, стоит использовать __name__.

Переменная получает значение '__main__', если программу запустили напрямую (python file.py). Если же файл импортировали как модуль, он получает своё название.

#theory // Just Python