Функции
В контексте программирования функция (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.pi 3.141592653589793 |
math.e |
Математическая константа e = 2.718281… |
>>> math.e 2.718281828459045 |
С полным списком функций в математическом модуле можно ознакомиться в официальной документации.
Методы чисел
В Python
для работы со числами есть встроенные методы:
Метод | Описание | Пример |
---|---|---|
int.bit_length() |
Возвращает количество битов, необходимых для представления целого числа в двоичном коде |
>>> n = 37 |
int.bit_count() python 3.10 |
Возвращает количество единиц в двоичном представлении абсолютного значения целого числа |
>>> n = 19 |
float.is_integer() |
Проверяет, является ли вещественное число целым |
>>> 1.00.is_integer() |
Строковые методы
Строки предоставляют методы для множества полезных операций. Метод похож на функцию — он принимает аргументы и возвращает значение, но его синтаксис отличается. Например, метод 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] |
list.extend(iterable) |
Расширяет список list , добавив все элементы из iterable |
>>> a = [1, 2] |
list.insert(i, x) |
Вставляет в список list элемент x в заданную позицию i |
>>> a = [1, 2, 3] |
list.remove(x) |
Удаляет из списка list первый элемент, значение которого равно x . Если такого элемента нет, то вызывает ValueError |
>>> a = [1, 2, 1] |
list.pop([i]) |
Удаляет элемент с индексом i в списке list и возвращает его. Если индекс не указан, то удаляет и возвращает последний элемент списка list |
>>> a = [1, 2, 3] |
list.clear() |
Удаляет все элементы списка list |
>>> a = [1, 2, 3] |
list.index(x[, start[, end]]) |
Находит индекс первого элемента со значением x |
>>> a = [1, 2, 3, 2, 1] |
list.count(x) |
Возвращает количество элементов в списке list со значением x |
>>> a = [1, 2, 1] |
list.sort(*, key=None, reverse=False) |
Сортирует список list по возрастанию |
>>> a = [1, 3, 2] |
list.reverse() |
Разворачивает список list |
>>> a = [1, 3, 2] |
list.copy() |
Копирует список list |
>>> a = [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