НОЧУ ДПО "Национальный открытый университет "ИНТУИТ"
Опубликован: 24.01.2021 | Доступ: свободный | Студентов: 1273 / 22 | Длительность: 03:57:00
Лекция 13:

Функции и процедуры

< Лекция 1 || Лекция 13: 12345

Аннотированный заголовок

Поскольку для понимания того, что делает метод, крайне важно знать какие же типы могут быть у фактических параметров, в PythPythonon разрешили имена формальных параметров сопровождать их типами, а также указывать тип возвращаемого значения (None - для процедур). Однако эти типы играют роль аннотаций - комментариев, обращенных к человеку, и не играющих роли для интерпретатора языка. Единственное, что проверяет интерпретатор, определен ли тип, приписанный формальному параметру. Интерпретатор не проверяет соответствует ли тип фактического параметра типу формального параметра. Никакой статический контроль типов не выполняется. Если нет соответствия, то возникнет ошибка в момент выполнения.

Аннотации - это еще одна форма заголовочного комментария. Она полезна и ее рекомендуется использовать. В своих примерах я, чаще всего, для краткости буду опускать аннотации и заголовочный комментарий, полагая, что вся информация содержится в пояснениях к коду, а на результат комментарии и аннотации не влияют.

Аннотированные заголовки для выше приведенных методов имеют вид:

def Gorner(a: list, x: float)->float:
def Max_Min(a: list)-> list: 
def test()->None:

Покажем, что аннотации не влияют на выполнение метода. Рассмотрим следующую функцию:

def sum(a: int, b: int)->int :
    """ Возвращает сумму двух целочисленных операндов a и b
    """
    return a + b

Судя по заголовочному комментарию и аннотациям, функция sum вычисляет сумму двух целых чисел. Однако эта функция успешно работает для операндов самых разных типов, для которых определена операция "+". Операндами могут быть строки, списки, кортежи, а результатом является конкатенация операндов. Приведем тестовую процедуру:

def test0()->None:
    
    r = sum(5.5, 7.7)
    print (r)
    r = sum('a', 'b')
    print (r)
    r = sum([5, 5], [7, 7])
    print (r)
    r = sum(('five', 'seven'), ('one', 'two'))
    print (r)
    #r = sum({5, 7}, {1, 3})
    #print(r)
test0()

Результаты работы:


Как видите, функция, предназначенная для работы с целочисленными результатами, прекрасно работает и для операндов других типов, для которых определена операция сложения. Заметьте, два последних оператора в тестовой процедуре закомментированы, поскольку при попытке вызвать функцию с операндами типа "множество" (set) возникает ошибка периода выполнения. Конечно, ошибки на этапе выполнения - неприятные ошибки, гораздо лучше обнаруживать ошибки на этапе компиляции, что делается во многих языках программирования, допускающих статический контроль типов. Но создатели языка Python сознательно отказались от статического контроля типов в пользу имен, представляющих нетипизированные ссылки, - имен, которым можно присваивать объекты любых типов. Некоторое преимущество такого подхода демонстрирует метод sum, область применения которого гораздо шире в сравнении с ситуацией, когда формальные параметры имеют фиксированный тип.

Заметьте, при аннотировании типа формальных параметров и типа результата допустимо задать перечисление возможных типов. Так что определение функции sum может выглядеть так:

def sum(a: (int, float, str, list, tuple), b: (int, float, str, list, tuple))->(int, float, str, list, tuple) :
    """ Возвращает сумму двух операндов a и b
    """
    return a + b
< Лекция 1 || Лекция 13: 12345
Елена Лаптева
Елена Лаптева

Думаю. что не смогу его закончить. Хотелось предупредить других - не тратьте зря время, ищите другой курс.

Михаил Сидоров
Михаил Сидоров

Если S - последовательность, то срез задается как S(i : j) и содержит j - i элементов,

а в примере используютс другие скобки - 

NL[1:3] = ["решили", "не", "искать"]

или это не срез, тогда, что это?