Функции

В контексте программирования функция (function) — это блок программы (или подпрограмма), к которому можно обращаться из любого другого места программы. Чтобы создать функцию, нужно определить ее имя, принимаемые аргументы и последовательность инструкций, которые она должна выполнять. Впоследствии вы можете «вызвать» функцию по ее имени.

Зачем нужны функции?

  1. Создание новой функции позволяет присвоить имя группе инструкций, что упрощает чтение и отладку программы.
  2. Функции уменьшают объем кода программы за счет исключения повторяющегося кода. А если вы захотите что-то изменить, нужно будет сделать это только в одном месте.
  3. Разделение кода большой программы на функции упрощает отладку, так как можно тестировать каждую из функций индивидуально.
  4. Хорошо продуманные функции зачастую полезны во многих программах. Как только вы напишете и отладите одну, вы сможете использовать ее снова и снова.

Вызов функции

Мы уже видели примеры вызова функции:

>>> len('функция')
7

Имя функции — len. Выражение в скобках называется аргументом функции. Если необходимо передать несколько аргументов — они указываются через запятую. Результат выполнения функции len() — вывод длины строки.

 

Обычно говорят, что функция «принимает» аргументы и «возвращает» значение или результат.

 

Добавление новых функций

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

def print_lyrics():
    print(f"Я дровосек, и со мной все в порядке.")
    print(f"Я работал весь день, и теперь я в достатке.")

Слово def — ключевое; оно указывает, что это определение функции. Имя функции — print_lyrics. Правила для имен функций те же, что и для имен переменных. Вы не можете использовать зарезервированные (ключевые) слова в качестве имен функций, и вам следует избегать использования переменных и функций с одинаковыми именами.

 

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

 

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

Синтаксис для вызова новой функции такой же, как и для встроенных функций:

>>> print_lyrics()
Я дровосек, и со мной все в порядке.
Я работал весь день, и теперь я в достатке.

Как только вы определили функцию, вы можете использовать ее внутри другой функции. Например, чтобы повторить предыдущий припев, мы могли бы написать функцию с именем repeat_lyrics ():

def repeat_lyrics():
    print_lyrics()
    print_lyrics()

А затем вызовем repeat_lyrics():

>>> repeat_lyrics()
Я дровосек, и со мной все в порядке.
Я работал весь день, и теперь я в достатке.
Я дровосек, и со мной все в порядке.
Я работал весь день, и теперь я в достатке.

Параметры и аргументы

Некоторые из функций, которые мы видели, требуют передачи аргументов. Например, когда вы вызываете функцию math.ceil(), вы передаете число в качестве аргумента. Некоторые функции принимают более одного аргумента: функция divmod принимает два: делимое и делитель.

 

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

def print_twice(bruce):
    print(f"{bruce}")
    print(f"{bruce}")

Эта функция назначает аргумент параметру bruce. Когда функция вызывается, она выводит на экран значение параметра (каким бы оно ни было) дважды.

 

Эта функция работает с любым значением, которое может быть выведено на экран:

>>> print_twice('Спам')
Спам
Спам
>>> print_twice(2023)
2023
2023
>>> print_twice(math.pi)
3.14159265359
3.14159265359

Вы также можете использовать переменную в качестве аргумента:

>>> michael = 'Эрик, полпчелы.'
>>> print_twice(michael)
Эрик, полпчелы.
Эрик, полпчелы.

Имя переменной, которую мы передаем в качестве аргумента (michael), не имеет ничего общего с именем параметра (bruce). Неважно, какое имя переменной было у значения в вызывающей функции; сейчас в функции print_twice() мы будем обращаться к нему по имени bruce.

Переменные и параметры внутри функций — локальны

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

def print_cat(part1, part2):
    cat = part1 + part2
    print(f"{cat}")

Эта функция принимает два аргумента, объединяет их и выводит результат. Ниже представлен пример, где она используется:

