Вопросы
Вопрос 61.
Что произойдет при добавлении нового узла со значением 25 в бинарное дерево поиска (BST), представленное на изображении ниже?
- A. Узел 25 будет добавлен как левый потомок узла 40.
- B. Узел 25 будет добавлен как правый потомок узла 20.
- C. Узел 25 будет добавлен как правый потомок узла 40.
- D. Узел 25 не будет добавлен, так как такой узел уже существует в дереве.
Вопрос 62.
Как функция enumerate() улучшает функциональность цикла в Python при работе со списком?
- A. Она переворачивает список для перебора в обратном порядке.
- B. Функция добавляет счетчик к каждой итерации цикла, предоставляя текущую позицию индекса наряду со значением.
- C. Она умножает каждый элемент на его номер индекса для получения нового списка.
- D. Enumerate блокирует список для предотвращения изменений во время итерации.
Вопрос 63.
Что такое функциональный паттерн проектирования "Map" (отображение) и как он используется в Python? Приведите пример использования этого паттерна для преобразования элементов коллекции.
- A. Паттерн "Map" - это способ сортировки элементов в коллекции, используя заданную функцию.
- B. Паттерн "Map" - это способ фильтрации элементов в коллекции, используя заданное условие.
- C. Паттерн "Map" - это способ объединения элементов коллекции в одно значение, используя заданную функцию.
- D. Паттерн "Map" - это способ применения функции к каждому элементу коллекции и создания новой коллекции из полученных результатов.
Вопрос 64. Какой результат выведет на экран следующий код Python?
- A. 7
- B. 6
- C. 5
- D. 4
Вопрос 65.
Какой будет результат выполнения следующего кода?
- A. [1, 2, 3] [1, 2, 3, 4, 5]
- B. [1, 2, 3, 4] [1, 2, 3, 4, 5]
- C. [1, 2, 3, 4, 5] [1, 2, 3, 4, 5]
- D. [1, 2, 3] [1, 2, 3, 5]
Вопрос 66.
Какой тип данных был бы наиболее подходящим для хранения уникальных идентификаторов пользователей (user IDs) в Python?
- A. Список (List)
- B. Словарь (Dictionary)
- C. Множество (Set)
- D. Кортеж (Tuple)
Вопрос 67.
В Python, каков результат преобразования типов, если вы используете функцию int() для числа с плавающей точкой, такого как 7.7?
- A. Она округляет число до ближайшего целого числа.
- B. Она отбрасывает десятичную часть и возвращает целое число.
- C. Она возвращает ближайшее меньшее целое число, если десятичная дробь ниже .5, и верхнее, если выше.
- D. Это вызывает ValueError, если явно не обработано исключение.
Вопрос 67.
Дан массив целых чисел nums, содержащий n элементов, и целое число k. Разработайте алгоритм для поиска непрерывного подмассива (subarray) длины k в массиве nums, который имеет максимальное среднее значение. Возвратите это максимальное среднее значение.
Примеры:
Ввод: nums = [1,12,-5,-6,50,3], k = 4
Вывод: 12.75000
Ввод: nums = [5], k = 1
Вывод: 5.00000
- A. Для решения задачи нужно использовать жадный алгоритм и выбирать на каждом шаге самый большой элемент из списка.
- B. Для решения задачи нужно использовать алгоритм поиска в ширину (BFS).
- C. Для решения задачи нужно использовать метод "скользящего окна" для эффективного поиска максимального среднего.
- D. Для решения задачи, необходимо использовать рекурсивный обход всех вариантов.
Вопрос 69.
Что такое "Immutability" (иммутабельность) в контексте функционального программирования, и какие преимущества она предоставляет? Приведите примеры изменяемых и неизменяемых объектов в Python и объясните, как использование иммутабельности может упростить код.
- A. Иммутабельность - это концепция, которая означает, что объекты можно изменять только в одном месте, при их создании, но не после.
- B. Иммутабельность - это использование объектов только для чтения.
- C. Иммутабельность - это концепция, которая заключается в избегании изменяемых данных и использовании только неизменяемых, что упрощает код и уменьшает вероятность побочных эффектов.
- D. Иммутабельность - это паттерн проектирования для создания только одного объекта определенного типа, без возможности изменения его состояния.
Вопрос 70.
Что такое композиция функций, и как ее можно реализовать в Python? Приведите пример кода, демонстрирующий композицию функций, где результат одной функции передается в качестве аргумента другой.
- A. Композиция функций - это процесс создания объектов из классов, использующих значения, полученные из других объектов.
- B. Композиция функций - это процесс, когда функция вызывает себя несколько раз.
- C. Композиция функций - это комбинация двух или более функций, при которой результат выполнения одной функции передается в качестве аргумента другой функции.
- D. Композиция функций - это способ создания функций, которые могут выполняться в отдельных потоках.
Ответы
61. Правильный ответ: B
Объяснение:
Бинарное дерево поиска (BST, Binary Search Tree) - это древовидная структура данных, где для каждого узла выполняются следующие свойства:
- Значение всех узлов в левом поддереве меньше значения узла.
- Значение всех узлов в правом поддереве больше значения узла.
- Оба левое и правое поддерево тоже являются BST.
При добавлении нового узла в BST, алгоритм должен соблюдать эти свойства для обеспечения корректности бинарного дерева.
- Процесс добавления узла со значением 25:
Начало с корня: Начинаем поиск места для добавления нового узла с корня (30).
Сравнение с корнем: Так как 25 меньше 30, переходим в левое поддерево.
Сравнение с узлом 20: Так как 25 больше 20, то переходим в правое поддерево от узла 20.
Правый потомок 20: Узел 20 не имеет правого потомка, поэтому узел со значением 25 будет добавлен как правый потомок узла 20.
Разбор вариантов:
- A. Узел 25 будет добавлен как левый потомок узла 40.: Неправильно, так как 25 меньше 40.
- B. Узел 25 будет добавлен как правый потомок узла 20.: Правильно.
- C. Узел 25 будет добавлен как правый потомок узла 40.: Неправильно.
- D. Узел 25 не будет добавлен, так как такой узел уже существует в дереве.: Неправильно. В данном случае узла 25 нет, так как это дерево поиска и одинаковых элементов не может быть.
В результате:
- При добавлении нового узла в BST необходимо соблюдать свойства бинарного дерева поиска.
- Правильная вставка узлов обеспечивает возможность быстрого поиска в BST.
Таким образом, правильным ответом является B. Узел 25 будет добавлен как правый потомок узла 20.
62. Правильный ответ: B
Объяснение:
Функция enumerate() в Python предназначена для упрощения итерации по последовательности (например, списку) с одновременным доступом к индексу и значению каждого элемента.
- Вариант A не верен: enumerate() не переворачивает список. Для этого используется метод reverse().
- Вариант B верен: enumerate() добавляет счетчик (индекс) к каждому элементу, предоставляя кортеж (индекс, значение) на каждой итерации.
- Вариант C не верен: enumerate() не меняет значения элементов и не создает новый список.
- Вариант D не верен: enumerate() не блокирует список и не предотвращает изменения во время итерации.
Как работает enumerate():
- Функция enumerate() принимает в качестве аргумента итерируемый объект (список, кортеж, строку и т. д.).
- Она возвращает объект-итератор, который выдаёт кортежи, состоящие из двух элементов: индекса и значения элемента.
- Индексы начинаются с 0 по умолчанию, но можно изменить стартовый индекс, передав необязательный параметр start.
Преимущества использования enumerate():
- Доступ к индексу: Упрощает доступ к индексу элемента в цикле, что полезно, когда нужно обрабатывать элемент, зная его положение.
- Упрощение кода: Позволяет избежать ручного создания и отслеживания счетчика, делая код более читабельным.
- Эффективность: enumerate часто более эффективен, чем ручное отслеживание индекса, поскольку Python автоматически оптимизирует этот процесс.
Пример:
В результате:
- При использовании enumerate(), цикл автоматически предоставляет индекс и значение каждого элемента списка.
- При использовании enumerate(my_list, start=1) индексы начинаются с 1.
Таким образом, вариант B является правильным ответом.
63. Правильный ответ: D
Объяснение:
Паттерн "Map" (отображение) — это распространенный функциональный паттерн, который применяется для преобразования каждого элемента в коллекции (например, список, кортеж) в новый элемент с использованием определенной функции. Результатом является новая коллекция, содержащая преобразованные элементы.
- Основные концепции паттерна "Map":
Применение функции: Функция "отображения" применяется к каждому элементу входной коллекции.
Новая коллекция: Результаты применения функции сохраняются в новой коллекции.
Сохранение порядка: Обычно сохраняется порядок элементов (если это применимо к структуре данных).
Использование с функциями высшего порядка: Часто реализуется с помощью функций высшего порядка, таких как map() в Python. - Как работает паттерн "Map":
Принимает входную коллекцию элементов.
Принимает функцию преобразования.
Применяет функцию к каждому элементу коллекции.
Собирает результаты преобразования в новую коллекцию.
Возвращает новую коллекцию с преобразованными значениями.
Примеры:
Разбор примеров:
- Использование с обычной функцией square:
Функция square(x) возводит число в квадрат.
Функция map(square, numbers) применяет функцию square к каждому элементу списка numbers и возвращает итератор. Затем итератор преобразовывается в список.
Выводит исходный и новый списки. - Использование с лямбда функцией:
Лямбда-функция lambda x: x ** 3 вычисляет куб числа.
Функция map(lambda x: x ** 3, numbers) применяет лямбду к каждому элементу списка numbers и возвращает итератор. Затем итератор преобразовывается в список.
Выводит исходный и новый списки. - Использование map с преобразованием строк:
Лямбда-функция lambda x: x.upper() переводит строку в верхний регистр.
Функция map(lambda x: x.upper(), strings) применяет лямбда-функцию к каждой строке в списке strings.
Выводит исходный и новый списки. - Использование map с несколькими коллекциями:
Лямбда-функция lambda x,y: x+y суммирует два числа.
Функция map(lambda x,y: x+y, list1, list2) применяет лямбда-функцию к каждому элементу в списках list1 и list2 (берет элементы с одинаковым индексом).
Выводит исходные списки и список сумм. - Использование map c функцией, которая возвращает кортеж:
Лямбда функция lambda s, i: (i, s) создает пару (индекс, значение) для каждой строки в списке.
функция map создает список кортежей.
Выводит исходный список и список с проиндексированными строками. - Использование map с различными типами данных:
Лямбда функция lambda x: type(x) возвращает тип объекта.
Функция map применяет эту функцию к каждому элементу в списке, что приводит к созданию списка типов.
Выводит исходный список и список типов.
Разбор вариантов:
- A. Паттерн "Map" - это способ сортировки элементов в коллекции, используя заданную функцию.: Неправильно. Сортировка - это другая операция.
- B. Паттерн "Map" - это способ фильтрации элементов в коллекции, используя заданное условие.: Неправильно. Фильтрация используется для выборки элементов по условию.
- C. Паттерн "Map" - это способ объединения элементов коллекции в одно значение, используя заданную функцию.: Неправильно. Это описание паттерна Reduce.
- D. Паттерн "Map" - это способ применения функции к каждому элементу коллекции и создания новой коллекции из полученных результатов.: Правильно.
В результате:
- Паттерн "Map" позволяет создавать новый список путем преобразования элементов исходного списка с помощью функции преобразования.
- Используя функцию map и лямбда-функции можно легко реализовать паттерн Map.
- Функция map позволяет применять функцию к нескольким спискам одновременно.
- Функция map может использоваться с функциями, которые возвращают любое значение (в том числе и кортежи), и может принимать любые типы данных.
Таким образом, правильным ответом является D. Паттерн "Map" - это способ применения функции к каждому элементу коллекции и создания новой коллекции из полученных результатов.
64. Правильный ответ: B
Объяснение:
Этот код демонстрирует работу замыканий (closures) и областей видимости переменных в Python.
- Функция outer_func(y):
Принимает аргумент y (в примере равен 3).
Инициализирует локальную переменную x значением 2.
Определяет вложенную функцию inner_func().
inner_func() "замыкается" над переменными из области видимости outer_func и возвращает сумму x + y.
Изменяет x на x + 2, то есть x теперь равен 4.
Изменяет y на 2.
Возвращает функцию inner_func как результат. - Вызов outer_func(3):
Вызывает outer_func с аргументом 3.
Возвращаемая функция inner_func присваивается переменной results.
Важно отметить, что вложенная функция inner_func запоминает не значения переменных x и y в момент определения, а сами переменные, и они подставятся в момент вызова inner_func. - Вызов results():
Вызывает функцию inner_func, которая была возвращена из outer_func и присвоена results.
Внутри inner_func:
x имеет значение 4, которое было вычислено в outer_func перед ее возвращением.
y имеет значение 2, которое было присвоено в outer_func перед ее возвращением.
Возвращается значение x + y = 4 + 2 = 6. - Вывод: print(results()) выводит результат вызова inner_func ,то есть 6.
Разбор вариантов:
- A. 7: Неправильно.
- B. 6: Правильно.
- C. 5: Неправильно.
- D. 4: Неправильно.
В результате:
- Вложенные функции могут захватывать переменные из области видимости родительской функции - это называется замыканием.
- Захват переменной происходит по ссылке, а не по значению. В момент вызова inner_func переменные x и y будут иметь последнее присвоенное значение.
Таким образом, правильным ответом является B. 6.
65. Правильный ответ: B
Объяснение:
Этот код демонстрирует разницу между мутированием списка и созданием нового списка, а также то, как это влияет на переменные в Python.
- Изначальный список: my_list инициализируется как [1, 2, 3].
- Функция modify_list:
Принимает список lst в качестве аргумента.
lst.append(4): Метод append мутирует список, добавляя 4 в конец. Теперь lst (изначально my_list) стал [1, 2, 3, 4].
lst = lst + [5]: Операция + создает новый список, объединяя lst c [5]. Результат присваивается локальной переменной lst внутри функции. Это не изменяет my_list в глобальной области видимости.
Возвращается новый список lst. - Вызов modify_list: Функция вызывается с my_list как аргументом. Возвращаемый новый список присваивается переменной new_list.
- Вывод:
print(my_list) выведет [1, 2, 3, 4], так как my_list был мутирован внутри функции.
print(new_list) выведет [1, 2, 3, 4, 5], который является новым списком, созданным в функции и возвращенным.
Дополнительные замечания:
- Метод append изменяет исходный список (мутирует его).
- Оператор + создает новый список, не изменяя исходные.
- Присваивание внутри функции создает локальную переменную, которая никак не влияет на переменную с тем же именем, объявленную за пределами этой функции.
- Понимание разницы между мутацией и созданием новых объектов важно для предотвращения нежелательных побочных эффектов при работе со списками в Python.
66. Правильный ответ: C
Объяснение:
В Python для хранения уникальных элементов наиболее подходит тип данных set (множество).
- Вариант A не верен: Списки могут содержать повторяющиеся элементы и сохраняют порядок элементов.
- Вариант B не верен: Словари хранят пары ключ-значение, и хотя ключи должны быть уникальными, для хранения просто уникальных идентификаторов пользователей это неэффективно.
- Вариант C верен: Множества хранят только уникальные элементы в произвольном порядке и не поддерживают дубликаты.
- Вариант D не верен: Кортежи являются неизменяемыми и могут хранить повторяющиеся элементы.
Почему множество (set) подходит для хранения уникальных идентификаторов:
- Уникальность элементов: Множества автоматически удаляют дубликаты, что идеально подходит для хранения уникальных идентификаторов.
- Быстрая проверка наличия: Проверка наличия элемента в множестве выполняется очень быстро (в среднем O(1)), благодаря реализации на основе хеш-таблицы.
- Неупорядоченность: Множества не гарантируют сохранение порядка элементов, что является приемлемым для идентификаторов пользователей.
- Изменяемость: Множества могут быть изменены (добавлять или удалять элементы).
Пример:
В результате:
- При создании множества дубликаты удаляются, поэтому "user123" встречается только один раз.
- Элементы множества не упорядочены, поэтому порядок их вывода может не совпадать с порядком добавления.
- Операция in проверки наличия элемента в множестве выполняется быстро.
Таким образом, вариант C является верным.
67. Правильный ответ: B
Объяснение:
Функция int() в Python используется для преобразования значения к целому числу. При преобразовании числа с плавающей точкой (float) в целое число (int), функция int() отбрасывает десятичную часть, а не округляет.
- Вариант A не верен: int() не выполняет округление, а отбрасывает десятичную часть.
- Вариант B верен: int() именно отбрасывает десятичную часть и возвращает целое число.
- Вариант C не верен: int() не выполняет округление по правилам "меньше .5 в меньшую сторону, больше - в большую".
- Вариант D не верен: Функция int() может конвертировать строку, представляющую целое число, к integer типу, но не строку с плавающей точкой (например "7.7") и не вызовет ValueError при конвертации числа float в int
Пример:
В результате:
- При преобразовании 7.7 с помощью int(), возвращается 7, десятичная часть отброшена.
- При преобразовании -7.7, возвращается -7.
- При преобразовании 7.2, возвращается 7.
Таким образом, вариант B является правильным ответом.
68. Правильный ответ: C
Объяснение:
Для решения задачи поиска подмассива с максимальным средним значением и фиксированной длиной k в массиве чисел, оптимальным является применение метода "скользящего окна". Этот метод обеспечивает линейную временную сложность O(n), позволяя обойти массив только один раз.
- Алгоритм (скользящее окно):
Инициализация:
Вычисляем сумму первых k элементов массива, и сохраняем их в переменной current_sum.
Максимальная сумма max_sum инициализируется значением current_sum.
Скользящее окно:
Начиная с k-го элемента до конца массива (для индекса i), поддерживаем окно размера k:
Из current_sum вычитаем элемент из начала окна (nums[i-k]). * К current_sum добавляем новый элемент в конце окна nums[i].
Сравниваем current_sum с max_sum и если больше то max_sum = current_sum
Возвращаем результат: После перебора всех элементов, возвращаем max_sum / k, что соответствует максимальному среднему значению подмассива. - Преимущества алгоритма:
Линейная сложность: Обеспечивает временную сложность O(n).
Постоянная память: Использует постоянное количество дополнительной памяти.
Простота: Легок в реализации.
Пример:
Разбор вариантов:
- A. Для решения задачи нужно сначала отсортировать массив capacity, затем последовательно заполнять сумки, пока не закончатся камни.: Неправильно.
- B. Для решения задачи нужно использовать алгоритм поиска в ширину (BFS).: Неправильно. BFS не является подходящим для этой задачи.
- C. Для решения задачи нужно использовать метод "скользящего окна" для эффективного поиска максимального среднего.: Правильно.
- D. Для решения задачи нужно использовать только рекурсивный алгоритм.: Неправильно. Рекурсивный алгоритм не подходит.
В результате:
- Алгоритм скользящего окна позволяет эффективно находить подмассив с максимальным средним значением.
- Итерируясь по массиву только один раз достигается сложность O(n)
- Результирующее среднее значение будет получено с помощью деления максимальной суммы на размер подмассива k
Таким образом, правильным ответом является C. Для решения задачи нужно использовать метод "скользящего окна" для эффективного поиска максимального среднего.
69. Правильный ответ: C
Объяснение:
Иммутабельность (immutability) — это концепция в программировании, особенно в функциональном программировании, которая заключается в избегании изменяемых данных. Иммутабельные объекты — это объекты, которые не могут быть изменены после создания. При изменении такого объекта фактически создаётся новый объект с измененным значением, а старый остается неизменным.
- Основные принципы иммутабельности:
Неизменяемость: Объекты не могут быть изменены после создания.
Новый объект при изменении: Любая операция, которая кажется изменяет объект, на самом деле создаёт новый объект с измененными значениями.
Отсутствие побочных эффектов: Функции, работающие с иммутабельными объектами, не изменяют состояние существующих данных и не создают побочных эффектов, если не создавать новые переменные.
Простота и предсказуемость: Код становится более простым и предсказуемым, так как не происходит нежелательного изменения объектов. - Преимущества иммутабельности:
- Безопасность: Исключение побочных эффектов, снижение вероятности ошибок, связанных с одновременным изменением объектов из разных частей программы. * Упрощение отладки: Код, который не изменяет данные, намного проще отлаживать. * Многопоточность: Легче работать с иммутабельными объектами в многопоточной среде, поскольку не нужно беспокоиться о гонках данных.
- Иммутабельные и изменяемые объекты в Python:
Иммутабельные объекты: * Числа (int, float, complex). * Строки (str). * Кортежи (tuple). * frozenset - не изменяемые множества. * Булевы значения (bool).
Изменяемые объекты:
Списки (list).
Словари (dict).
Множества (set).
Примеры:
Разбор примеров:
- Пример иммутабельных объектов:
string2 = string1.upper() создает новую строку string2 в верхнем регистре, а string1 не меняется.
tuple2 = tuple1 + (4,5) создает новый кортеж tuple2, а tuple1 не меняется. - Пример изменяемых объектов:
list2 = list1 присваивает list2 ссылку на список, который хранится в list1, то есть, не создается новый список. * list1[0] = 10 изменяет оригинальный список, и поэтому все переменные, которые ссылаются на него, изменятся тоже.
list2 = list1.copy() создает новый список, и он не будет изменен после изменения list1
Разбор вариантов:
- A. Иммутабельность - это концепция, которая означает, что объекты можно изменять только в одном месте, при их создании, но не после.: Неправильно.
- B. Иммутабельность - это использование объектов только для чтения.: Неправильно. Иммутабельные объекты не могут быть изменены совсем, а не только для чтения.
- C. Иммутабельность - это концепция, которая заключается в избегании изменяемых данных и использовании только неизменяемых, что упрощает код и уменьшает вероятность побочных эффектов.: Правильно.
- D. Иммутабельность - это паттерн проектирования для создания только одного объекта определенного типа, без возможности изменения его состояния.: Неправильно.
В результате:
- Иммутабельность способствует созданию более безопасного, предсказуемого и простого кода.
- Иммутабельные объекты не могут быть изменены после создания, что позволяет избежать ошибок связанных с изменением состояния.
Таким образом, правильным ответом является C. Иммутабельность - это концепция, которая заключается в избегании изменяемых данных и использовании только неизменяемых, что упрощает код и уменьшает вероятность побочных эффектов.
70. Правильный ответ: C
Объяснение:
Композиция функций (function composition) — это функциональный паттерн, который позволяет объединять две или более функции таким образом, что результат одной функции передается в качестве аргумента другой функции. Это позволяет создавать новые, более сложные функции, из простых и переиспользуемых.
- Основные концепции композиции функций:
Цепочка вычислений: Результат одной функции становится входным значением для следующей функции.
Последовательное применение: Функции применяются друг за другом в определенном порядке.
Новая функция из простых: Композиция позволяет создавать сложные функции из более простых.
Возможность повторного использования: Композиция позволяет переиспользовать ранее созданные функции. - Реализация композиции в Python:
В Python композицию можно реализовать вручную с помощью вложенных вызовов функций или с помощью оператора | (начиная с Python 3.9), или с помощью использования лямбда-функций.
Пример (из текста вопроса):
Описание примера:
- double(x): Функция, которая умножает число x на 2.
- square(x): Функция, которая возводит число x в квадрат.
- compose(f, g): Функция, реализующая композицию.
Принимает функции f и g в качестве аргументов.
Возвращает лямбда-функцию lambda x: f(g(x)), которая сначала применяет функцию g к аргументу x, а затем применяет функцию f к результату g(x). - composed = compose(square, double): Создается новая функция composed, которая является композицией square и double. Она эквивалента lambda x : square(double(x)).
- composed(5): Принимает аргумент 5 и выполняет функции в порядке (5*2)**2, т.е. double(5) (что равно 10) и затем square(10) (что равно 100).
Другие примеры:
Разбор вариантов:
- A. Композиция функций - это процесс создания объектов из классов, использующих значения, полученные из других объектов.: Неправильно. Композиция функций не связана с созданием объектов из классов.
- B. Композиция функций - это процесс, когда функция вызывает себя несколько раз.: Неправильно. Это описание рекурсии.
- C. Композиция функций - это комбинация двух или более функций, при которой результат выполнения одной функции передается в качестве аргумента другой функции.: Правильно.
- D. Композиция функций - это способ создания функций, которые могут выполняться в отдельных потоках.: Неправильно.
В результате:
- Композиция функций позволяет создавать более сложные операции из простых.
- Использование композиции способствует модульности и переиспользованию кода.
Таким образом, правильным ответом является C. Композиция функций - это комбинация двух или более функций, при которой результат выполнения одной функции передается в качестве аргумента другой функции.
удачи!
Предыдущие вопросы