Больше не нужно искать работу мечты — присоединяйтесь к команде Клауда

Использование функций в Python

Роман Андреев
Роман Андреев
Технический писатель
04 октября 2022 г.
2486
9 минут чтения
Средний рейтинг статьи: 5

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

Как создать функцию

Давайте сразу же начнем с примера, а затем перейдем к объяснению:

def multiply(first, second):
    return first * second

Мы с вами только что написали функцию, которая делает очень простую вещь: умножает передающиеся в нее значения (аргументы), которые затем можно вводить после имени функции в самой программе и получать произведение множителей. Теперь введите в IDLE, скажем:

>>>multiply(7, 8)

В качестве аргументов могут использоваться не только целые, но и дробные числа, допустим:

>>>multiply(7.4, 8.2)
60.68

Теперь разберем, как устроен сам код. Функция объявляется с помощью ключевого слова def, за которым следует имя функции, а в скобках указываются параметры (их может быть любое число), которые будут принимать различные аргументы из пользовательского ввода. Далее за закрывающей скобкой обязательно следует двоеточие, после чего с новой строки с отступом (если пишете код в редакторе, отступ будет добавлен автоматически) начинается функциональный блок, в котором описывается, что данная функция делает. Мы использовали оператор return, назначением которого является явный возврат аргументов. Обратите внимание, что за оператором return идет инструкция, что программе делать с аргументами. В данном случае — умножать.

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

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

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

print("ООО «Ученье — свет»")
print("Книга по программированию", end=" ")
print(1, end=" шт. ")
print(500, end=" руб.")
print("\nСложная книга по программированию", end=" ")
print(1, end=" шт. ")
print(1000, end=" руб.")
print("\nИтого:", 1500, end=" руб.")
print("\nБлагодарим за покупку!")

ООО «Ученье — свет»
Книга по программированию 1 шт. 500 руб.
Сложная книга по программированию 1 шт. 1000 руб.
Итого: 1500 руб.
Благодарим за покупку!

Теперь представим, что книг купили целую стопку. При этом число покупателей с каждым днем становится всё больше, поэтому, пока вы подсчитываете сумму одному покупателю, остальные начнут выражать недовольство. Тут-то и задумаешься, как бы сделать так, чтобы сумма в чеке подсчитывалась автоматически, исходя из добавленного количества товаров и их стоимости. Раз нужно, значит, можно, как говорит один из классиков обучения Python. Допустим, у нас купили семь наименований, причем некоторые книги заказали по два раза:

def check(book_attr):
    total = 0
    print("ООО «Ученье — свет»")
    for book in book_attr:
        a = book[0]
        b = book[1]
        c = book[2]
        print(f"{a} ({b} шт.) - {c} руб.")
        total += b * c
    print(f"\nИтого: {total} руб.")
    print("Благодарим за покупку!")

book_attr = [
("Книга по программированию", 2, 500),
("Сложная книга по программированию", 2, 1000),
("Книга по программированию 80 lvl", 2, 1950),
("Руководство по Python для начинающих", 1, 1200),
("Ты сможешь стать программистом", 1, 980),
("Функциональное программирование Python", 1, 950),
("Секреты красивого кода", 1, 800),
]

Как видим, появились новые переменные, а список покупки вынесен в отдельный блок. Теперь, когда будет пробиваться новый чек, всё, что потребуется для автоматического подсчета суммы, — это вбить названия книг, их количество и стоимость за штуку. А после того, как ввели все позиции в чеке, выполняем вызов нашей функции с параметром, который мы оформили в виде кортежа выше:

check(book_attr)

и получаем такой вывод:

ООО «Ученье — свет»
Книга по программированию (2 шт.) - 500 руб.
Сложная книга по программированию (2 шт.) - 1000 руб.
Книга по программированию 80 lvl (2 шт.) - 1950 руб.
Руководство по Python для начинающих (1 шт.) - 1200 руб.
Ты сможешь стать программистом (1 шт.) - 980 руб.
Функциональное программирование Python (1 шт.) - 950 руб.
Секреты красивого кода (1 шт.) - 800 руб.

Итого: 10830 руб.
Благодарим за покупку!

Вот и всё, сумма была подсчитана автоматически. Рассмотрим приведенный выше код подробнее.

  • Переменная total хранит в себе сумму покупки и изменяется по мере того, как в кортеж добавляются новые значения.
  • С помощью оператора цикла for задается набор переменных, которые хранят в себе следующие значения: название товара (a), количество (b) и цену за единицу товара (c).
  • После этого дается команда на печать. Буква f в строках с оператором print (между прочим, тоже функция, но встроенная, о которых речь пойдет ниже) означает, что используются f-строки, но пока нам достаточно знать только то, что это удобный метод форматирования, к тому же код сам по себе понятен.
  • Следующая строка не должна вас удивить: это инструкция для подсчета суммы путем перемножения количества товаров на их стоимость и сложения получившейся цифры с промежуточным итогом.
  • Далее опять применяется f-строка в качестве метода форматирования текста, а про блок с кортежем, содержащим необходимые данные для подсчета суммы очередной покупки, мы уже говорили.