>>> line1 = 'Тили-тили'
>>> line2 = 'трали-вали.'
>>> print_cat(line1, line2)
Тили-тили трали-вали

Когда выполнение функции print_cat() завершается, переменная cat уничтожается. Если мы попытаемся вывести ее, то получим исключение:

>>> print(cat)
NameError: name 'cat' is not defined

Параметры также локальны. Например, за пределами функции print_cat() нет ничего, что относится к part1 и part2.

Результативные функции и void-функции

Некоторые из функций, которые мы использовали, например математические, возвращают результат. Такие функции называются результативными функциями. Другие функции, вроде print(), выполняют действие, но не возвращают значение. Они называются void-функциями (или иногда — функциями, не возвращающими результат).

 

Чаще всего при вызове функции, возвращающей значение, вы планируете что-то сделать с результатом; например, вы можете присвоить его переменной или использовать в составе выражения:

>>> x = math.cos(radians)
>>> golden = (math.sqrt(5) + 1) / 2

Для возвращения данных после выполнения работы самой функции используется оператор return:

def get_message():
    return "Hello, world!"

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

message = get_message()
print(f"{message}")
Hello, world!

Void-функции могут выводить что-то на экран или иметь какой-то другой эффект, но они не возвращают никакого значения.

>>> print(f"Бинго")
Бинго

Обязательные и необязательные параметры

Вы видели встроенные функции и методы, которые принимают необязательные аргументы. Можно также писать собственные функции с необязательными аргументами. В качестве примера ниже показана функция, которая печатает \(n\) раз слово word:

def print_word(word, n=5):
    for i in range(n):
        print(f"{word}")

Первый параметр обязателен; второй — нет. По умолчанию переменной \(n\) присвоено значение \(5\).

 

Если вы передадите только один аргумент:

>>> print_word('Hello')

переменной n будет присвоено значение по умолчанию. Если вы передадите два аргумента:

>>> print_word('Hello', 1)

то переменная \(n\) получает значение второго аргумента. Другими словами, необязательный аргумент изменяет значение по умолчанию.

 

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

Пример 1

Напишите функцию get_avg(a, b, c), которая находит среднее число среди трёх различных чисел.

def get_avg(a, b, c):
    if a < b < c or c < b < a:
        return b
    if b < a < c or c < a < b:
        return a
    return c

a, b, c = map(int, input().split())
ans = get_avg(a, b, c)
print(f"{ans}")
2 1 4
2

Пример 2

Напишите функцию get_count(a, x), которая считает, сколько раз число \(x\) встречается в списке \(a\).

def get_count(a, x):
    cnt = 0
    for el in a:
        if el == x:
            cnt += 1
    return cnt

a = list(map(int, input().split()))
x = int(input())
ans = get_count(a, x)
print(f"{ans}")
1 2 3 2 1 4 1
1
3

Пример 3

Напишите функцию is_equal(a, b, n), которая проверяет, одинаковые ли матрицы \(a\) и \(b\) размерами \(n \times n\) или нет.

def is_equal(a, b, n):
    for i in range(n):
        for j in range(n):
            if a[i][j] != b[i][j]:
                return False
    return True

n = int(input())
a = [list(map(int, input().split())) for i in range(n)]
b = [list(map(int, input().split())) for i in range(n)]
if is_equal(a, b, n):
    print(f"YES")
else:
    print(f"NO")
2
1 2
3 4
1 2
3 5
NO

Практические задания

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

Python имеет ряд встроенных функций, которые всегда доступны:

