Функции в Python

Стоп, стоп, стоп! Пора сделать небольшую паузу! Мы только что разобрались, что с компьютером можно общаться на понятном ему языке, давать ему различные команды и он их будет выполнять. Всё верно? Мы узнали, что компьютер понимает и привычные нам числа, и буквы, и может даже примеры с этими числами решать или целые предложения из слов складывать. А ещё он может всё это разом взять и по полочкам расставить, чтобы нам удобно было, и даже названия этим полочкам дать и запомнить! И тут вопрос: а можно ли вот так задать компьютеру любую задачу? Ну, например: "Напиши-ка мне, друг, таблицу умножения!" Да с лёгкостью! Только опять же, компьютер поймёт нас только на своём языке.И язык Python подойдёт нам отлично!

"Напиши-ка" на языке Python - это "print". Ну и скобочки потом, для задания - "print()". А как дальше быть? Ну, скажете вы, понятное дело - бежим к Google-переводчику, узнаём у него, как по-английски будет "таблица умножения". Получаем ответ: "multiplication table". Зачем же долго думать, спешим опробовать наши новые знания:

```
print(multiplication\_table)

NameError                                 Traceback (most recent call last)
<ipython-input-1-cd61db440ad3> in <module>()
----> 1 print(multiplication\_table)

NameError: name 'multiplication\_table' is not defined

```

Так-так, куча всего непонятного в результате. Но зато чётко выделяется строчка:

*NameError: name 'multiplication\_table' is not defined*

Это что ещё такое? Не беспокойтесь, каждый раз подобного вида сообщения будут означать какую-то ошибку в нашем диалоге с компьютером. Если присмотреться, можно увидеть даже в тексте этого сообщения слово Error, которое это и означает - ошибка.

Давайте разбираться: в чём тут наша ошибка, где и что не так? Еще раз смотрим на то, что нам сказал компьютер: "name "multiplication\_table' is not defined". Буквально, он нам говорит: "Уважаемый, вы мне не объяснили, что такое это ваше *multiplication table*! Вы мне что прикажете с этим делать? Печатай то, не знаю что?" И он будет прав!

Важно заметить: компьютер - это не Википедия "про всё и вся на свете". За энциклопедическими знаниями нужно обращаться к Интернету, тот нам ответит на всё, что нужно(да и на что не нужно тоже). Но Интернет, как бы это сказать, штука не совсем из нашего компьютера. Вернее, совсем не из него. А непосредственно компьютер на столе, или ноутбук у вас на коленях - это просто очень умный помощник. Было бы прекрасно, если разговор с компьютером на Python'е был бы просто дружеской болтовнёй на мирском английском. И пусть дело это чуть тоньше, но есть и плюсы: терминов, которые понимает компьютер на Python, невообразимо меньше, чем слов в любом человеческом языке. Да и правил тут куда меньше, чем на уроках в школе!

В последний раз(честно!)посмотрим на нашу ошибку:

*NameError: name 'multiplication\_table' is not defined*

Видите здесь два слова "not defined"? Это означает "не определено". Как мы помним, компьютер это нам и заявил, мол, "мною имя multiplication table не определено".

И вот, долгожданный экскурс в новый этап изучения Python! Слово "defined"(даже так: "define" - определять) программисты решили сократить. Ну и договорились между собой, пусть будет не "define", а покороче - "def". Теперь достаточно сказать компьютеру "def", и он поймёт: "Так-с, меня хотят с чем-то новеньким познакомить".

Добро пожаловать в следующую главу "Функции Python"!

```
def multiplication\_table:

```

Пока не торопимся запускать этот код, он ещё малость сыроват!

Раз компьютер - не энциклопедия, а помощник, то ему сперва надо объяснить как и что выполнить. И поверьте, если мы правильно объясним, то и он всё выполнит верно. Выше написано "def multiplication\_table". Переводим с компьютерного на наш: "Определяю для тебя кое-что новое: таблица умножения". Правда, мы тут прилепили еще и знак двоеточия. Это потому, что следом пойдёт объяснение, как нашему компьютеру такую таблицу из ничего изобрести.

Так, ничего не забыли, двигаемся дальше? А как же число, для которого мы хотели бы получить таблицу умножения? Да, было бы круто сразу для всех чисел её сделать, но мы не торопимся, всему своё время.

А пока что научимся умножать только одно число (многие вспомнят, как летел в стену учебник математики за 2-й класс со словами "Да зачем мне учить эту тупую таблицу!") :

```
def multiplication\_table(number):

```
В скобочках добавилось некое "number". Но в начале занятие мы уже говорили, что можем в Python придумывать свои слова, чтобы потом их повторно много раз использовать для наших нужд. Главное, чтобы они были из латинских букв( и "num", и наша "multiplication\_table" - как раз такие слова). Напомним, называются они общим словом - переменные.

Здесь переменная "number" - и есть то любое число, которое мы будем умножать в нашей будущей таблице. Просто пока что так его назовём, а потом подставим туда что захотим, хоть девятку, хоть квадриллион(последнее лучше не делать, пожалеем наш компьютер).

