Python: задачки и вопросы
Відкрити в Telegram
Вопросы и задачки для подготовки к собеседованиям и прокачки навыков Разместить рекламу: @tproger_sales_bot Правила общения: https://tprg.ru/rules Другие каналы: @tproger_channels Другие наши проекты: https://tprg.ru/media
Показати більше6 959
Підписники
-124 години
-47 днів
-5630 день
Архів дописів
Атрибуты экземпляра создаются посредством присваивания значений атрибутам объекта экземпляра. Они обычно создаются в функциях методов класса, реализованных внутри оператора class, с помощью присваивания значений атрибутам аргумента self (который всегда является подразумеваемым экземпляром).
Однако их тоже можно создавать присваиванием везде, где присутствует ссылка на экземпляр, даже за пределами оператора class. Обычно все атрибуты экземпляра инициализируются в методе конструктора __init__ таким образом, более поздние вызовы методов могут предполагать, что атрибуты уже существуют.
Объяснение: Все три способа являются корректными, но создают разные типы атрибутов:
- attr1 - это атрибут класса, доступный всем экземплярам
- attr2 - это атрибут экземпляра, уникальный для каждого объекта
- attr3 - это атрибут класса, добавленный после определения класса
🌱 Какие из способов создания атрибута класса являются правильными?
Классы всегда вкладываются внутрь модуля. Классы и модули являются пространствами имен, но классы соответствуют операторам (не целым файлам) и поддерживают такие понятия ООП, как множество экземпляров, наследование и перегрузку операций (все перечисленное модули не поддерживают). До известной степени модуль подобен классу с единственным экземпляром без наследования, который соответствует полному файлу кода.
🌱 Что неверно про классы и модули из нижеперечисленного?
Код выведет "b" из-за принципа работы областей видимости LEGB и использования ключевого слова global:
1. Сначала определяется глобальная переменная x со значением "a":
x = "a"
2. Затем определяется функция outer_func(), которая объявляет x как глобальную переменную с помощью ключевого слова global:
def outer_func():
global x
3. Внутри outer_func() определяется вложенная функция nested_func(), которая просто выводит значение x:
def nested_func():
print(x)
4. После определения функций, значение глобальной переменной x изменяется на "b":
x = "b"
Благодаря объявлению global x внутри outer_func(), все обращения к x внутри этой функции (включая вложенные функции) будут ссылаться на глобальную переменную x. Когда nested_func() вызывается и пытается вывести x, она ищет значение x в следующем порядке (LEGB):
— L (Local): локальной переменной x нет;
— E (Enclosing): из-за global x в outer_func, пропускается;
— G (Global): находит x со значением "b";
— B (Built-in): не требуется.
Списки являются изменяемыми объектами, и при присваивании b = a создается ссылка на тот же список, а не его копия. Поэтому при изменении списка b через метод append(), изменения также отражаются в списке a, так как они указывают на один и тот же объект в памяти.
write - это стандартный метод для записи данных в файл. Он может работать с бинарными данными, если файл открыт в бинарном режиме ('wb').
Остальные варианты неверны:
- Output.binary - такого метода нет в стандартной библиотеке Python
- Dump - это не стандартный метод Python для записи данных
- Binary.output - такого метода нет в стандартной библиотеке Python
Пример правильного использования write для бинарной записи:
with open('file.bin', 'wb') as f:
f.write(binary_data)
Выберите стандартный метод Python для записи данных в бинарном режиме:
Код выводит "131211131211" и затем вызывает ошибку IndexError.
rev_func() — рекурсивная функция, но она не имеет условия выхода (базового случая):
1. Начальный вызов: rev_func(x, 3)
- x = [11, 12, 13]
- length = 3
- Выводит x[2] = 13
2. Рекурсивный вызов: rev_func(x, 2)
- Выводит x[1] = 12
3. Рекурсивный вызов: rev_func(x, 1)
- Выводит x[0] = 11
4. Рекурсивный вызов: rev_func(x, 0)
- Пытается вывести x[-1], что приводит к IndexError
Функция продолжает вызывать сама себя, уменьшая length, пока не достигает отрицательного значения, что приводит к попытке доступа к несуществующему индексу списка (т. е. IndexError).
