Вопросы
Вопрос 91. Каков эффект оператора *, когда он используется в списке в Python?
- A. Он повторяет список указанное количество раз.
- B. Он удаляет все элементы из списка.
- C. Он используется для умножения каждого элемента на число.
- D. Он создает указатель на исходный список.
Вопрос 92. Как вы можете преобразовать список целых чисел в список строк?
- A. Используя функцию str() индивидуально для каждого элемента.
- B. Используя функцию map(str, list).
- C. Конкатенируя каждый элемент с пустой строкой.
- D. A, и B верны.
Вопрос 93. Какой из следующих вариантов не является допустимым идентификатором Python?
- A. _myvar
- B. 2myvar
- C. my_var
- D. myVar
Вопрос 94. Каков вывод следующего фрагмента кода?
- A. Pythonisawesome
- B. Python is awesome
- C. ['Python', 'is', 'awesome']
- D. None
Вопрос 95. Как в Python управляется память?
- A. Только с помощью ручного управления памятью.
- B. С использованием частной кучи, содержащей все объекты Python и структуры данных.
- C. Исключительно через операционную систему.
- D. С помощью модели распределения памяти стека.
Вопрос 96. Что упрощает оператор with в Python?
- A. Обработку ошибок
- B. Операции чтения и записи файлов
- C. Синтаксис объявлений функций
- D. Реализацию циклов
Вопрос 97. Что делает ключевое слово yield в Python?
- A. Завершает функцию.
- B. Возвращает значение из функции и приостанавливает ее состояние.
- C. Предотвращает выполнение цикла.
- D. Пропускает текущую итерацию цикла.
Вопрос 98. Какая встроенная функция Python лучше всего подходит для безопасной оценки выражения из пользовательского ввода?
- A. eval()
- B. exec()
- C. input()
- D. ast.literal_eval()
Вопрос 99. В Python, что делает декоратор @classmethod с методом?
- A. Он преобразует метод в статический метод, который принадлежит классу.
- B. Он ограничивает метод, чтобы его нельзя было переопределить в подклассах.
- C. Он позволяет вызывать метод у самого класса, а не только у экземпляров класса.
- D. Он делает метод приватным, так что к нему нельзя получить доступ извне класса.
Вопрос 100. Каков результат следующей операции с использованием метода update() словаря Python?
Что будет содержать dict1 после обновления?
- A. {'a': 1, 'b': 2, 'c': 4}
- B. {'a': 1, 'b': 3, 'c': 4}
- C. {'b': 3, 'c': 4}
- D. {'a': 1, 'b': 2}
Ответы
91. Правильный ответ: A
Объяснение:
В Python, когда оператор * применяется к списку, он используется для создания нового списка путем повторения исходного списка указанное количество раз.
- Вариант A верен: Оператор * повторяет список указанное количество раз, создавая новый список.
- Вариант B не верен: Для удаления элементов используется clear(), del и другие методы, а не оператор *.
- Вариант C не верен: Для умножения каждого элемента списка используется списковое включение с использованием цикла.
- Вариант D не верен: Оператор * создает новый список, а не указатель.
Как работает * со списками:
- Оператор * берет список (левый операнд).
- Он повторяет его содержимое указанное число раз (правый операнд).
- Возвращает новый список.
Пример:
В результате:
- my_list * 2 повторяет элементы списка my_list дважды, создавая новый список [1, 2, 3, 1, 2, 3].
- my_list * 3 повторяет элементы списка my_list трижды, создавая новый список [1, 2, 3, 1, 2, 3, 1, 2, 3].
Таким образом, вариант A является правильным.
92, Правильный ответ: D
Объяснение:
Существует несколько способов преобразования списка целых чисел в список строк в Python.
- Вариант A верен: Функция str() может быть применена к каждому элементу списка по отдельности для преобразования в строку.
- Вариант B верен: Функция map() позволяет применить функцию str() к каждому элементу списка, что эффективно преобразует все элементы в строки.
- Вариант C не верен: Конкатенация с пустой строкой, не всегда будет корректно работать с числами (нужно использовать функцию str()).
- Вариант D верен: Так как варианты A и B верны.
Как это работает:
- str(): Функция str() принимает на вход любой объект и преобразует его в строковое представление.
- Цикл: В цикле, поочередно каждый элемент списка может быть преобразован в строку.
- map(): Функция map() принимает функцию и итерируемый объект (список) и применяет эту функцию к каждому элементу списка.
- Списковое включение: Также можно использовать списковое включение с преобразованием типов.
Примеры:
В результате:
- Все три способа (цикл, map() и списковое включение) приведут к созданию списка строк.
- Конкатенация с пустой строкой работает, но выглядит менее читаемо.
Таким образом, вариант D является верным, поскольку и вариант A, и вариант B являются правильными способами преобразования списка целых чисел в список строк.
93, Правильный ответ: B
Объяснение:
Идентификаторы в Python — это имена, используемые для обозначения переменных, функций, классов и других объектов. Существуют определенные правила для создания допустимых идентификаторов.
- Вариант A верен: _myvar является допустимым идентификатором. Он начинается с подчеркивания, за которым следуют буквы.
- Вариант B не верен: 2myvar является недопустимым идентификатором. Он начинается с цифры.
- Вариант C верен: my_var является допустимым идентификатором. Он начинается с буквы и содержит буквы и подчеркивания.
- Вариант D верен: myVar является допустимым идентификатором. Он начинается с буквы и может содержать буквы в разных регистрах.
Правила для идентификаторов Python:
- Начинаются с буквы или подчеркивания: Идентификаторы должны начинаться с буквы (a-z, A-Z) или подчеркивания _.
- Содержат буквы, цифры или подчеркивания: После первого символа идентификаторы могут содержать буквы, цифры (0-9) и подчеркивания.
- Регистрозависимые: myVar, MyVar и MYVAR будут разными идентификаторами.
- Не могут быть ключевыми словами: Нельзя использовать ключевые слова Python (например, if, else, for, while, def, class и т. д.) в качестве идентификаторов.
Пример:
В результате:
_myvar, my_var и myVar являются допустимыми идентификаторами, а 2myvar вызывает ошибку синтаксиса, так как начинается с цифры.
Таким образом, вариант B является верным.
94, Правильный ответ: A
Объяснение:
В Python метод join() используется для объединения элементов итерируемой структуры (например, списка строк) в одну строку с помощью разделителя. В данном случае метод join() вызывается у пустой строки '', что означает, что все элементы списка x будут соединены без каких-либо разделителей.
- Вариант A верен: join() без разделителя объединит все строки в одну: "Pythonisawesome"
- Вариант B не верен: join() с пробелом как разделителем выведет "Python is awesome", а не в данном примере.
- Вариант C не верен: Функция join() не вернет список, а строку.
- Вариант D не верен: Функция join() не вернет None.
Как работает join():
- Метод join() вызывается у объекта строки (разделителя).
- Он принимает итерируемый объект (список, кортеж, множество) в качестве аргумента.
- Он объединяет все элементы итерируемого объекта в одну строку, используя строку, у которой вызывался метод, в качестве разделителя.
Пример:
В результате:
- ''.join(x) объединяет элементы списка x в одну строку без пробелов.
- ' '.join(x) объединяет элементы списка x в одну строку с пробелами между элементами.
Таким образом, вариант A является правильным.
95, Правильный ответ: B
Объяснение:
Python использует автоматическое управление памятью для большинства случаев. Это означает, что разработчикам не нужно явно выделять и освобождать память.
- Вариант A не верен: Python не использует ручное управление памятью, как, например, язык C.
- Вариант B верен: Python использует частную кучу, которая содержит все объекты Python и структуры данных.
- Вариант C не верен: Python не передаёт управление памятью целиком операционной системе.
- Вариант D не верен: Python не использует модель распределения памяти стека.
Механизмы управления памятью в Python:
- Частная куча (private heap): Python использует частную область памяти, где хранятся все объекты Python и структуры данных. Разработчики не имеют прямого доступа к этой памяти.
- Автоматическая сборка мусора (automatic garbage collection): Python использует сборщик мусора для обнаружения и освобождения памяти, которая больше не используется. Сборщик мусора работает в автоматическом режиме.
- Подсчет ссылок (reference counting): Python отслеживает количество ссылок на каждый объект в памяти. Когда количество ссылок достигает 0, объект удаляется из памяти.
- Управление через менеджер памяти Python: Распределением памяти занимается внутренний менеджер памяти, который эффективно управляет выделением и освобождением памяти.
Пример:
В результате:
- При создании my_list память выделяется в частной куче, и Python отслеживает эту память.
- Переменная my_list_2 также ссылается на эту область памяти.
- После удаления my_list, объект по прежнему доступен через ссылку my_list_2. Сборщик мусора (GC) освободит память, когда счетчик ссылок объекта станет равен 0.
Таким образом, вариант B является правильным.
96, Правильный ответ: B
Объяснение:
Оператор with в Python используется для упрощения управления ресурсами, такими как файлы, сетевые соединения или другие операции, требующие выделения и освобождения ресурсов.
- Вариант A не верен: with упрощает процесс управления ресурсами, а не обработки ошибок. Хотя with может косвенно помочь в отлове ошибок при работе с ресурсами, но это не его основная задача.
- Вариант B верен: with упрощает операции ввода-вывода с файлами, а так же работу с другими ресурсами.
- Вариант C не верен: with не влияет на синтаксис объявлений функций.
- Вариант D не верен: with не используется для упрощения циклов.
Как работает with:
- Менеджер контекста: Оператор with работает с объектами, которые реализуют протокол менеджера контекста (методы __enter__ и __exit__).
- Управление ресурсами: Когда выполняется блок кода с with, вызывается метод __enter__ объекта, который подготавливает ресурс к использованию. После завершения блока кода (даже если возникло исключение), вызывается метод __exit__, который освобождает ресурс.
Основные применения with:
- Файлы: Гарантирует, что файл будет закрыт после его использования, даже если произойдет ошибка.
- Соединения с базами данных: Автоматическое закрытие соединений.
- Блокировки потоков: Управление блокировками в многопоточном коде.
Пример:
В результате:
- Файл "my_file.txt" автоматически закрывается, как только выполнится код в блоке with, или возникнет исключение.
Таким образом, вариант B является правильным ответом.
97, Правильный ответ: B
Объяснение:
Ключевое слово yield в Python используется для определения генераторов. Генераторы — это особый вид функций, которые позволяют ленивую итерацию, то есть возвращают значения по одному, приостанавливая свое выполнение между вызовами.
- Вариант A не верен: yield не завершает функцию, а приостанавливает ее выполнение.
- Вариант B верен: yield возвращает значение и приостанавливает состояние функции.
- Вариант C не верен: yield не предотвращает выполнение цикла.
- Вариант D не верен: yield не пропускает итерации цикла.
Как работает yield:
- Функция, содержащая yield, становится генератором.
- При вызове генератора, он не выполняет код функции сразу, а возвращает итератор.
- Когда метод __next__ вызывается на итераторе, генератор выполняет код до оператора yield.
- После yield функция возвращает значение и приостанавливает свое состояние, сохраняя все локальные переменные.
- При повторном вызове __next__ или когда запрашивается следующий элемент в цикле for, выполнение функции продолжается с места приостановки.
Преимущества yield:
- Ленивая генерация: Значения создаются по мере необходимости, что позволяет экономить память.
- Поддержка больших наборов данных: Генераторы идеально подходят для работы с большими объемами данных, которые могут не поместиться в памяти.
- Потоковая обработка данных: Генераторы могут эффективно обрабатывать данные по мере их поступления.
Пример:
В результате: Функция my_generator() использует yield для генерации значений по одному. Цикл for получает значения из генератора и обрабатывает их.
Таким образом, вариант B является правильным.
98, Правильный ответ: D
Объяснение:
В Python для оценки выражений из пользовательского ввода важно использовать функции, которые обеспечивают безопасность, чтобы избежать уязвимостей.
- Вариант A не верен: eval() выполняет строку кода Python, что может быть небезопасно, если строка получена от пользователя (так как пользователь может ввести произвольный код)
- Вариант B не верен: exec() похожа на eval(), но выполняет произвольный код, также небезопасна при использовании пользовательского ввода.
- Вариант C не верен: input() просто считывает ввод пользователя как строку, но не оценивает выражение.
- Вариант D верен: ast.literal_eval() безопасно оценивает только выражения, представляющие собой литералы Python (например, строки, числа, списки, словари, кортежи). Он не позволяет выполнять произвольный код.
eval() vs. ast.literal_eval():
- eval():
Выполняет строку как код Python.
Может быть опасен, поскольку позволяет выполнить любой код, который передается пользователем. - ast.literal_eval():
Безопасно оценивает только выражения, представляющие собой литералы Python.
Ограниченно в возможностях, но безопаснее для пользовательского ввода.
Пример:
В результате:
- ast.literal_eval() безопасно преобразует строку в словарь.
- eval() выполняет строку "10 + 20" и выдает результат 30.
- Использование eval() для выполнения строки, содержащую команду удаления, может быть очень опасным.
Таким образом, вариант D является правильным.
99, Правильный ответ: C
Объяснение:
Декоратор @classmethod в Python используется для преобразования обычного метода класса в метод класса.
- Вариант A не верен: Он преобразует метод в метод класса, а не в статический метод.
- Вариант B не верен: Декораторы не влияют на возможность переопределения метода.
- Вариант C верен: @classmethod позволяет вызывать метод непосредственно у класса, а не только через экземпляр.
- Вариант D не верен: Декоратор не меняет видимость метода.
Ключевые свойства методов класса:
- Связывание с классом: Метод класса связан с самим классом, а не с его экземплярами.
- Аргумент cls: Метод класса автоматически получает ссылку на класс (conventionally named cls) в качестве первого аргумента, это отличие от обычных методов (self).
- Доступ к атрибутам класса: Он может получать доступ к атрибутам класса и модифицировать их.
- Вызов через класс или экземпляр: Метод класса можно вызывать как у самого класса ClassName.method(), так и у экземпляра instance.method().
Типичные применения методов класса:
- Фабричные методы: Методы класса часто используются для создания альтернативных конструкторов, то есть для создания объектов класса разными способами.
Пример:
В результате:
- Метод create_with_default_value вызывается через класс и возвращает новый экземпляр.
- Метод instance_method выводится значение атрибута экземпляра и класса.
- Класс метод modify_class_variable изменяет переменную класса.
Таким образом, вариант C является правильным.
Подпишись, чтобы не пропустить следующие вопросы из интервью разработчика на pythpn
Удачи!