Функции
Декомпозиция — способ разбиения текста программы на отдельные блоки, каждый из которых реализует определенную осмысленную задачу, часть общей работы. Одни и те же блоки могут быть использованы в разных местах программы (или нескольких программ).
Абстракция — позволяет сконцентрироваться на смысле и сути данных и/или программы, не обращая внимания на особенности реализации этих данных и/или программы.
Функция определяется:
def <Название функции>(параметр1, параметр2, …):
[tab] —код—
[tab] return параметр1 + параметр2
Если не указывать return – вернется None
Например:
#инициализируем функцию Sum
def Sum(a, b):
return a+b
#инициализируем функцию PrintMsg в которой вызываем функцию Sum
def PrintMsg(yourMsg, a, b):
print(yourMsg,"sum=",Sum(a,b))
PrintMsg("Hello from func!", 1,4) #вызываем функцию PrintMsg
Функция с значениями по умолчанию:
Можно сделать значения по умолчанию – для этого при инициализации задаем их.
Например:
#инициализируем функцию Sum
def Sum(a=5, b=2): return a+b
В этом случае при вызове Sum() получим ответ 7
Если число ПОЗИЦИОННЫХ аргументов заранее неизвестно – можно указать *args (кортеж)
Например:
def SomeArgFunc(cnt, *args):
for i in range(0,cnt,1):
print("msg #",i,args[i])
SomeArgFunc(3, "arg1", "arg2", "arg3")
print("_______________")
SomeArgFunc(4, "arg1", "arg2", "arg3", "arg4")
По аналогии можно принять переменное количество именованных аргументов, тогда перед именем ставим **
def not_random_args_random_amm(**kwargs):
# в этом же случае произвольное количество позиционных аргументов будет записано как словарь
# в формате ключ-значение
# в kwargs будет записано все, что «не поместилось» в именованные аргументы (у нас он один)
return kwargs
# возвращает словарь
not_random_args_random_amm(hello=’world’)
Аргументы, передаваемые в функцию м.б. именованными и позиционными
Sum(1, 4) – позиционные аргументы
Sum(a=1, b=4) – именованные аргументы
Sum(b=4, a=1) – именованные аргументы
Позиционные аргументы имеют ЧЕТКУЮ позицию, их нельзя менять местами
Области видимости:
Глобальная
Локальная (внутри функции)
В локальных функциях нельзя изменять глобальные переменные – т.е. синтаксис
a = 20
def f(x):
a = a + 3 #Ошибка
x = x + c
return x
print(a, f(4))
Приведет к ошибке – нужно создавать буферную локальную переменную и менять ее
c = a + 3, x = x + c
По сути: если внутри функции прописали “Имя глобальной переменной”=… — то этим мы создали локальную переменную!
Можно указать функции, что мы работаем с глобальной переменной
a = 20
def f(x):
global a
a = a + 3
x = x + a
return x
print(a, f(4)) #выведет 20 27
print(a) #выведет 23
При первом выводе значение а еще не изменилось!!!
Т.е. вывели старое значение, потом посчитали функцию и вывели ее
Локальная функция внутри функции:
Иногда бывает необходимость задать локальную функцию внутри функции, но здесь возникает проблема – внутренняя функция ничего не знает в внешней и ее переменных.
Пример:
# функции increase_a, инициализированной внутри some_func
def some_func():
a = 5
def increase_a():
# nonlocal a
a += 1
return a
return increase_a
При вызове some_func()() # происходит ошибка UnboundLocalError
Функция increase_a() хоть и является локальной, но вызывается в глобальной области видимости, поэтому не может увидеть переменную а.
Для функции increase_a() переменная a – внутренняя “якобы локальная” переменная о которой ничего неизвестно, чтобы указать ее необходимо использовать ключевое слово nonlocal
Раскомментируем # nonlocal a, вызовем функцию
some_func()() #теперь 5+1 = 6
Запись функций в одну строчку (анонимные лямбда функции)
func = lambda arg1, arg2…argN : //code
func(arg1,….argN)
func = lambda *args: args[0]*args[1]
func(2, 3, 4)
Выполнять присвоение указателю на функцию func необязательно, можно пользоваться и анонимной функцией.