Так, а умножать на что будем? Обычно в таблице умножения умножают на числа от 1 до 9. Но мы же хотим помощи от компьютера, а не расписывать ему все действия: сначала умножим на 1, потом на 2 … и т.д.

Что делать? Зададим отсчёт!

Подсказка: чтобы умножение началось с единицы нужно указать предыдущее значение. Так компьютер понимает, откуда отсчитывать. А предыдущее у нас - это ноль!

```
def multiplication\_table(number):
  by\_number = 0

```
Почему вдруг "by\_number"? Раз мы решили назвать нашу таблицу по-английски, multiplication table, а не tablitza umnozheniya, то к чему дальше коверкать язык? Если что, недолго попросить помощи у любого онлайн-переводчика. Как и тут, имя "by\_number" - c английского переводится как "на число". Мы же умножаем одно число НА другое, так и напишем тут буквально: одно число(number) умножить на другое число(by\_number). А в значении "by\_number" зададим 0 - начало отсчёта для второго числа в нашей табличке умножения!
Ещё немного волшебства на Python:

```
def multiplication\_table(number):
  by\_number = 0
  while by\_number <= 9:

```
И этот код ещё рано запускать, но мы уже почти закончили!

Кажется, сегодня в занятии уже упоминаличь эдакие циклы - команды на Python, которые заставляют компьютер зациклиться на одном действии. Кстати, while c английского - "пока", " до тех пор как". Переводим то волшебство, что мы только что добавили с Python'ского на человеческий:

" while by\_number <= 9:" в нашем коде это "до тех пор, пока второе число меньше или равно 9".

Итак, команда задана, дальше просто умножаем одно на другое. С вашего позволения, начнём пользоваться хэштег-комментариями (да-да, так можно и нужно делать, да и как это удобно!):

```
def multiplication\_table(number): # Здесь только знакомим наш ПК с новым именем(multiplication table) и загадываем число(number)
by\_number = 0 # Тут у нас счётчик для нашего второго множителя(by\_number), а начнём мы отсчёт с нуля
while by\_number <= 9: # Это строкой командуем, что наш ПК должен пересчитать все цифры второго множителя от нуля до девяти
	by\_number = by\_number + 1 # Здесь просто прибавляем ко счёту каждый раз по единичке
	result = number \* by\_number # А здесь умножаем наше первое число на все числа счётчика и сохраняем всё в имя результат(result)

```
Мы, быть может, и стоим на пороге чего-то малого для многих умников-специалистов, но в то же время чего-то по-своему великого для нас. Ну порадуйтесь же, мы только что почти написали свою функцию( а именно так эта многострочная команда для компьютера и называется)!

Почти написали, осталась пара штрихов - вывести результат на экран! Сделаем же это красиво: все числа компьютер и так подставит в придуманные нами имена. Просто скомандуем ему print(), и в скобочках укажем что же именно напечатать:

Наше первое число(number) умножить на( \* ) второе число (by\_number), и всё это равно( = ) тому-то( result)).

Ну что, пробуем? Запускаем код!

```
def multiplication\_table(number): # Определение нашей функции
# Далее - тело нашей функции
  by\_number = 0
  while by\_number <= 9:
    by\_number = by\_number + 1
    result = number \* by\_number
    print(number, "\*", by\_number, "=", result, "\n") # Наша последняя команда;  вспомните - "\n"- символ переноса строки

```
Ничего не произошло ((

Верно, мы же с вами написали только инструкцию! Обучили наш компьютер указанной задаче!

Теперь научимся выполнять задачу. А для этого уже не надо использовать команду \*"def"\*, просто-простецки пишем само имя функции да загадываем в скобочках число, которое хотим умножить! Готовы увидеть наше первое творение в действии?

Теперь точно получится, смотрите:

```
multiplication\_table(7)

7 \* 1 = 7

7 \* 2 = 14

7 \* 3 = 21

7 \* 4 = 28

7 \* 5 = 35

7 \* 6 = 42

7 \* 7 = 49

7 \* 8 = 56

7 \* 9 = 63

7 \* 10 = 70

```

Мы с вами отлично поработали!

Два важных момента:

* Называйте функции так, чтобы по их имени каждый мог понять, какую задачу они выполняют. Да-да, мы будем писать функции не только для развлечения, но и для других людей! Позаботьтесь о них, ведь это так несложно!
* Отступы! Обратите внимание на те строки, которые мы обозвали телом функции: они все содержат отступ от края по сравнению с первой строкой. Так компьютер понимает, что эти команды относятся к самой функции и спешит их выполнять, а без отступов - не будет! Все отступы обычно расставляются автоматически, но при необходимости пользуйтесь клавишей "пробел".

Ну что, #большеинформации, #большехардкора?)

```
# А вот пример другой функции count\_sum; перевод - "посчитай сумму"

def count\_sum(x, y, z):  # А в скобках уже видим имена x, y и z - просто новые названия для любых чисел
    result = x + y + z   # Здесь же команда эти наши числа сложить и записать под именем result
    return result        # О команде return - чуть подробнее ниже

```

Друзья, как в примере выше, помните, в скобках после имени функции мы можем указать ну что захотим. Придумать любые имена и туда их записать. Умники ещё называют такие значения в скобочках параметрами функции. Как хотите, можете и вы так щегольнуть познаниями в терминологии))