Функция Описание Пример
abs(x) Возвращает абсолютное значение (модуль) числа x
>>> abs(-5)
5
divmod(a, b) Возвращает пару чисел: частное и остаток от целочисленного деления a на b
>>> divmod(9, 2)
(4, 1)
pow(base, exp, mod=None) Возвращает результат возведения числа base в степень exp. Если присутствует mod, то возвращает результат возведения числа в степень по модулю
>>> pow(2, 3)
8
round(number, ndigits=None) Возвращает число, округлённое до ndigits цифр после запятой. Если аргумент ndigits отсутствует, то возвращает ближайшее целое число
>>> round(45.678, 1)
45.7
chr(i) Возвращает символ, код которого является числом i
>>> chr(97)
'a'
ord(c) Возвращает код символа c
>>> ord('a')
97
eval(expression, globals=None, locals=None) Выполняет строку программного кода
>>> eval('2+2*2')
6
len(s) Возвращает длину (количество элементов) объекта. Аргумент может быть последовательностью (строкой, списком и т.п.) или коллекцией (словарь, множество и т.п.)
>>> len('abc')
3
max(iterable, *)
max(arg1, arg2, *args)
Возвращает наибольший элемент в итерируемом объекте или наибольший элемент из двух или более аргументов
>>> max(5, 6, 4)
6
min(iterable, *)
min(arg1, arg2, *args)
Возвращает наименьший элемент в итерируемом объекте или наименьший элемент из двух или более аргументов
>>> min('abc')
'a'
sorted(iterable, /, *, key=None, reverse=False) Возвращает новый отсортированный список из элементов в iterable
>>> sorted([6, 2, 5])
[2, 5, 6]
sum(iterable, /, start=0) Суммирует элементы iterable слева направо и возвращает результат
>>> sum([6, 2, 5])
13

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

 

Математические функции

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

 

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

>>> import math

Подключить определенные атрибуты модуля можно с помощью инструкции from:

>>> from math import gcd
Функция Описание Пример
math.ceil(x) Возвращает наименьшее целое число, большее или равное x
>>> math.ceil(7.1)
8
math.factorial(n) Возвращает факториал числа n
>>> math.factorial(5)
120
math.gcd(*integers) Возвращает наибольший общий делитель указанных целочисленных аргументов
>>> math.gcd(14, 28, 63)
7
math.lcm(*integers)
python 3.9
Возвращает наименьшее общее кратное указанных целочисленных аргументов
>>> math.lcm(9, 18, 12)
36
math.sqrt(x)
python 3.8
Возвращает квадратный корень из неотрицательного целого числа x
>>> math.sqrt(9)
3.0
math.isqrt(n) Возвращает целый квадратный корень из неотрицательного целого числа n
>>> math.isqrt(15)
3
math.prod(iterable, *, start=1)
python 3.8
Возвращает произведение всех элементов в iterable
>>> math.prod([5, 2, 3])
30
math.fsum(iterable) Возвращает точную сумму значений с плавающей точкой в iterable
>>> math.fsum([.1, .1, .1])
0.3
math.isclose(a, b) Возвращает True, если значения a и b близки друг к другу, и False в противном случае
>>> math.isclose(6.000000001, 6.000000002)
True
math.dist(p, q)
python 3.8
Возвращает расстояние между двумя точками p и q
>>> math.dist([0, 0], [3, 4])
5.0
math.exp(x) Возвращает e в степени x, где e = 2.718281 - основание натурального логарифма
>>> math.exp(2)
7.38905609893065
math.log(x[, base]) Возвращает значение натурального логарифма числа x, если 1 аргумент. Возвращает значение логарифма числа x по основаниюbase, если два аргумента
>>> math.log(81, 3)
4.0
math.log2(x) Возвращает значение логарифма числа x по основанию 2
>>> math.log2(1024)
10.0
math.log10(x) Возвращает значение десятичного логарифма числа x
>>> math.log10(10000)
4.0
math.cos(x) Возвращает косинус числа x. x указывается в радианах
>>> math.cos(5)
0.28366218546322625
math.sin(x) Возвращает синус числа x. x указывается в радианах
>>> math.sin(5)
-0.9589242746631385
math.tan(x) Возвращает тангенс числа x. x указывается в радианах
>>> math.tan(5)
-3.380515006246586
math.degrees(x) Преобразовывает угол x из радианов в градусы
>>> math.degrees(1.5707963267948966)
90.0
math.radians(x) Преобразовывает угол x из градусов в радианы
>>> math.radians(90)
1.5707963267948966
math.pi Математическая константа π = 3.141592…
>>> math.pi
3.141592653589793
math.e Математическая константа e = 2.718281…
>>> math.e
2.718281828459045

