Функции

Функции

Декомпозиция — способ разбиения текста программы на отдельные блоки, каждый из которых реализует определенную осмысленную задачу, часть общей работы. Одни и те же блоки могут быть использованы в разных местах программы (или нескольких программ).

Абстракция — позволяет сконцентрироваться на смысле и сути данных и/или программы, не обращая внимания на особенности реализации этих данных и/или программы.

 

Функция определяется:
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 необязательно, можно пользоваться и анонимной функцией.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *