Функции в языке программирования 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-строка
в качестве метода форматирования текста, а про блок с кортежем, содержащим необходимые данные для подсчета суммы очередной покупки, мы уже говорили.cloud
Ключевые преимущества:
Минусов у функций в 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]
Почти наверняка вы их использовали уже на своем первом уроке по Питону. Не верите?
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 являются объектами, их тоже можно передавать в качестве аргументов в другие функции и ссылаться на них.
def check(company = "Ученье — свет"):
"""Позволяет подставлять наименования других компаний в чеке"""
print(f"ООО {company}")
Давайте введем название какой-нибудь другой компании:
check("«Просвещение»")
ООО «Просвещение»
Теперь передаем созданную функцию во встроенную функцию help
, чтобы узнать, что она делает:
help(check)
Help on function check in module __main__:
check(company='Ученье — свет')
Позволяет подставлять наименования других компаний в чеке
Как видим, всё достаточно просто.
Размещайте Python-проекты в облаке Timeweb Cloud
В этом туториале мы познакомились с тем, как работают функции в Python 3: научились создавать и использовать их, узнали про встроенные инструменты, а также рассмотрели пример передачи функций как объектов в другие функции. Изучив функции глубже, вы сможете оценить всю их пользу при написании даже относительно небольших приложений.