Функции
В контексте программирования функция (function) — это блок программы (или подпрограмма), к которому можно обращаться из любого другого места программы. Чтобы создать функцию, нужно определить ее имя, принимаемые аргументы и последовательность инструкций, которые она должна выполнять. Впоследствии вы можете «вызвать» функцию по ее имени.
Зачем нужны функции?
- Создание новой функции позволяет присвоить имя группе инструкций, что упрощает чтение и отладку программы.
- Функции уменьшают объем кода программы за счет исключения повторяющегося кода. А если вы захотите что-то изменить, нужно будет сделать это только в одном месте.
- Разделение кода большой программы на функции упрощает отладку, так как можно тестировать каждую из функций индивидуально.
- Хорошо продуманные функции зачастую полезны во многих программах. Как только вы напишете и отладите одну, вы сможете использовать ее снова и снова.
Вызов функции
Мы уже видели примеры вызова функции:
>>> 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.pi3.141592653589793 |
math.e |
Математическая константа e = 2.718281… |
>>> math.e2.718281828459045 |
С полным списком функций в математическом модуле можно ознакомиться в официальной документации.
Методы строк
Строки предоставляют методы для множества полезных операций. Метод похож на функцию — он принимает аргументы и возвращает значение, но его синтаксис отличается. Например, метод 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 для работы со числами есть встроенные методы:
| Метод | Описание | Пример |
|---|---|---|
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 |
Методы списков
В 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]>>> b2 |
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