Азыконструкции языка python

Подробнее о функциях

Опубликовано

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

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

В первую очередь напишем хорошо знакомый нам счётчик до 10.

import sleep

for n in range(10,0,-1):
    print(n)
    sleep(1)

print('Пуск!')

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

import sleep

for _ in range(3):
    for n in range(10,0,-1):
        print(n)
        sleep(1)

    print('Пуск!')

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

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

import sleep

# первая ракета
for n in range(10,0,-1):
    print(n)
    sleep(1)

print('Пуск!')
print('Сверяемся с расчётами')

# вторая ракета
for n in range(10,0,-1):
    print(n)
    sleep(1)

print('Пуск!')
print('Пьём чай')

# третья ракета
for n in range(10,0,-1):
    print(n)
    sleep(1)

print('Пуск!')

И так, у нас получилось очень много одинакового кода, разделённого сверкой с расчётами и распитием чая. Тут вступает в силу функция. Давайте перепишем нашу программу.

import sleep

def launcher():  # объявляем функцию launcher
    for n in range(10,0,-1):
        print(n)
        sleep(1)

    print('Пуск!')

launcher()  # вызываем функцию launcher
print('Сверяемся с расчётами')
launcher()  # вызываем функцию launcher
print('Пьём чай')
launcher()  # вызываем функцию launcher

Обратите внимание насколько компактнее стал код. Давайте разбираться как это работает. def — ключевое слово которое говорит, что сейчас будет объявлена функция (define — определять). Через пробел после def указываем название нашей функции вместе со скобками. Именно по названию функции будет производиться её вызов. Посмотрите как мы вызываем функцию между сверкой с расчётами и распитием чая. Тот код который будет выполняться при вызове функции всегда пишется с отступом и называется телом функции.

Теперь вы можете запустить хоть 10 ракет. Просто, каждый раз, когда захотите произвести очередной пуск, набирайте launcher() и дело в шляпе!

Параметры функции

А что если отсчёт каждой ракеты необходимо начинать не с 10, а с какого-нибудь другого числа? Всё решается благодаря параметрам. Используя параметры, функция становится более гибкой, более универсальной.

import sleep

def launcher(sec):
    for n in range(sec,0,-1):
        print(n)
        sleep(1)

    print('Пуск!')

launcher(10)
print('Сверяемся с расчётами')
launcher(3)
print('Пьём чай')
launcher(5)

В первой строке объявления функции в скобках мы указали, что функция использует параметр sec. А использует она его в цикле в качестве начала отсчёта. В момент вызова функции, в скобках мы указываем чему будет равен параметр sec. Таким образом, первая ракета взлетит через 10 секунд, вторая через 3, а третья через 5.

Пройдёмте на кухню

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

def unpack(spisok):
    for ingredient in spisok:
        print(ingredient)
    print('------------')

pizza = ["тесто", "помидоры", "пеперони", "сыр"]
soup = ["вода", "курица", "картофель", "морковь", "лук"]
okroshka = ["яйца", "картофель", "колбаса", "лук", "укроп"]

unpack(okroshka)
unpack(pizza)

Мы написали функцию, которая принимает в качестве параметра spisok блюда, которое предполагается готовить. Внутри функции выводим все ингредиенты из списка. В ресторане поступил заказ на pizza и okroshka, и мы вызываем функцию unpack() передав туда соответствующие блюда.

Верни мне это!

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

def summa(a, b):
    print(a+b)

summa(2,2) 
summa(5,3)

Всё что делает функция — складывает значения хранимые в её параметрах и выводит результат на экран. Но проблема в том, что мы ничего не можем сделать с результатом работы функции. То есть если нам потребуется перемножить результат работ функций (summa(2,2) * summa(5,3)) мы не сможем этого сделать.

На самом деле всё решается очень просто. Нужно лишь добавить ключевое слово return (возврат). return даёт понять компьютеру, что функция нашла то что она искала и может прекращать свою работу. Все строки после ключевого слова return выполнены не будут.

def summa(a, b):
    return a+b

c = summa(2,2) 
d = summa(5,3)
print(c*d)

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

Параметры по умолчанию.

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

def greeting(guest='мир'):
    return 'Привет, ' + guest

name = input('Как тебя зовут? ')
greet = greeting(name)
print(greet)

greet2 = greeting()
print(greet2)

Функция greeting() формирует строку приветствия и возвращает её. Если при вызове не передать имя guest, тогда он автоматически примет значение ‘мир’.

Попробуйте предположить, что будет храниться в greet и в greet2.

На этом можно было бы закончить, но…

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

def my_f(*args, **kwords):
	print('Кортеж безымянных параметров:',args)
	print('Словарь именованных параметров:', kwords)


my_f(4,6,'Петя', age=50, color='gold', pizza=['помидоры','колбаса'])

Наличие звёздочек в параметрах объявления функции являются обязательными. Они необходимы для правильной распаковки. Обратите внимание на тип данных, хранимых в параметрах kwords и args. В kwords ключом будет являться название параметра, а value — значение этого параметра.

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

print("шестерёнка", "мотор", "батарея", sep='|', end='!')

В результате все неименованные параметры будут распечатаны разделённые знаком sep, а в конце вы увидите символ end.

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

Ваш адрес email не будет опубликован.