Особенности функций в Python

Ключевые преимущества:

  • Нет необходимости повторять отдельные куски кода, которые к тому же могут быть достаточно объемными.
  • Функции могут вызываться столько раз, сколько это необходимо, причем даже подряд.
  • Будучи разделенными на несколько функциональных блоков, большие программы становятся значительно проще в отслеживании.

Минусов у функций в Python практически нет, разве что они могут быть не всегда удобны. Так, в ряде случаев проще использовать генераторы, поскольку некоторые функции (например, filter) могут возвращать итераторы, а чтобы этого избежать, приходится писать дополнительный код. Например, введем в IDLE:

>>>numbers = [2,4,6,8,10,12,14]
>>>filter(lambda num: num >= 10, numbers)

Вот что мы получим в результате:

<filter object at 0x00000000030C3220>

Для корректного вывода отвечающих условиям элементов придется «оборачивать» это выражение таким образом:

>>> list(filter(lambda num: num >= 10, numbers))
[10, 12, 14]

Встроенные функции Python

Почти наверняка вы их использовали уже на своем первом уроке по Питону. Не верите?

print("Hello, World!")

Так вот, print — это функция, а заключенный в скобки "Hello, World!" — ее аргумент. Встроенных функций (то есть объектов с уже готовым кодом) в Python сотни и даже тысячи, если подключать дополнительные библиотеки. Знать их все не обязательно, тем более всегда можно почитать документацию, если в коде встретилась незнакомая. Тем не менее ряд общих функций выучить придется, поскольку эти служебные слова являются важнейшей частью языка, без которых вы не напишете ни одной полезной программы. Познакомим вас с некоторыми распространенными встроенными функциями.

  • len выдает длину, то есть количество элементов определенной последовательности: строки, списка, кортежа, диапазона или массива.
flowers = ["колокольчик", "василёк", "лютик", "незабудка", "ромашка"]
len(flowers)
5
  • str используется для объединения строк и чисел (по умолчанию в Python так делать нельзя, но с помощью str можно):
year = 2008
"Euro " + str(year)
'Euro 2008'
  • int преобразует строки в целые числа. Полезным свойством int является то, что она округляет любое число до целого, правда, всегда делает это в сторону нуля, например:
int(554.995)
554
  • float предлагает обратный процесс: преобразует целочисленные значения в числа с плавающей запятой, что может понадобиться для определенных вычислений:
float(55)
55.0
  • tuple преобразует списки в кортежи:
flowers = ["колокольчик", "василёк", "лютик", "незабудка", "ромашка"]
tuple(flowers)
('колокольчик', 'василёк', 'лютик', 'незабудка', 'ромашка')
  • dict позволяет создавать новые словари. Вот пример создания словаря из списка кортежей при помощи dict:
clubs = [('Зенит', 1), ('Спартак', 3), ('ЦСКА', 2), ('Локомотив', 5), ('Динамо', 4)]
dict(clubs)
{'Зенит': 1, 'Спартак': 3, 'ЦСКА': 2, 'Локомотив': 5, 'Динамо': 4}
  • range создает диапазоны чисел, что может быть полезно, например, для перебора числовых значений:
for number in range(0, 30, 3):
    print(number)

0
3
6
9
12
15
18
21
24
27

У range три параметра: первые два задают границы числового диапазона, а третий (опциональный) отвечает за интервал вывода. В данном случае мы сделали так, чтобы выводились числа от 0 до 30 с интервалом 3. При этом второе значение не включается в список (это особенность работы range), а чтобы его включить, нужно чуть расширить диапазон, вот так:

for number in range(0, 31, 3):
    print(number)

0
3

27
30

Использование результата функции в другой функции Python

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

def check(company = "Ученье — свет"):
    """Позволяет подставлять наименования других компаний в чеке"""
    print(f"ООО {company}")

Давайте введем название какой-нибудь другой компании:

check("«Просвещение»")
ООО «Просвещение»

Теперь передаем созданную функцию во встроенную функцию help, чтобы узнать, что она делает:

help(check)

Help on function check in module __main__:

check(company='Ученье — свет')
    Позволяет подставлять наименования других компаний в чеке

Как видим, всё достаточно просто.

Что мы узнали

В этом туториале мы познакомились с тем, как работают функции в Python 3: научились создавать и использовать их, узнали про встроенные инструменты, а также рассмотрели пример передачи функций как объектов в другие функции. Изучив функции глубже, вы сможете оценить всю их пользу при написании даже относительно небольших приложений.

Хотите внести свой вклад?
Участвуйте в нашей контент-программе за
вознаграждение или запросите нужную вам инструкцию
img-server
04 октября 2022 г.
2486
9 минут чтения
Средний рейтинг статьи: 5
Пока нет комментариев