Задача об изменяемых и неизменяемых объектах

  1. Создайте один скрипт на python и напишите в нем функции, которые описаны дальше. Функции получают на вход значение одного из следующих типов:

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

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

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

    Вот вам код для проверки своих 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", "posov": "python"}
       
    # чистые функции    
    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)
    

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

  2. Один преподаватель, который плохо разбирался в Python, написал следующий код:

     table = [
         [11, 12, 13],
         [21, 22, 23],
         [31, 32, 33]
     ]
       
     table2 = table.copy()
     table2[0][0] = 111
     print(table)
     print(table2)
     print(table == table2)  # почему-то True
    

    и очень удивился, когда обнаружил, что table и table2 оба содержат 111 в первом элементе первой строки. Кажется, что выше написано копирование table2 = table.copy(), и списки должны быть разные. Попробуйте в комментарии объяснить, почему так произошло, и сделайте функцию deep_copy, которая получает на вход список из списков чисел, и возвращает настоящую копию, которая не будет изменяться вместе с исходным списком: table2 = deep_copy(table) должно сделать так, чтобы 111 осталось только в table2.