С полным списком функций в математическом модуле можно ознакомиться в официальной документации.

 

Методы чисел

В Python для работы со числами есть встроенные методы:

Метод Описание Пример
int.bit_length() Возвращает количество битов, необходимых для представления целого числа в двоичном коде
>>> n = 37
>>> bin(n)
'0b100101'
>>> n.bit_length()
6
int.bit_count()
python 3.10
Возвращает количество единиц в двоичном представлении абсолютного значения целого числа
>>> n = 19
>>> bin(n)
'0b10011'
>>> n.bit_count()
3
float.is_integer() Проверяет, является ли вещественное число целым
>>> 1.00.is_integer()
True

Строковые методы

Строки предоставляют методы для множества полезных операций. Метод похож на функцию — он принимает аргументы и возвращает значение, но его синтаксис отличается. Например, метод upper() принимает строку и возвращает новую строку со всеми прописными буквами.

 

Вместо синтаксиса функции upper(word) используется синтаксис метода word.upper():

word = 'банан'
new_word = word.upper()
print(f"{new_word}")
БАНАН

Такая форма точечной нотации требует имя метода, upper, и имя строки, к которой применяется метод, word. Пустые скобки указывают, что этот метод не принимает аргументов.

Метод Описание Пример
str.isdigit() Состоит ли строка str из цифр
>>> '2023'.isdigit()
True
str.isalpha() Состоит ли строка str из букв
>>> 'num1'.isalpha()
False
str.isalnum() Состоит ли строка str из цифр или букв
>>> 'num1'.isalnum()
True
str.islower() Состоит ли строка str из символов в нижнем регистре
>>> '10 a'.islower()
True
str.isupper() Состоит ли строка str из символов в верхнем регистре
>>> '6 B'.isupper()
True
str.istitle() Начинаются ли слова в строке str с заглавной буквы
>>> 'Aa Bs 1Db! '.istitle()
True
str.lower() Преобразование строки str к нижнему регистру
>>> 'CAPS'.lower()
'caps'
str.upper() Преобразование строки str к верхнему регистру
>>> 'up'.upper()
'UP'
str.capitalize() Переводит первый символ строки str в верхний регистр, а все остальные в нижний
>>> 'ab cd'.capitalize()
'Ab cd'
str.swapcase() Переводит символы нижнего регистра строки str в верхний, а верхнего – в нижний
>>> 'iVAN'.swapcase()
'Ivan'
str.title() Первую букву каждого слова строки str переводит в верхний регистр, а все остальные в нижний
>>> 'i am alex'.title()
'I Am Alex'
str.startswith(prefix[, start[, end]]) Начинается ли строка str шаблоном prefix
>>> 'Hello!'.startswith('h')
False
str.endswith(suffix[, start[, end]]) Заканчивается ли строка str шаблоном suffix
>>> 'with'.endswith('th')
True
str.removeprefix(prefix)
python 3.9
Удаление префикса строки str
>>> 'Arthur: three'.removeprefix('Arthur: ')
'three!'
str.removesuffix(suffix)
python 3.9
Удаление суффикса строки str
>>> 'MiscTests'.removesuffix('Tests')
'Misc'
str.lstrip([chars]) Удаление символов в начале строки str
>>> 'Arthur: three'.lstrip('Arthur: ')
'ee!'
str.rstrip([chars]) Удаление символов в конце строки str
>>> ' spacious '.rstrip()
' spacious'
str.strip([chars]) Удаление символов в начале и конце строки str
>>> '$123$'.strip('$')
'123'
str.zfill(width) Делает длину строки str не меньшей width, по необходимости заполняя первые символы нулями
>>> '100101'.zfill(8)
'00100101'
str.ljust(width[, fillchar]) Делает длину строки str не меньшей width, по необходимости заполняя последние символы символом fillchar
>>> 'abc'.ljust(5, '!')
'abc!!'
str.rjust(width[, fillchar]) Делает длину строки str не меньшей width, по необходимости заполняя первые символы символом fillchar
>>> 'bc'.rjust(3, 'a')
'abc'
str.count(sub[, start[, end]]) Возвращает количество непересекающихся вхождений подстроки sub
>>> 'door'.count('o')
2
str.find(sub[, start[, end]]) Поиск подстроки sub в строке str. Возвращает номер первого вхождения или -1
>>> 'apple'.find('p')
1
str.rfind(sub[, start[, end]]) Поиск подстроки sub в строке str. Возвращает номер последнего вхождения или -1
>>> 'apple'.rfind('p')
2
str.replace(old, new[, count]) Замена всех вхождений подстроки old в строке str на подстроку new
>>> 'abca'.replace('a', 'A')
'AbcA'
str.split(sep=None, maxsplit=- 1) Разбиение строки str по разделителю
>>> '1,2,3'.split(',')
['1', '2', '3']
str.join(iterable) Сборка строки из iterable с разделителем s
>>> ''.join(['1', '2', '3'])
'123'

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

 

