Вопрос 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?
Вопрос 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. Композиция функций - это способ создания функций, которые могут выполняться в отдельных потоках.
Ответы
Бинарное дерево поиска (BST, Binary Search Tree) - это древовидная структура данных, где для каждого узла выполняются следующие свойства:
Значение всех узлов в левом поддереве меньше значения узла.
Значение всех узлов в правом поддереве больше значения узла.
Оба левое и правое поддерево тоже являются BST.
При добавлении нового узла в BST, алгоритм должен соблюдать эти свойства для обеспечения корректности бинарного дерева.
A. Узел 25 будет добавлен как левый потомок узла 40.: Неправильно, так как 25 меньше 40.
B. Узел 25 будет добавлен как правый потомок узла 20.: Правильно.
C. Узел 25 будет добавлен как правый потомок узла 40.: Неправильно.
D. Узел 25 не будет добавлен, так как такой узел уже существует в дереве.: Неправильно. В данном случае узла 25 нет, так как это дерево поиска и одинаковых элементов не может быть.
Таким образом, правильным ответом является B. Узел 25 будет добавлен как правый потомок узла 20.
Функция 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 является правильным ответом.
Паттерн "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" - это способ применения функции к каждому элементу коллекции и создания новой коллекции из полученных результатов.
Этот код демонстрирует работу замыканий (closures) и областей видимости переменных в Python.
Функция outer_func(y):
Принимает аргумент y (в примере равен 3).
Инициализирует локальную переменную x значением 2.
Определяет вложенную функцию inner_func().
Изменяет 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.
Этот код демонстрирует разницу между мутированием списка и созданием нового списка, а также то, как это влияет на переменные в 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.
В Python для хранения уникальных элементов наиболее подходит тип данных set (множество).
Вариант A не верен: Списки могут содержать повторяющиеся элементы и сохраняют порядок элементов.
Вариант B не верен: Словари хранят пары ключ-значение, и хотя ключи должны быть уникальными, для хранения просто уникальных идентификаторов пользователей это неэффективно.
Вариант C верен: Множества хранят только уникальные элементы в произвольном порядке и не поддерживают дубликаты.
Вариант D не верен: Кортежи являются неизменяемыми и могут хранить повторяющиеся элементы.
Почему множество (set) подходит для хранения уникальных идентификаторов:
Уникальность элементов: Множества автоматически удаляют дубликаты, что идеально подходит для хранения уникальных идентификаторов.
Быстрая проверка наличия: Проверка наличия элемента в множестве выполняется очень быстро (в среднем O(1)), благодаря реализации на основе хеш-таблицы.
Неупорядоченность: Множества не гарантируют сохранение порядка элементов, что является приемлемым для идентификаторов пользователей.
Изменяемость: Множества могут быть изменены (добавлять или удалять элементы).
При создании множества дубликаты удаляются, поэтому "user123" встречается только один раз.
Элементы множества не упорядочены, поэтому порядок их вывода может не совпадать с порядком добавления.
Операция in проверки наличия элемента в множестве выполняется быстро.
Таким образом, вариант C является верным.
Функция 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 является правильным ответом.
Для решения задачи поиска подмассива с максимальным средним значением и фиксированной длиной k в массиве чисел, оптимальным является применение метода "скользящего окна". Этот метод обеспечивает линейную временную сложность O(n), позволяя обойти массив только один раз.
A. Для решения задачи нужно сначала отсортировать массив capacity, затем последовательно заполнять сумки, пока не закончатся камни.: Неправильно.
B. Для решения задачи нужно использовать алгоритм поиска в ширину (BFS).: Неправильно. BFS не является подходящим для этой задачи.
C. Для решения задачи нужно использовать метод "скользящего окна" для эффективного поиска максимального среднего.: Правильно.
D. Для решения задачи нужно использовать только рекурсивный алгоритм.: Неправильно. Рекурсивный алгоритм не подходит.
Алгоритм скользящего окна позволяет эффективно находить подмассив с максимальным средним значением.
Итерируясь по массиву только один раз достигается сложность O(n)
Результирующее среднее значение будет получено с помощью деления максимальной суммы на размер подмассива k
Таким образом, правильным ответом является C. Для решения задачи нужно использовать метод "скользящего окна" для эффективного поиска максимального среднего.
Иммутабельность (immutability) — это концепция в программировании, особенно в функциональном программировании, которая заключается в избегании изменяемых данных. Иммутабельные объекты — это объекты, которые не могут быть изменены после создания. При изменении такого объекта фактически создаётся новый объект с измененным значением, а старый остается неизменным.
Основные принципы иммутабельности:
Неизменяемость: Объекты не могут быть изменены после создания.
Новый объект при изменении: Любая операция, которая кажется изменяет объект, на самом деле создаёт новый объект с измененными значениями.
Отсутствие побочных эффектов: Функции, работающие с иммутабельными объектами, не изменяют состояние существующих данных и не создают побочных эффектов, если не создавать новые переменные.
Простота и предсказуемость: Код становится более простым и предсказуемым, так как не происходит нежелательного изменения объектов.
Преимущества иммутабельности:
Безопасность: Исключение побочных эффектов, снижение вероятности ошибок, связанных с одновременным изменением объектов из разных частей программы. * Упрощение отладки: Код, который не изменяет данные, намного проще отлаживать. * Многопоточность: Легче работать с иммутабельными объектами в многопоточной среде, поскольку не нужно беспокоиться о гонках данных.
Иммутабельные и изменяемые объекты в Python:
Пример иммутабельных объектов:
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. Иммутабельность - это концепция, которая заключается в избегании изменяемых данных и использовании только неизменяемых, что упрощает код и уменьшает вероятность побочных эффектов.
Композиция функций (function composition) — это функциональный паттерн, который позволяет объединять две или более функции таким образом, что результат одной функции передается в качестве аргумента другой функции. Это позволяет создавать новые, более сложные функции, из простых и переиспользуемых.
Пример (из текста вопроса):
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. Композиция функций - это комбинация двух или более функций, при которой результат выполнения одной функции передается в качестве аргумента другой функции.