Функции


Функции являются очень удобным инструментом для структурирования кода программы

В общем виде инструкция для объявления функции имеет вид:




def <имя>(<аргументы>):
<блок>








Очень часто тело функции содержит необязательную инструкцию return. Эта инструкция завершает работу функции и возвращает результат.




>>> def summa(a,b,c):
... return a+b+c
...
>>> summa(1,2,4)
7
>>>






Тип значения, которое возвращает функция, определяется типами ее аргументов




>>> def summa(a,b,c):
... return a+b+c
...
>>> summa('a','b','c')
'abc'
>>>






Аргументы могут передаваться функции с использованием позиции и с использованием ключей. Во втором случае при вызове функции используется форма <имя функции>(<имя аргумента>=<значение аргумента>).




>>> def summa(a,b,c):
... return a+b+c
...
>>> summa(c=4,b=2,a=1)
7
>>>






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




>>> def summa(a,b=2,c=4):
... return a+b+c
...
>>> summa(1)
7
>>> summa(1,2)
7
>>> summa(1,2,4)
7
>>>






При объявлении и вызове функции перед именем аргумента можно использовать символы * и **. Использование символов * и ** при вызове функции позволяет передавать аргументы в виде кортежа или словаря. Если символы * и ** используются при объявлении функции, то они позволяют функции принимать произвольное количество аргументов в виде кортежа или словаря.

Пример передачи аргументов функции в виде кортежа




>>> def summa(a,b,c):
... return a+b+c
...
>>> args=(1,2,4)
>>> summa(*args)
7






Пример передачи аргументов функции в виде словаря




>>> def summa(a,b,c):
... return a+b+c
...
>>> kwargs={'a':1,'b':2,'c':4}
>>> summa(**kwargs)
7






Пример передачи функции произвольного числа аргументов в виде кортежа




>>> def func1(*args):
... print args
...
>>> func1()
()
>>> func1(1)
(1,)
>>> func1(1,2)
(1, 2)
>>> func1(1,2,'c',2.5)
(1, 2, 'c', 2.5)
>>>






В качестве примера объявим функцию summa, вычисляющую сумму произвольного числа аргументов




>>> def summa(*args):
... s=0.0
... for i in args:
... s=s+float(i)
... return s
...
>>> print summa()
0.0
>>> print summa(1)
1.0
>>> print summa(1,2,3.5,'5')
11.5
>>>






Пример передачи функции произвольного числа аргументов в виде словаря




>>> def func2(**kwargs):
... print kwargs
...
>>> func2()
{}
>>> func2(a=1)
{'a': 1}
>>> func2(a=1,b='text',c=1.5)
{'a': 1, 'c': 1.5, 'b': 'text'}
>>>




 




>>> def summa(**kwargs):
... s=0.0
... for i in kwargs.values():
... s=s+float(i)
... return s
...
>>> print summa()
0.0
>>> print summa(a=1)
1.0
>>> print summa(a=1,b=2,c=4)
7.0
>>>




При объявлении функций можно комбинировать обычные аргументы и аргументы со знаками * и **. Например, функция func(a,*args) требует наличие одного обязательного аргумента a и произвольного количества необязательных аргументов в виде кортежа args. Функция func(*args,**kwargs) позволяет принимать произвольное количество аргументов в виде кортежа и (или) словаря.

 



Анонимные функции


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

 




>>> a=[lambda x:x, lambda x:2*x]
>>> for i in a: print i(2)
...
2
4
>>>




 




>>> func=lambda a,b:a+b
>>> func(1,2)
3
>>>