Методы списков

В Python для работы со списками есть встроенные методы:

Метод Описание Пример
list.append(x) Добавляет элемент x в конец списка list
>>> a = [1, 2]
>>> a.append(3)
>>> a
[1, 2, 3]
list.extend(iterable) Расширяет список list, добавив все элементы из iterable
>>> a = [1, 2]
>>> a.extend([2, 3, 4])
>>> a
[1, 2, 2, 3, 4]
list.insert(i, x) Вставляет в список list элемент x в заданную позицию i
>>> a = [1, 2, 3]
>>> a.insert(2, 4)
>>> a
[1, 2, 4, 3]
list.remove(x) Удаляет из списка list первый элемент, значение которого равно x. Если такого элемента нет, то вызывает ValueError
>>> a = [1, 2, 1]
>>> a.remove(1)
>>> a
[2, 1]
list.pop([i]) Удаляет элемент с индексом i в списке list и возвращает его. Если индекс не указан, то удаляет и возвращает последний элемент списка list
>>> a = [1, 2, 3]
>>> b = a.pop(1)
>>> a
[1, 3]
>>> b
2
list.clear() Удаляет все элементы списка list
>>> a = [1, 2, 3]
>>> a.clear()
>>> a
[]
list.index(x[, start[, end]]) Находит индекс первого элемента со значением x
>>> a = [1, 2, 3, 2, 1]
>>> a.index(2)
1
list.count(x) Возвращает количество элементов в списке list со значением x
>>> a = [1, 2, 1]
>>> a.count(1)
2
list.sort(*, key=None, reverse=False) Сортирует список list по возрастанию
>>> a = [1, 3, 2]
>>> a.sort()
a
[1, 2, 3]
list.reverse() Разворачивает список list
>>> a = [1, 3, 2]
>>> a.reverse()
a
[2, 3, 1]
list.copy() Копирует список list
>>> a = [1, 3, 2]
>>> b = a.copy()
>>> b
[1, 3, 2]

Пример 1

Найдите значение факториала числа \(n\).

from math import factorial

n = int(input())
ans = factorial(n)
print(f"{ans}")
5
120

Пример 2

Определите, равняется ли строка \(s\) строке «YES», где каждая буква может быть как заглавной, так и строчной.

s = input().lower()
if s == "yes":
    print(f"YES")
else:
    print(f"NO")
yEs
YES

Пример 3

Добавьте число \(x\) в конец списка \(a\).

x = int(input())
a = list(map(int, input().split()))
a.append(x)
print(*a)
3
1 2
1 2 3

Практические задания