<SYSTEM_TASK:>
Given the following text description, write Python code to implement the functionality described below step by step
<END_TASK>
<USER_TASK:>
Description:
 <h1>Содержание<span class="tocSkip"></span></h1>
<div class="toc"><ul class="toc-item"><li><span><a href="#Объявление-функции" data-toc-modified-id="Объявление-функции-1">Объявление функции</a></span></li><li><span><a href="#Вызов-функции" data-toc-modified-id="Вызов-функции-2">Вызов функции</a></span></li><li><span><a href="#Тип-возвращаемого-значения" data-toc-modified-id="Тип-возвращаемого-значения-3">Тип возвращаемого значения</a></span></li><li><span><a href="#Виды-параметров" data-toc-modified-id="Виды-параметров-4">Виды параметров</a></span><ul class="toc-item"><li><span><a href="#Формальные-и-фактические" data-toc-modified-id="Формальные-и-фактические-4.1">Формальные и фактические</a></span></li><li><span><a href="#По-умолчанию" data-toc-modified-id="По-умолчанию-4.2">По умолчанию</a></span></li><li><span><a href="#Именованые" data-toc-modified-id="Именованые-4.3">Именованые</a></span></li><li><span><a href="#Произвольное-количество" data-toc-modified-id="Произвольное-количество-4.4">Произвольное количество</a></span></li></ul></li><li><span><a href="#Области-видимости" data-toc-modified-id="Области-видимости-5">Области видимости</a></span><ul class="toc-item"><li><span><a href="#global" data-toc-modified-id="global-5.1">global</a></span></li></ul></li></ul></div>
Функции
Функция — часть программы, реализация которой выполняется отдельно. Обычно часть кода выделяют в функции, если один и тот же кусок кода нужно повторить несколько раз с разными значениями переменных. Примеры встроенных в Python функций
Step1:  Пример с возвращаемым значением
Step2:  Писать функции с возвращаемым значением предпочтительнее.
Вызов функции
Параметры при вызове функции можно задавать явно
Step3:  Переменные тоже могут быть параметрами при вызове функции
Step4:  Если у функции есть возвращаемое значение, то стоит его запомнить в переменную или хотя бы вывести.
Step5:  Можно даже писать внутри одного вызова функции вызов другой функции. Тогда сначала выполнится внутренний вызов и посчитается результат, затем внешний вызов.
Step6:  Тип возвращаемого значения
У возвращаемого значения может быть любой тип. Например, в данной функции у результата логический тип
Step7:  Тип float
Step8:  В случае функции с побочным эффектом без возвращаемого значения Python всё равно вернёт специальное значение
Step9:  Виды параметров
Формальные и фактические
Формальные параметры — это имена аргументов функции, за которыми могут скрываться произвольные значения.
Фактические параметры — это конкретные значения, которые связываются с формальными параметрами при вызове функции.
Step10:  По умолчанию
Для любого параметра можно указать значение по умолчанию, которое будет использовано, если параметр не передан явно.
Step11:  Именованые
Любой параметр можно передать, явно указав имя
Step12:  Произвольное количество
Step13:  Области видимости
Область видимости — это изолированная часть программы со своим набором переменных.
Все переменные, объявленные в основной программе находятся в глобальной области видимости.
При каждом вызове функции создаётся новая локальная область видимости.
Step14:  global
Ключевое слово global говорит не создавать локальную переменную и изменять вместо этого глобальную.
<ASSISTANT_TASK:>
Python Code:
def print_sum(a, b):
    print(a + b)
Explanation: <h1>Содержание<span class="tocSkip"></span></h1>
<div class="toc"><ul class="toc-item"><li><span><a href="#Объявление-функции" data-toc-modified-id="Объявление-функции-1">Объявление функции</a></span></li><li><span><a href="#Вызов-функции" data-toc-modified-id="Вызов-функции-2">Вызов функции</a></span></li><li><span><a href="#Тип-возвращаемого-значения" data-toc-modified-id="Тип-возвращаемого-значения-3">Тип возвращаемого значения</a></span></li><li><span><a href="#Виды-параметров" data-toc-modified-id="Виды-параметров-4">Виды параметров</a></span><ul class="toc-item"><li><span><a href="#Формальные-и-фактические" data-toc-modified-id="Формальные-и-фактические-4.1">Формальные и фактические</a></span></li><li><span><a href="#По-умолчанию" data-toc-modified-id="По-умолчанию-4.2">По умолчанию</a></span></li><li><span><a href="#Именованые" data-toc-modified-id="Именованые-4.3">Именованые</a></span></li><li><span><a href="#Произвольное-количество" data-toc-modified-id="Произвольное-количество-4.4">Произвольное количество</a></span></li></ul></li><li><span><a href="#Области-видимости" data-toc-modified-id="Области-видимости-5">Области видимости</a></span><ul class="toc-item"><li><span><a href="#global" data-toc-modified-id="global-5.1">global</a></span></li></ul></li></ul></div>
Функции
Функция — часть программы, реализация которой выполняется отдельно. Обычно часть кода выделяют в функции, если один и тот же кусок кода нужно повторить несколько раз с разными значениями переменных. Примеры встроенных в Python функций: input(), print(), sum(). Можно и нужно писать свои функции.
Функция состоит из:
Названия — отражает то, что функция должна делать.
Списка аргументов (параметров) — то, с чем это делать.
Тела функции — что она делает на самом деле.
Результата (возвращаемого значения) — то, что она сделала.
Объявление функции
def название(параметры):
    тело функции
    return результат
