Найти в Дзене
1001 строк кода

Готовимся к собеседованию python. Вопросы 91 - 100

Вопрос 91. Каков эффект оператора *, когда он используется в списке в Python? Вопрос 92. Как вы можете преобразовать список целых чисел в список строк? Вопрос 93. Какой из следующих вариантов не является допустимым идентификатором Python? Вопрос 94. Каков вывод следующего фрагмента кода? Вопрос 95. Как в Python управляется память? Вопрос 96. Что упрощает оператор with в Python? Вопрос 97. Что делает ключевое слово yield в Python? Вопрос 98. Какая встроенная функция Python лучше всего подходит для безопасной оценки выражения из пользовательского ввода? Вопрос 99. В Python, что делает декоратор @classmethod с методом? Вопрос 100. Каков результат следующей операции с использованием метода update() словаря Python? Что будет содержать dict1 после обновления? 91. Правильный ответ: A Объяснение: В Python, когда оператор * применяется к списку, он используется для создания нового списка путем повторения исходного списка указанное количество раз. Как работает * со списками: Пример: В результате
Оглавление

Вопросы

Вопрос 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?

-2

Что будет содержать 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 не верен: Оператор * создает новый список, а не указатель.

Как работает * со списками:

  1. Оператор * берет список (левый операнд).
  2. Он повторяет его содержимое указанное число раз (правый операнд).
  3. Возвращает новый список.

Пример:

-3

В результате:

  • 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 верны.

Как это работает:

  1. str(): Функция str() принимает на вход любой объект и преобразует его в строковое представление.
  2. Цикл: В цикле, поочередно каждый элемент списка может быть преобразован в строку.
  3. map(): Функция map() принимает функцию и итерируемый объект (список) и применяет эту функцию к каждому элементу списка.
  4. Списковое включение: Также можно использовать списковое включение с преобразованием типов.

Примеры:

-4

В результате:

  • Все три способа (цикл, map() и списковое включение) приведут к созданию списка строк.
  • Конкатенация с пустой строкой работает, но выглядит менее читаемо.

Таким образом, вариант D является верным, поскольку и вариант A, и вариант B являются правильными способами преобразования списка целых чисел в список строк.

93, Правильный ответ: B

Объяснение:

Идентификаторы в Python — это имена, используемые для обозначения переменных, функций, классов и других объектов. Существуют определенные правила для создания допустимых идентификаторов.

  • Вариант A верен: _myvar является допустимым идентификатором. Он начинается с подчеркивания, за которым следуют буквы.
  • Вариант B не верен: 2myvar является недопустимым идентификатором. Он начинается с цифры.
  • Вариант C верен: my_var является допустимым идентификатором. Он начинается с буквы и содержит буквы и подчеркивания.
  • Вариант D верен: myVar является допустимым идентификатором. Он начинается с буквы и может содержать буквы в разных регистрах.

Правила для идентификаторов Python:

  1. Начинаются с буквы или подчеркивания: Идентификаторы должны начинаться с буквы (a-z, A-Z) или подчеркивания _.
  2. Содержат буквы, цифры или подчеркивания: После первого символа идентификаторы могут содержать буквы, цифры (0-9) и подчеркивания.
  3. Регистрозависимые: myVar, MyVar и MYVAR будут разными идентификаторами.
  4. Не могут быть ключевыми словами: Нельзя использовать ключевые слова Python (например, if, else, for, while, def, class и т. д.) в качестве идентификаторов.

Пример:

-5

В результате:

_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():

  1. Метод join() вызывается у объекта строки (разделителя).
  2. Он принимает итерируемый объект (список, кортеж, множество) в качестве аргумента.
  3. Он объединяет все элементы итерируемого объекта в одну строку, используя строку, у которой вызывался метод, в качестве разделителя.

Пример:

-6

В результате:

  • ''.join(x) объединяет элементы списка x в одну строку без пробелов.
  • ' '.join(x) объединяет элементы списка x в одну строку с пробелами между элементами.

Таким образом, вариант A является правильным.

95, Правильный ответ: B

Объяснение:

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

  • Вариант A не верен: Python не использует ручное управление памятью, как, например, язык C.
  • Вариант B верен: Python использует частную кучу, которая содержит все объекты Python и структуры данных.
  • Вариант C не верен: Python не передаёт управление памятью целиком операционной системе.
  • Вариант D не верен: Python не использует модель распределения памяти стека.

