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

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

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

Функции с переменным числом аргументов. Аргументы, имеющие значение по умолчанию

В приведенном выше синтаксисе заголовка функции списки формальных и фактических параметров должны соответствовать по числу параметров и их положению. При вызове функции k-му формальному параметру списка ставится в соответствие k- й фактический параметр. Язык Pythonпредлагает более гибкую стратегию соответствия списков фактических и формальных параметров. Во-первых, для некоторых параметров в момент объявления функции могут быть заданы значения по умолчанию. Для таких параметров в момент вызова фактические параметры могут не задаваться, если устраивают значения по умолчанию. Конечно, в момент вызова допускается изменение значений по умолчанию. Еще одно расширение связано с тем, что некоторому параметру может ставиться в соответствие не один фактический параметр, а целый кортеж. Понятно, что такой формальный параметр может существовать в единственном экземпляре.

Синтаксис заголовка функции в таком расширенном варианте выглядит следующим образом:

def <имя функции>(<список имен7gt;, *<имя>, <список имен со значениями по умолчанию>):

Список фактических параметров при вызове функции должен содержать не меньше элементов чем число элементов в первом списке имен. Пусть число формальных параметров в этом списке равно n, а после следует параметр со звездочкой. Пусть число фактических параметров равно m > n. Тогда размер кортежа фактических параметров, который ставится в соответствие параметру со звездочкой, равен m - n.

Для формальных параметров, входящих в список имен с заданными значениями по умолчанию, фактические параметры не задаются, если значения по умолчанию не требуют переопределения. Фактический параметр, имеющий форму: <имя> = <значение> при условии, что имя входит в список имен по умолчанию, заменяет значение, заданное по умолчанию, значением, заданным фактическим параметром.

Рассмотрим пример задания функции, включающей параметры всех трех типов. Пусть требуется создать список, первые n элементов которого представляют случайные числа. Далее в список следует включить некоторый кортеж фиксированных чисел. Случайные числа выбираются из некоторого диапазона, границы которого задаются по умолчанию. Вот как выглядит описание такой функции:

def CreateList(n, *e, min = 0, max = 100):
    """
    Первоначально создается список из n элементов,
    заполненных случайными числами в диапазоне min ... max
    Затем список расширяется включением аргументов,
    число которых может быть произвольным.
    Значения аргументов min и max задаются по умолчанию
    """
    import random
    a = []
    for i in range(n):
        a.append(random.randint(min, max+1))
    for item in e:
        a.append(item)
    return a

Заметьте, параметр е, задаваемый со звездочкой, интерпретируется как коллекция элементов. Получить доступ ко всем фактическим параметрам, связанным с этим формальным параметром, можно итерированием по этой коллекции, используя оператор for.

Вот тест, в котором эта функция вызывается:

def test3():
   
    print ("Создание массива со случайными и неслучайными элементами")
    mas = CreateList(5, 77, 33, 11, min = -100)
    print("CreateList(5, 77, 33, 11, min = -100) = ", mas) 
test3()

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


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

import random
def CreateDepartment(p1, p2, p3, *p, director = "Висицкий", secretary = "Балабенкова"):
    """
    Формирование состава отдела
    p1, p2, p3 - фиксированные сотрудники
    *p - группа сотрудников произвольного размера
    director - директор - задан по умолчанию
    secretary - секретарь - задан по умолчанию
    """
    dep_state = []
    dep_state.append(p1)
    dep_state.append(p2)
    dep_state.append(p3)
    for item in p:
        dep_state.append(item)
    department = [director, secretary, dep_state]
    return department

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

def test4():
    #Случайный выбор сотрудников из фиксированного множества
    rand_set = ["Свердлов", "Суриков", "Тимофеев", "Фадеев", "Жукова", "Иванов"]
    p1 = rand_set[random.randint(0, 5)]
    rand_set.remove(p1)
    p2 = rand_set[random.randint(0, 4)]
    rand_set.remove(p2)
    p3 = rand_set[random.randint(0, 3)]
    rand_set.remove(p3)
    department = CreateDepartment(p1, p2, p3, "Седнев", "Ковальский", "Богун")
    print("директор = ", department[0])
    print("секретарь = ", department[1])
    print("сотрудники = ", department[2])
test4()

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


< Лекция 1 || Лекция 13: 12345
Елена Лаптева
Елена Лаптева

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

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

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

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

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

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