Изменяемые и неизменяемые объекты

  1. Создайте функцию list_of_empty_lists(n), которая возвращает список из пустых списков длины n. Убедитесь, что все пустые списки внутри разные.
  2. Создайте функцию, которая получает на вход список и меняет местами первый и последний элемент. Эта функция должна возвращать новый список, не меняя исходный.
    • Решите эту же задачу, но функция не должна ничего возвращать, зато должна изменять переданный список.
  3. Напишите функции, которые получают на вход значение одного из следующих типов:

    изменяемый неизменяемый
    список (list) кортеж (tuple)
      строка (string)
    множество (set) множество (frozenset)
    словарь (dict)  

    и удаляют оттуда один произвольный элемент. Не имеет значения, какой, первый, последний. Просто в результате на один элемент должно стать меньше. Если значение было пустым и удалять нечего, значение должно остаться пустым.

    Т.е. вам уже нужно реализовать 6 функций. А на самом деле 12, потому что каждую функцию требуется реализовать двумя способами. Сначала чистую функцию, которая возвращает новое значение, не изменяя переданного. Потом функцию, которая ничего не возвращает, зато изменяет переданное значение.

    Вот вам код для проверки своих 12 функций:

    a_list = [10, "hello", 42.0, True]
    a_tuple = (10, "hello", 42.0, True)
    a_string = "hello"
    a_set = {10, "hello", 42.0, True}
    a_frozenset = frozenset(a_list)  # создаем из списка
    a_dict = {"cat": "mew", "dog": "woof", "duck": "quack"}
       
    # чистые функции    
    print("стало", shrinkList(a_list))
    print("было", a_list)
    print("стало", shrinkTuple(a_tuple))
    print("было", a_tuple)
    print("стало", shrinkString(a_string))
    print("было", a_string)
    print("стало", shrinkSet(a_set))
    print("было", a_set)
    print("стало", shrinkFrozenset(a_frozenset))
    print("было", a_frozenset)
    print("стало", shrinkDict(a_dict))
    print("было", a_dict)
       
    # изменяющие функции
    shrinkListInPLace(a_list)
    print("изменилось так:", a_list)
    shrinkTupleInPLace(a_tuple)
    print("изменилось так:", a_tuple)
    shrinkStringInPLace(a_string)
    print("изменилось так:", a_string)
    shrinkSetInPLace(a_set)
    print("изменилось так:", a_set)
    shrinkFrozensetInPLace(a_frozenset)
    print("изменилось так:", a_frozenset)
    shrinkDictInPLace(a_dict)
    print("изменилось так:", a_dict)
    

    Все ли эти функции можно реализовать? Если какую-то функцию реализовать невозможно, пусть она печатает на экране, что это невозможно.