Повторное использование кода – важный момент в любом языке программирования. Когда код вырастает в объеме, с ним становится сложно работать.
Работая над большим проектом, важно следовать принципу Don’t Repeat Yourself, или DRY (англ. «избегайте самоповторов»). Мы уже рассмотрели один способ, позволяющий так работать: использование циклов.

В этой статье мы рассмотрим еще один.
Мы уже работали с функциями в предыдущих уроках.
Выражение, состоящее из слова, за которым следует текст в скобках, – это вызов функции.
Вот некоторые примеры, которые вы уже видели:

print(“Hello world!”)
range(2, 20)
str(12)
range(10, 20, 3)

Слова перед круглыми скобками – имена функций, а значения, разделенные запятыми в скобках, – аргументы функций.

В дополнение к предопределенным функциям, вы можете создавать свои собственные функции с помощью инструкции def.
Приведем пример функции с именем my_func: она не принимает ни одного аргумента и выводит три раза слово «spam». Сначала функция определяется, затем вызывается. Инструкции внутри функции выполняются только при ее вызове.

def my_func():
print(“spam”)
print(“spam”)
print(“spam”)

my_func()

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

hello()

def hello():
print(“Hello world!”)

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

def print_with_exclamation(word):
print(word + “!”)

print_with_exclamation(“spam”)
print_with_exclamation(“eggs”)
print_with_exclamation(“python”)

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

def print_sum_twice(x, y):
print(x + y)
print(x + y)

print_sum_twice(5, 8)

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

def function(variable):
variable += 1
print(variable)

function(7)
print(variable)

Этот код выведет ошибку, потому что переменная variable определена внутри функции и на нее можно ссылаться только там.

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

def max(x, y):
if x >=y:
return x
else:
return y

print(max(4, 7))
z = max(8, 5)
print(z)

После того, как функция возвращает значение, она больше не выполняется. Какой бы код ни шел после инструкции return, он не будет выполняться.

def add_numbers(x, y):
total = x + y
return total
print(“This won’t be printed”)

print(add_numbers(4, 5))

Хотя синтаксис функций отличается от обычных переменных, в остальном они аналогичны другим видам значений.
Им могут назначаться и переназначаться переменные, затем они могут вызываться по своим именам.

def multiply(x, y):
return x * y

a = 4
b = 7
operation = multiply
print(operation(a, b))

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

def add(x, y):
return x + y

def do_twice(func, x, y):
return func(func(x, y), func(x, y))

a = 5
b = 10

print(do_twice(add, a, b))

Как видите, функция do_twice принимает функцию в качестве аргумента и затем вызывает ее.