'''Тема урока: пользовательские функции
Функции без параметров
Преимущества использования функций
Ключевое слово pass
Решение задач
Аннотация. Создание пользовательских функций без параметров.

Функции
В предыдущих уроках мы использовали встроенные в Python функции print(), input(), int(), str(), len() и многие другие.
 Пришло время начать писать свои собственные функции.

В самом начале курса вам было предложено решить задачу, в которой требовалось изобразить звездный прямоугольник
 размерами 5 \times 75×7 (55 строк и 77 столбцов).

Наш первый вариант кода выглядел примерно так:

print('*******')
print('*******')
print('*******')
print('*******')
print('*******')
Далее мы изучили оператор умножения строки на число (оператор повторения) и написали бы код:

print('*' * 7)
print('*' * 7)
print('*' * 7)
print('*' * 7)
print('*' * 7)
Ну и наконец, мы изучили циклы, после чего код принял бы вид:

for _ in range(5):
    print('*' * 7)
А теперь представим, что таких прямоугольников нужно изобразить не один, а несколько, скажем 3 штуки.

Тогда код программы будет иметь вид:

for _ in range(5):
    print('*' * 7)

print()

for _ in range(5):
    print('*' * 7)

print()

for _ in range(5):
    print('*' * 7)
Результатом выполнения такого кода будет:

*******
*******
*******
*******
*******

*******
*******
*******
*******
*******

*******
*******
*******
*******
*******
И хотя предыдущий код полностью решает поставленную задачу, он не лишен недостатков. Во-первых, он довольно громоздкий
 из-за повторения части кода, отвечающей за вывод прямоугольника. Во-вторых, если понадобится изменить размеры
 прямоугольника, придется менять их трижды, в каждой части кода, выводящей прямоугольник.

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

Для создания функции пишем такой код:

def draw_box():
    for _ in range(5):
        print('*' * 7)
Когда функция создана, чтобы увидеть результат ее работы, надо вызвать ее по имени:

draw_box()
Теперь чтобы изобразить 3 прямоугольника можно написать код:

draw_box()
print()
draw_box()
print()
draw_box()
Код стал короче, читабельнее (за счет удачного названия функции), а главное, если потребуются иные размеры
прямоугольника, достаточно будет изменить только саму функцию draw_box().

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

Python и тут требует соблюдения тех же правил, что при именовании переменных:

в имени функции используются только латинские буквы a-z, A-Z, цифры и символ нижнего подчеркивания (_);

имя функции не может начинаться с цифры;

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

символы верхнего и нижнего регистра различаются.

Помни: Python — регистрочувствительный язык. Для именования переменных и функций принято использовать стиль
lower_case_with_underscores (слова из маленьких букв с подчеркиваниями).

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

функцию, которая рисует прямоугольник можно назвать draw_box();
функцию, которая печатает чек, можно назвать print_check();
функцию, которая вычисляет заработную плату до удержаний, можно назвать calculate_gross_рау().
Каждое из этих имен дает описание того, что функция делает.

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

Функции объявляются с помощью ключевого слова def (от слова define – определять). За ключевым словом def следуют
название функции, круглые скобки (), и двоеточие :.

def название_функции():
    блок кода


   Первая строка объявления функции называется заголовком функции.

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

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

Для выделения строк блока кода отступом программисты Python обычно используют четыре пробела, в соответствии со
стандартом PEP 8.

Рассмотрим объявление функции:

def print_message():
    print('Я - Артур,')
    print('король британцев. ')
Этот фрагмент кода определяет функцию с именем print_message(). Тело ее состоит из двух инструкций, и вызов приведет
к их исполнению.

Вызов функции
Для вызова функции пишут ее название и круглые скобки.

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

# объявление функции
def print_message():
    print('Я - Артур,')
    print('король британцев. ')

# вызов функции
print_message()
Примечания
Примечание 1. Обратите внимание, что объявление пользовательской функции немного напоминает использование условного
 оператора if и циклов for, while.

Примечание 2. Объявление функции должно предшествовать ее вызову. Следующий программный код:

# вызов функции
print_message()

# объявление функции
def print_message():
    print('Я - Артур,')
    print('король британцев. ')
приведет к ошибке:

NameError: name 'print_message' is not defined
Примечание 3. При объявлении функции следует убедиться, что каждая строка тела функции начинается с одинакового
количества пробелов, иначе произойдет ошибка. Например, приведенное ниже определение функции приведет к ошибке:

def print_greeting():
    рrint('Доброе утро!')
рrint('Сегодня мы будем изучать функции.')
    рrint('Это очень важная тема!')
Примечание 4. Иногда, при объявлении функции требуется сделать своего рода заглушку, чтобы функция ничего не выполняла.
Тогда мы используем ключевое слово pass:

def do_nothing():
    pass
Мы объявили функцию с именем do_nothing(). Тело такой функции содержит единственную строку кода, которая ничего не
делает.

Примечание 5. Функции часто называют подпрограммами.

Примечание 6. Посвящается всем, кто забывает вызвать функцию и ожидает от нее результата:'''
'''Звездный прямоугольник 1
Напишите функцию draw_box(), которая выводит звездный прямоугольник с размерами 14×10 в соответствии с образцом:

**********
*        *
*        *
*        *
*        *
*        *
*        *
*        *
*        *
*        *
*        *
*        *
*        *
**********
Примечание. Для вывода прямоугольника используйте цикл for.  '''

#
# def draw_box() -> None:
#     for i in range(14):
#         print('*' + '* '[0 < i < 13] * 8 + '*')
#
#
# draw_box()  # вызов функции

'''Звездный треугольник 1
Напишите функцию draw_triangle(), которая выводит звездный прямоугольный треугольник с катетами, равными 1010 в соответствии с образцом:

*
**
***
****
*****
******
*******
********
*********
**********
Примечание. Для вывода треугольника используйте цикл for.  

Напишите программу. Тестируется через stdin → stdout'''
#
# def draw_box() -> None:
#     for i in range(11):
#         print( i * '*')
#
#
# draw_box()  # вызов функции