Ключевое слово return пишется, если нужен результат вычислений. Если не нужен результат, только побочные эффекты, то можно не писать return.
Пример с побочным эффектом:
End of explanation
def get_sum(a, b):
    return a + b
Explanation: Пример с возвращаемым значением:
End of explanation
print_sum(5, 7)
Explanation: Писать функции с возвращаемым значением предпочтительнее.
Вызов функции
Параметры при вызове функции можно задавать явно:
End of explanation
a, b = 7, 8
print_sum(a, b)
print_sum(a, 1)
Explanation: Переменные тоже могут быть параметрами при вызове функции:
End of explanation
print(get_sum(2, 3))
a = get_sum(1, 4)
print(a)
get_sum(1, 2)  # У этой строчки нет эффекта. Результат посчитан, но не запомнен.
Explanation: Если у функции есть возвращаемое значение, то стоит его запомнить в переменную или хотя бы вывести.
End of explanation
a = 15
x = get_sum(1, a)
y = get_sum(x, get_sum(2, 2))
print(x, y)
Explanation: Можно даже писать внутри одного вызова функции вызов другой функции. Тогда сначала выполнится внутренний вызов и посчитается результат, затем внешний вызов.
End of explanation
def is_leap(year):
    return year % 4 == 0 and year % 100 != 0 or year % 400 == 0
print(is_leap(2012))
Explanation: Тип возвращаемого значения
У возвращаемого значения может быть любой тип. Например, в данной функции у результата логический тип:
End of explanation
def mean(a, b):
    return (a + b) / 2
print(mean(6, 6))
print(mean(5, 6))
Explanation: Тип float:
End of explanation
def print_effect():
    print("Some effect")
result = print_effect()
print(result)
print_effect()  # Правильно так
Explanation: В случае функции с побочным эффектом без возвращаемого значения Python всё равно вернёт специальное значение: None, которое означает, что значение отсутствует. Но так писать не надо, нет результата — значит нет, не нужно пытаться его достать.
End of explanation
def add_to_list(lst, i, delta):  # lst, i, delta - формальные параметры
    lst[i] += delta
    
a = [1, 2, 3]
x = 4
add_to_list(a, 1, x)  # [1, 2, 3], 1, 4 - фактические параметры
Explanation: Виды параметров
Формальные и фактические
Формальные параметры — это имена аргументов функции, за которыми могут скрываться произвольные значения.
Фактические параметры — это конкретные значения, которые связываются с формальными параметрами при вызове функции.
End of explanation
def inc(a, b=1): 
    return a + b
print(inc(3, 5))
# b - необязательный параметр
print(inc(3))
Explanation: По умолчанию
Для любого параметра можно указать значение по умолчанию, которое будет использовано, если параметр не передан явно.
End of explanation
# Эти три вызова функции эквивалентны
print(inc(2, b=5))
print(inc(a=2, b=5))
print(inc(b=5, a=2))
# Параметры sep, end и file у функции print - это именованые параметры со значением по умолчанию
print(1, 2, 3, sep=" | ", end=" !")
def smth(a, b=2, c=3, d=4): 
    print(a, b, c, d) 
    
# Правильно 
smth(1) 
smth(c=5, a=3) 
smth(3, c=5) 
smth(1, 3, 5) 
 
# Неправильно 
smth()  # пропущен требуемый аргумент 
smth(a=5, 1000)  # позиционный параметр вслед за именованным 
smth(10, a=20)     # повторное значение параметра 
smth(arg=100500)  # неизвестное имя параметра 
Explanation: Именованые
Любой параметр можно передать, явно указав имя:
End of explanation
def sum(*args):  # args - это список аргументов функции 
    result = 0 
    for x in args: 
        result += x 
    return result 
 
print(sum(1))  # args = [1]
print(sum(1, 2, 3))  # args = [1, 2, 3]
lst = [1, 2, 4, 8, 16, 32] 
print(sum(*lst))  # args = [1, 2, 4, 8, 16, 32]
Explanation: Произвольное количество
End of explanation
# При каждом вызове функции fib создаётся локальная область видимости с переменными n, a, b и i
def fib(n):
    a, b = 0, 1
    for i in range(n):
        a, b = b, a + b
    return a
# Глобальная область видимости содержит переменную k
k = int(input())
print(fib(k))
# При отсутствии переменной в локальной области видимости, используется такая же переменная из глобальной
def f(a):
    return a + b
b = 4
print(f(7))
# Ошибка. Локальная переменная неизвестна после окончания функции 
def f():
    local_var = "Only local"
    print(local_var)
f()
print(local_var)
Explanation: Области видимости
Область видимости — это изолированная часть программы со своим набором переменных.
Все переменные, объявленные в основной программе находятся в глобальной области видимости.
При каждом вызове функции создаётся новая локальная область видимости.
End of explanation
accumulator = 0
def accumulate(x):
    global accumulator
    accumulator += x
    
accumulate(8)
accumulate(13)
print(accumulator)
# Ошибка. Попытка использовать глобальную переменную перед созданием локальной
def f():  
    print(s) 
    s = "Local variable" 
    print(s)
s = "Global variable" 
f() 
Explanation: global
Ключевое слово global говорит не создавать локальную переменную и изменять вместо этого глобальную.
End of explanation
<END_TASK>