Механизмы управления памятью в Python:

  1. Частная куча (private heap): Python использует частную область памяти, где хранятся все объекты Python и структуры данных. Разработчики не имеют прямого доступа к этой памяти.
  2. Автоматическая сборка мусора (automatic garbage collection): Python использует сборщик мусора для обнаружения и освобождения памяти, которая больше не используется. Сборщик мусора работает в автоматическом режиме.
  3. Подсчет ссылок (reference counting): Python отслеживает количество ссылок на каждый объект в памяти. Когда количество ссылок достигает 0, объект удаляется из памяти.
  4. Управление через менеджер памяти Python: Распределением памяти занимается внутренний менеджер памяти, который эффективно управляет выделением и освобождением памяти.

Пример:

-7

В результате:

  • При создании 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:

  1. Менеджер контекста: Оператор with работает с объектами, которые реализуют протокол менеджера контекста (методы __enter__ и __exit__).
  2. Управление ресурсами: Когда выполняется блок кода с with, вызывается метод __enter__ объекта, который подготавливает ресурс к использованию. После завершения блока кода (даже если возникло исключение), вызывается метод __exit__, который освобождает ресурс.

Основные применения with:

  • Файлы: Гарантирует, что файл будет закрыт после его использования, даже если произойдет ошибка.
  • Соединения с базами данных: Автоматическое закрытие соединений.
  • Блокировки потоков: Управление блокировками в многопоточном коде.

Пример:

-8

В результате:

  • Файл "my_file.txt" автоматически закрывается, как только выполнится код в блоке with, или возникнет исключение.

Таким образом, вариант B является правильным ответом.

97, Правильный ответ: B

Объяснение:

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

  • Вариант A не верен: yield не завершает функцию, а приостанавливает ее выполнение.
  • Вариант B верен: yield возвращает значение и приостанавливает состояние функции.
  • Вариант C не верен: yield не предотвращает выполнение цикла.
  • Вариант D не верен: yield не пропускает итерации цикла.

Как работает yield:

  1. Функция, содержащая yield, становится генератором.
  2. При вызове генератора, он не выполняет код функции сразу, а возвращает итератор.
  3. Когда метод __next__ вызывается на итераторе, генератор выполняет код до оператора yield.
  4. После yield функция возвращает значение и приостанавливает свое состояние, сохраняя все локальные переменные.
  5. При повторном вызове __next__ или когда запрашивается следующий элемент в цикле for, выполнение функции продолжается с места приостановки.

Преимущества yield:

  1. Ленивая генерация: Значения создаются по мере необходимости, что позволяет экономить память.
  2. Поддержка больших наборов данных: Генераторы идеально подходят для работы с большими объемами данных, которые могут не поместиться в памяти.
  3. Потоковая обработка данных: Генераторы могут эффективно обрабатывать данные по мере их поступления.

Пример:

-9

В результате: Функция 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.
    Ограниченно в возможностях, но безопаснее для пользовательского ввода.

Пример:

-10

В результате:

  • ast.literal_eval() безопасно преобразует строку в словарь.
  • eval() выполняет строку "10 + 20" и выдает результат 30.
  • Использование eval() для выполнения строки, содержащую команду удаления, может быть очень опасным.

Таким образом, вариант D является правильным.

99, Правильный ответ: C

Объяснение:

Декоратор @classmethod в Python используется для преобразования обычного метода класса в метод класса.

  • Вариант A не верен: Он преобразует метод в метод класса, а не в статический метод.
  • Вариант B не верен: Декораторы не влияют на возможность переопределения метода.
  • Вариант C верен: @classmethod позволяет вызывать метод непосредственно у класса, а не только через экземпляр.
  • Вариант D не верен: Декоратор не меняет видимость метода.

Ключевые свойства методов класса:

  1. Связывание с классом: Метод класса связан с самим классом, а не с его экземплярами.
  2. Аргумент cls: Метод класса автоматически получает ссылку на класс (conventionally named cls) в качестве первого аргумента, это отличие от обычных методов (self).
  3. Доступ к атрибутам класса: Он может получать доступ к атрибутам класса и модифицировать их.
  4. Вызов через класс или экземпляр: Метод класса можно вызывать как у самого класса ClassName.method(), так и у экземпляра instance.method().

Типичные применения методов класса:

  • Фабричные методы: Методы класса часто используются для создания альтернативных конструкторов, то есть для создания объектов класса разными способами.

Пример:

-11

В результате:

  • Метод create_with_default_value вызывается через класс и возвращает новый экземпляр.
  • Метод instance_method выводится значение атрибута экземпляра и класса.
  • Класс метод modify_class_variable изменяет переменную класса.

Таким образом, вариант C является правильным.

Подпишись, чтобы не пропустить следующие вопросы из интервью разработчика на pythpn

Удачи!