Наши x, y, z могут стать теми числами, которыми мы захотим, когда будем нашу функцию непосредственно использовать! Они нужны под именами x, y, z только лишь для инструкции внутри самой(в теле) функции, чтобы компьютер в будущем знал, что ему с ними делать.

Что касается имени result - ничего страшного, что оно было и в предыдущей функции. До тех пор, пока имена используются внутри функций, они не перепутаются в наших командах вне функций. Всё будет окей, главное самим в именах не запутаться!

Ну и последнее здесь - команда return. Перевод - "возвращать". Она, собственно, то и делает - возвращает нам новенький результат, когда компьютер уже посчитал сумму. Ну или может что-то другое вернуть, смотря что мы в функции укажем! Часто функции именно этой командой и завершаются, но не всегда - мы сами творцы наших функций!

Секунду, мы же чуть не забыли опробовать работу новой функции:

```
count\_sum(3,4,5)

12

```

Дорогой студент Университета,

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

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

Вот например на языке Python есть прекрасная команда *max()* - по ней компьютер понимает, что мы просим его найти максимум

Мастер-класс "Вшиваем функцию в функцию, плюс накидываем задачу в довесок":

```
def sum\_max(x, y, z):         # Вот и новое имя для новой функции: sum\_max - сумма и максимум (от чисел в скобочках)
  new\_sum = count\_sum(x,y,z)  # А здесь наша предыщуая функция, теперь она внутри новой! Только запишем её в новое имя - new\_sum
  maximum = max(x, y, z)      # Уже упомянутая команда  max() найдёт нам максимальное их наших трёх чисел, запишет их в имя maximum
  return new\_sum, maximum     # А потом мы получим сразу два результата вот такой вот командой return

```

Давайте уже убедимся, что не наболтали там выше лишнего:

```
sum\_max(3,5,7)

(15, 7)

```
Ну и пик мастерства для первого занятия - научить компьютер выдавать аж три результата по работе всего навсего ОДНОЙ функции!
Как это сделать! Легче лёгкого - просто немного проапгрейдим нашу пушку, товарищи курсанты:

```
def sum\_max\_mean(x, y, z):      # Снова дополним имя для уже новой функци:и sum\_max\_mean, где mean - среднее значение от общей суммы(чисел в скобочках)
  new\_sum = count\_sum(x,y,z)    # А здесь всё ещё наша изначальная функция count\_sum
  maximum = max(x, y, z)        # Всё пока без изменений
  mean = new\_sum / 3            # Ага, вот и апгрейд - в имени mean сохраним сумму чисел разделённую на три(так ищут среднее арифметическое)
  return new\_sum, maximum, mean # Командуем нашему компьютеру: "верни нам три посчитанных значения!"

```
Проверим-ка, работает ли?

```
sum\_max\_mean(3,5,7)

(15, 7, 5.0)

```
Безупречно!

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

Площадь можем назвать square, а периметр - это perimeter. Можем, в названии, даже и сократить чутка, чтобы не так длинно звучало:

```
def sqr\_prmt():

```
Как-то так! Только не забудьте прокоментировать почему так назвали функцию, если уж используете сокращения!

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

Ну вот, например, как тут с a=2 и b=4:

```
def sqr\_pr(a=2, b=4):

```
Ну и дополним уж наш код функции содержанием.
Тряхнём школьной стариной, уроками математики класса эдак четвертого-пятого, и вспомним, как посчитать площадь прямоугольника и его периметр:

```
def sqr\_pr(a=2, b=4):   # Всё та же наша функция по рассчёту площади и периметра
    s = a \* b           # А здесь в имени s сохраним формулу рассчёта площади: одну сторону помножить на другую
    p = 2 \* (a + b)     # И не забудем про периметр:  обе стороны сложить и умножить на два
    return s, p         # Вуаля! Командуем вернуть полученные результаты!

```
Мы ведь задали числа в скобках по умолчанию, теперь в скобки можно ничего и не сообщать! Смотрим:

```
sqr\_pr()

(8, 12)

```
Работает, как и обещали!

Напоследок о том, как нам эти функции с вами легче представить? А вы просто не думайте, что есть строки кода, что существуют всякие разные команды да слова, представьте себе функцию как коробку фокусника: он туда всякие предметы помещает, взмах палочкой - и вот он фокус - вылетает голубь или там зайчик сидит! Тут, конечно, голубь вряд ли из монитора выпорхнет, но волшебный результат вам функция точно вернэт. Только не забудьте всё точно и аккуратно перед этим оформить!