⚡️ Упрощаем создание декораторов
Помните, мы уже говорили про создание декораторов и классов-декораторов. В этот раз мы поговорим о декораторе, который используется для создания этих самых декораторов.
Для этого мы воспользуемся декоратором
Её задача — выдавать себя за настоящую функцию, которая использует декоратор. То есть, она подменивает значения name и doc на значения реальной функции.
Если мы попытаемся получить имя или документацию функции, использующую декоратор, то мы получим все значения wrapper. Это может сбить некоторые редакторы и программистов с толку, поэтому многие используют
#миниурок #functools #декоратор
Помните, мы уже говорили про создание декораторов и классов-декораторов. В этот раз мы поговорим о декораторе, который используется для создания этих самых декораторов.
Для этого мы воспользуемся декоратором
@wraps
из модуля functools — это упрощение для функции functools.update_wrapper.Её задача — выдавать себя за настоящую функцию, которая использует декоратор. То есть, она подменивает значения name и doc на значения реальной функции.
Если мы попытаемся получить имя или документацию функции, использующую декоратор, то мы получим все значения wrapper. Это может сбить некоторые редакторы и программистов с толку, поэтому многие используют
@wraps
, как на примере выше.#миниурок #functools #декоратор
⚡️ Задачка с собеседования | #Medium
Условие:
Нужно написать код, который будет переводить римские символы в привычную нам десятичную систему (про символы можно почитать тут).
Пример:
roman_to_int('XXI') -> 21
roman_to_int('IV') -> 4
roman_to_int('I') -> 1
roman_to_int('MMXXI') -> 2021
roman_to_int('LDVLIV') -> 499
📌 Пишите ваше решение в комментариях. Решение будет через несколько часов на этом канале. 👇
#Задачка_с_собеседования
Условие:
Нужно написать код, который будет переводить римские символы в привычную нам десятичную систему (про символы можно почитать тут).
Пример:
roman_to_int('XXI') -> 21
roman_to_int('IV') -> 4
roman_to_int('I') -> 1
roman_to_int('MMXXI') -> 2021
roman_to_int('LDVLIV') -> 499
📌 Пишите ваше решение в комментариях. Решение будет через несколько часов на этом канале. 👇
#Задачка_с_собеседования
⚡️ Легко создаём интерфейс командной строки
Для этого воспользуемся typer — модуль с открытым исходным кодом, позволяющий взаимодействовать с приложением из командной строки. В отличие от fire, он интуитивно понятнее и имеет больший функционал.
Установка:
Первый, если у вас всего один метод для работы, то вы можете воспользоваться typer.run, чтобы принять один аргумент — функцию.
Если же команд больше, то создайте класс Typer (на примере выше — app), и воспользуйтесь декоратором command.
После настройки всех функций, просто запустите приложение app().
#миниурок #typer
Для этого воспользуемся typer — модуль с открытым исходным кодом, позволяющий взаимодействовать с приложением из командной строки. В отличие от fire, он интуитивно понятнее и имеет больший функционал.
Установка:
pip install typer
Здесь есть два варианта развития события:Первый, если у вас всего один метод для работы, то вы можете воспользоваться typer.run, чтобы принять один аргумент — функцию.
Если же команд больше, то создайте класс Typer (на примере выше — app), и воспользуйтесь декоратором command.
После настройки всех функций, просто запустите приложение app().
#миниурок #typer
Что выведет код выше?
Anonymous Quiz
20%
34125
15%
34521
21%
['3', '4', '1', '2', '5']
25%
Ошибку
19%
Узнать ответ
⚡️ Что такое ссылочные типы?
Каждый раз, когда создаётся класс, данные записываются в память, а вы получаете ссылку на объект. Поскольку класс возвращает ссылку, он является ссылочным типом.
С помощью ссылок вы можете взаимодействовать с объектом. Например, считывать данные или редактировать их.
Также, ссылки передаются функциям, поэтому все изменения внутри функции повлияют на передаваемый класс, из-за чего часто появляются непредвиденные баги.
Кстати, dict, list, set это всё ссылочные типы. Будьте осторожны, если собираетесь создавать методы для работы с ними.
А вот если вам нужна посмотреть тот самый адрес объекта в памяти, вы можете воспользоваться id.
#теория
Каждый раз, когда создаётся класс, данные записываются в память, а вы получаете ссылку на объект. Поскольку класс возвращает ссылку, он является ссылочным типом.
С помощью ссылок вы можете взаимодействовать с объектом. Например, считывать данные или редактировать их.
Также, ссылки передаются функциям, поэтому все изменения внутри функции повлияют на передаваемый класс, из-за чего часто появляются непредвиденные баги.
Кстати, dict, list, set это всё ссылочные типы. Будьте осторожны, если собираетесь создавать методы для работы с ними.
А вот если вам нужна посмотреть тот самый адрес объекта в памяти, вы можете воспользоваться id.
#теория
👍1
⚡️ Задачка с собеседования | #Easy
Условие:
Вы — разработчик игры и у вас есть три уровня. За их прохождение даётся различное кол-во очков, оно указано в mult_round.
Вам необходимо написать функцию, которая будет считать трёх игроков с максимальным счётом.
На вход идёт словарь типа Имя игрока: результаты раунда (массив). Массив может быть разным из-за ошибки вычисления или если игрок вышел во время раунда (пустой массив или меньше трёх элементов).
Подсчёт идёт за счёт перемножения количества убитых врагов и количества очков за раунд.
Пример — на изображении выше.
📌 Пишите ваше решение в комментариях. Решение будет через несколько часов на этом канале. 👇
#Задачка_с_собеседования
Условие:
Вы — разработчик игры и у вас есть три уровня. За их прохождение даётся различное кол-во очков, оно указано в mult_round.
Вам необходимо написать функцию, которая будет считать трёх игроков с максимальным счётом.
На вход идёт словарь типа Имя игрока: результаты раунда (массив). Массив может быть разным из-за ошибки вычисления или если игрок вышел во время раунда (пустой массив или меньше трёх элементов).
Подсчёт идёт за счёт перемножения количества убитых врагов и количества очков за раунд.
Пример — на изображении выше.
📌 Пишите ваше решение в комментариях. Решение будет через несколько часов на этом канале. 👇
#Задачка_с_собеседования
👍1
⚡️ Как не редактировать ссылочные типы?
Тут у нас есть два варианта:
Первый — преобразовать аргумент в ожидаемый тип, как на примере выше.
Таким образом вы получите копию объекта и будете уверены, что параметр имеет необходимый тип.
Но если у вас нет доступа к исходному коду функции, можно воспользоваться модулем copy. Одноимённый метод copy возвращает поверхностную копию объекта, а deepcopy — глубокую.
Разница между ними в том, что глубокое копирование также создаёт копию всех классов внутри.
#миниурок #copy
Тут у нас есть два варианта:
Первый — преобразовать аргумент в ожидаемый тип, как на примере выше.
Таким образом вы получите копию объекта и будете уверены, что параметр имеет необходимый тип.
Но если у вас нет доступа к исходному коду функции, можно воспользоваться модулем copy. Одноимённый метод copy возвращает поверхностную копию объекта, а deepcopy — глубокую.
Разница между ними в том, что глубокое копирование также создаёт копию всех классов внутри.
#миниурок #copy
⚡️ Учимся работать с дебагером
Часто бывает тяжело находить ошибки с простым использованием print. Тогда можно пройтись по коду и разобраться, что конкретно не так.
В python есть встроенный дебагер — модуль pdb. Для начала работы с ним напишите
Вот парочка команд этого обработчика:
w(here) — выводит строку, на которой сейчас находится дебагер.
s(tep) — выполняет линию кода и останавливается при первом вхождении.
n(next) выполняется до того, пока указатель не будет на следующей строке.
a(args) — выводит аргументы функции.
debug — позволяет выполнять код, взаимодействуя с объектами внутри.
Часто бывает тяжело находить ошибки с простым использованием print. Тогда можно пройтись по коду и разобраться, что конкретно не так.
В python есть встроенный дебагер — модуль pdb. Для начала работы с ним напишите
python3 -m pdb script_name.py
в консоль. Вот парочка команд этого обработчика:
w(here) — выводит строку, на которой сейчас находится дебагер.
s(tep) — выполняет линию кода и останавливается при первом вхождении.
n(next) выполняется до того, пока указатель не будет на следующей строке.
a(args) — выводит аргументы функции.
debug — позволяет выполнять код, взаимодействуя с объектами внутри.
⚡️ Задачка с собеседования | #Easy
Условие:
Ваша задача на этот раз — просто написать функцию для просчёта факториала.
Пример:
factorial(10) -> 3628800
factorial(3) -> 6
factorial(1) -> 1
factorial(-1) -> 1
📌 Пишите ваше решение в комментариях. Решение будет через несколько часов на этом канале. 👇
#Задачка_с_собеседования
Условие:
Ваша задача на этот раз — просто написать функцию для просчёта факториала.
Пример:
factorial(10) -> 3628800
factorial(3) -> 6
factorial(1) -> 1
factorial(-1) -> 1
📌 Пишите ваше решение в комментариях. Решение будет через несколько часов на этом канале. 👇
#Задачка_с_собеседования
⚡️ Динамически создаём классы
Думаю многие знают про функцию type, она возвращает тип объекта. Но что если я скажу вам, что с помощью неё можно создавать классы?
Тут функция принимает другие данные, это: первое — строка с названием класса, кортеж из типов, которые будут родителями и словарь из атрибутов будущего класса.
Как результат работы, мы получаем новый тип, с которым после можем взаимодействовать, например, создавая экземпляры.
Примечательно, что если вы попробуете взять атрибут
#теория
Думаю многие знают про функцию type, она возвращает тип объекта. Но что если я скажу вам, что с помощью неё можно создавать классы?
Тут функция принимает другие данные, это: первое — строка с названием класса, кортеж из типов, которые будут родителями и словарь из атрибутов будущего класса.
Как результат работы, мы получаем новый тип, с которым после можем взаимодействовать, например, создавая экземпляры.
Примечательно, что если вы попробуете взять атрибут
__class__
, то получите тип объекта.#теория
Что выведет код выше?
Anonymous Quiz
12%
[1, 5]
24%
[6]
15%
array([6])
15%
array([1, 5])
13%
Ошибку
21%
Узнать ответ
⚡️ Часто используемые методы в numpy
Numpy — это библиотека для выполнения математических операций. Она быстрее и имеет больше возможностей, чем Python по умолчанию.
• np.array — создаёт numpy массив из списка. np.zeros, np.ones, np.empty также создают массив, но заполняют его нулями, единицами, и случайными значениями.
• p.concatenate — соединяет несколько массивов в один. Принимает кортеж из массивов. Также можно передать axis, который будет считать, в каком направлении их нужно соединять.
• arr.reshape — преобразует форму arr в переданный аргумент. Какая форма установлена сейчас, можно посмотреть, написав arr.shape.
#миниурок #numpy
Numpy — это библиотека для выполнения математических операций. Она быстрее и имеет больше возможностей, чем Python по умолчанию.
• np.array — создаёт numpy массив из списка. np.zeros, np.ones, np.empty также создают массив, но заполняют его нулями, единицами, и случайными значениями.
• p.concatenate — соединяет несколько массивов в один. Принимает кортеж из массивов. Также можно передать axis, который будет считать, в каком направлении их нужно соединять.
• arr.reshape — преобразует форму arr в переданный аргумент. Какая форма установлена сейчас, можно посмотреть, написав arr.shape.
#миниурок #numpy
⚡️ Задачка с собеседования | #Easy
Условие:
Ваша задача — написать функцию, которая проверяет, является ли число простым.
Простые числа — числа, которые делятся нацело только на единицу и на само себя.
Пример:
is_prime_number(1) -> True
is_prime_number(2) -> True
is_prime_number(9) -> False
is_prime_number(117) -> False
is_prime_number(127) -> True
📌 Пишите ваше решение в комментариях. Решение будет через несколько часов на этом канале. 👇
#Задачка_с_собеседования
Условие:
Ваша задача — написать функцию, которая проверяет, является ли число простым.
Простые числа — числа, которые делятся нацело только на единицу и на само себя.
Пример:
is_prime_number(1) -> True
is_prime_number(2) -> True
is_prime_number(9) -> False
is_prime_number(117) -> False
is_prime_number(127) -> True
📌 Пишите ваше решение в комментариях. Решение будет через несколько часов на этом канале. 👇
#Задачка_с_собеседования