Язык программирования Python




Функция: определение и вызов - часть 2


print max_min(1, 2, -1, 5, 3)

Функция с обычными (позиционными) и именованными аргументами:

def swiss_knife(arg1, *args, **kwargs): print arg1 print args print kwargs return None

print swiss_knife(1) print swiss_knife(1, 2, 3, 4, 5) print swiss_knife(1, 2, 3, a='abc', b='sdf') # print swiss_knife(1, a='abc', 3, 4) # !!! ошибка

lst = [2, 3, 4, 5] dct = {'a': 'abc', 'b': 'sdf'} print swiss_knife(1, *lst, **dct)

Пример определения функции с помощью lambda-выражения дан ниже:

func = lambda x, y: x + y

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

В языке Python функция может возвратить только одно значение, которое может быть кортежем. В следующем примере видно, как стандартная функция divmod() возвращает частное и остаток от деления двух чисел:

def bin(n): """Цифры двоичного представления натурального числа """ digits = [] while n > 0: n, d = divmod(n, 2) digits = [d] + digits return digits

print bin(69)

Примечание:

Важно понять, что за именем функции стоит объект. Этот объект можно связать с другим именем:

def add(x, y): return x + y addition = add # теперь addition и add - разные имена одного и того же объекта

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

def mylist(val, lst=[]): lst.append(val) return lst

print mylist(1), print mylist(2)

Вместо ожидаемого [1] [2] получается [1] [1, 2], так как добавляются элементы к "значению по умолчанию".

Правильный вариант решения будет, например, таким:

def mylist(val, lst=None): lst = lst or [] lst.append(val) return lst

Конечно, приведенная выше форма может использоваться для хранения в функции некоторого состояния между ее вызовами, однако, практически всегда вместо функции с таким побочным эффектом лучше написать класс и использовать его экземпляр.




Содержание  Назад  Вперед