Занятие № 10. Описание функций пользователя
Цель: научиться применять функции для решения задач и структурирования кода программы.
Теория
Определение функции
Функция – это именованный набор инструкций, которые могут быть выполнены в любом месте программы, после вызова функции.
Для объявление функции используется инструкция def
. Инструкция def
создаёт новый объект-функцию:
Строка с инструкцией def
называется заголовком функции, а блок инструкций внутри функции называется телом функции. Имя функции следует правилам именования переменных в Python.
Вот пример объявления функции с именем hello
, которая выведет на экран два сообщения:
def hello(): """Это функция приветствует пользователя""" print("Привет") print("Рад видеть вас")
Если запустить код выше, то мы не увидим сообщений на экране. Нужно разделять определение функции и её вызов.
Вызов функции
Чтобы вызвать функцию нужно записать её имя и в круглых скобках указать аргументы, если необходимо:
Например чтобы вызвать функцию hello
мы запишем следующее:
x
hello()
.
Проследите за вызовом функции hello
по шагам.
На втором шаге за именем hello
закрепляется объект типа function
. Это и будет объект, которых хранит описание функции. На шестом шаге мы вызываем функции hello
. После этого начнут выполняться инструкции в теле функции. Когда инструкции закончатся, управление вернётся основной программе. В итого в этом примере мы вызываем функцию hello
x раза.
Сколько строк будет содержать результат работы следующей программы:
В определении функции не одна функция print()
.
Когда мы вызовем функцию result()
на экране появятся две строки с текстом. Но в этом коде нет вызова функции.
Параметры и аргументы
Параметры функции - это входные данные, на основе которых функция должна получить требуемый результат. Параметры перечисляются в заголовке определения функции через запятую. В следующем примере функция hello2
принимает два параметра - имя name
и количество повторений rep
:
При вызове такой функции мы должны указать необходимые аргументы - буквальные значения или выражения, которые сопоставляются с параметрами в определении функции. Если мы запишем hello2("Света", 3)
, значит параметр name
примет строковое значение "Света"
, а параметр rep
будет иметь значение равное числу
x
:
def hello2(name, rep): msg = " Привет, " + name print(msg * rep) hello2("Света", 3) hello2("Дима", 4)
Неизменяемые объекты передаются по значению (числа, строки) и не могут быть изменены в теле функции. Изменяемые объекты передаются по ссылке (списки, словари) и могут быть изменены в теле функции.
В каком из предложенных вариантов заголовок функции записан корректно:
Верно.
Не хватает ()
после имени функции. Они ставятся в заголовке даже если функция не принимает параметры.
Не хватает служебного слова def
.
Заголовок описания функции должен оканчиваться :
. Со следующей строки с отступа начинается блок инструкций - тело функции.
Какие параметры есть в объявлении следующей функции:
Верно, у этой функции два параметра.
Переменная i
используется в теле функции но не в качестве входного параметра.
Это только один из параметров функции.
К параметрам относятся только те переменные, значения которых функция ожидает получить при её вызове. Параметры описываются в заголовке описания функции.
Глядя на следующий код, выберите вариант инструкции с помощью которой можно вызвать объявленную функцию:
Верно. Переменная z
имеет значение, равное 3
. Первым аргументом мы передали строку "Привет"
.
x
и y
- имена параметров функции. При вызове функции вместо параметров указываются реальные значения или выражения.
При вызове функции всегда нужны круглые скобки, даже если в объявлении функции нет параметров.
Эта функция принимает два аргумента, а в этом варианте указан только один.
Во время вызова функции двоеточие в конце не ставится. Оно необходимо только при объявлении функции. Возникнет ошибка.
Что выведет на экран следующая программа:
Верно. Функция lng()
выведет на экран наибольшую по длине строку.
Функция lng()
выводит на экран наибольшую по длине строку.
s1
- это имя переменной. Программа выведет значение на которое ссылается переменная.
s2
- это имя переменной. Программа выведет значение на которое ссылается переменная.
Параметры и аргументы в Python могут сопоставляться несколькими способами. При сопоставлении по позиции важен порядок в котором аргументы записаны при вызове функции:
def formatDate(day, month, year): """Выводим дату в красивом формате""" print(f"Сегодня {day}.{month} {year} года") formatDate(22, 11, 2024) # аргументы в правильном порядке formatDate(11, 2024, 22) # аргументы перепутаны
Сопоставление по имени позволяет записывать аргументы в произвольном порядке но нужно указать имена параметров из заголовка функции:
def formatDate(day, month, year): print(f"Сегодня {day}.{month} {year} года") # аргументы в произвольном порядке formatDate(month=11, year=2024, day=22)
В объявлении функции можно указать значения по умолчанию для параметров:
def formatDate(day, month, year=2024): print(f"Сегодня {day}.{month} {year} года") formatDate(1, 9) formatDate(1, 9, 1991)
Так как при вызове функции formatDate(1, 9)
не указано значение параметра year
, при выполнении функции будет использовано значение по умолчанию равное
x
?
.
Возвращаем значение - return
Функции из примеров выше выполняли набор инструкций, но не возвращали в качестве результата конкретное значение, которое можно было бы использовать в других выражениях. Пример функции возвращающей результат - len()
, которая возвращает длину последовательности:
На вход функция принимает последовательность и возвращает количество элементов в ней.
Чтобы вернуть значение из функции используется инструкция return
.
В следующем примере опишем функцию square(x)
, которая возводит число в квадрат:
def square(x): y = x * x return y # возвращаем результат из функции n = 10 result = square(n) print("Результат:", result)
После return
записывается выражение, результат которого вычисляется и возвращается в то выражение, откуда была вызвана функция. В коде выше функция square()
вызывается в
x строке.
Если в определении функции нет инструкции return
то по окончании работы она всё равно вернёт специальное значение None
:
def square(x): y = x * x # забыли написать return print("Результат:", square(8))
После выполнения инструкции return
функция прекращает свою работу. Если какие-либо инструкции были записаны после return
, они выполняться не будут:
def year(): print("Функция запустилась") return 2024 print("Это строка не выполнится") return 2007 # эта тоже x = year() print(x)
Но стоит понимать, что в функции может быть несколько инструкций return
:
def year(val): if val == 2024: return "Текущий год" elif val < 2024: return "Прошлый год" else: return "Будущее" x = year(1991) print(x)
Если в примере выше вызвать функцию year(2077)
, то она вернёт строку
x
"Будущее"
.
Верно. После инструкции return
функцию возвращает значение и завершает работу.
Функция print()
может встречаться в теле функции. Главное не путать её вызов с возвратом значения.
Делать это не обязательно. Python сам вычислит значение выражения и вернёт его. Но с помощью временной переменно будет проще отладить программу в случае ошибки.
Функция может возвращать данные любого типа.
Что будет выведено на экран после выполнения следующего кода:
Верно. Выражение square(2)
будет равно 4
. Затем четвёрка будет аргументом для внешнего вызова функции square(4)
.
Каждая функция в Python - это объект на который может ссылаться несколько имён, их можно сделать элементами списка или словаря.
def summa(a, b): return a + b s = summa # теперь на функцию ссылаются два имени - summa и s print(summa(3, 2)) print(s(3, 2))
В следующем примере три функции помещаем в список и перебираем этот список с помощью цикла for
:
def summa(a, b): return a + b def mult(a, b): return a * b def power(a, b): return a ** b func_lst = [summa, mult, power] # список функций x = 4 y = 3 for func in func_lst: # на каждой итерации func ссылается на очередную функцию value = func(x, y) print(value)
Перейдите по ссылке, если хотите проследить за пошаговым выполнение этой программы.
Примеры
Пример № 1 (ex01.py)
С помощью модуля turtle
изобразите четыре квадрата следующим образом:
Для рисования маленького квадрата опишите функцию.
from turtle import Turtle robot = Turtle() # создаём экземпляр класса Turtle def square(t): """ Рисование квадрата t - ссылка на робота-исполнителя """ for i in range(4): t.forward(100) t.right(90) square(robot) robot.left(90) square(robot) robot.left(90) square(robot) robot.left(90) square(robot)
Пример № 2 (ex02.py)
Опишите функцию circle_s(R)
находящую площадь круга радиуса R. С помощью данной функции вычислите площади трёх кругов. Радиусы вводятся с клавиатуры.
import math #начало объявления функции def circle_s(R): S = math.pi * R ** 2 return S # вводим значения радиусов r1 = float(input("Введите r1: ")) r2 = float(input("Введите r2: ")) r3 = float(input("Введите r3: ")) #применяем функцию print("S1: ", circle_s(r1)) print("S2: ", circle_s(r2)) print("S3: ", circle_s(r3))
Задания для самостоятельной работы
Задание № 1 (sam01.py)
Опишите функцию coord(x,y)
которая определяет, в какой координатной четверти располагается точка с координатами (x, y):
Шаблон программы:
# вместо этого коментария опишите необходимую функцию
# не исправляйте данный код
coord(2, 6)
coord(-10, 8)
coord(-5, -9)
coord(10, -3)
Пример:
Точка (2, 6) располагается в 1 четверти
Точка (-10, 8) располагается в 2 четверти
Точка (-5, -9) располагается в 3 четверти
Точка (10, -3) располагается в 4 четверти
Задание № 2 (sam02.py)
Опишите функцию sphere_volume(r)
вычисляющую объём шара. Для вычислений используйте следующую формулу:
\[ V=\frac{4}{3}\pi r^3 \]
Шаблон:
# вместо этого коментария опишите необходимую функцию
# не исправляйте данный код
v1 = sphere_volume(3)
v2 = sphere_volume(8)
v3 = sphere_volume(5.6)
print(f"v1={v1:.1f} v2={v2:.1f} v3={v3:.1f}")
Пример:
v1=113.1 v2=2144.7 v3=735.6
Задание № 3 (sam03.py)
Опишите функцию sum_list(nums)
находящую сумму чётных чисел хранящихся в списке nums. Если список пуст, сумма считается равной нулю.
Шаблон:
# вместо этого коментария опишите необходимую функцию
# не исправляйте данный код
s1 = sum_list([10])
s2 = sum_list([4, 5, 9, -2])
s3 = sum_list([])
print(f"s1={s1} s2={s2} s3={s3}")
Пример:
s1=10 s2=2 s3=0
Задание № 4 (sam04.py)
Создайте функцию create_email(msg, sub, sign)
, где msg - текст сообщения, sub - тема письма, sign - подпись автора письма. Тема письма, сообщение и подпись выводятся с новой строки.
В определении функции должны использоваться параметры по умолчанию:
- если тема (sub) не указана, то используется строка Важное сообщение
- если подпись (sign) не указана, то используется строка С уважением, друг
Шаблон:
# вместо этого коментария опишите необходимую функцию
# не исправляйте данный код
create_email("Завтра собрание")
print()
create_email("Сегодня тест", sub="Напоминание")
print()
create_email("Скоро сессия", sub="Привет", sign="Одногруппник")
Пример:
Тема: Важное сообщение
Завтра собрание
Подпись: С уважением, друг
Тема: Напоминание
Сегодня тест
Подпись: С уважением, друг
Тема: Привет
Скоро сессия
Подпись: Одногруппник
Задание № 5 (sam05.py)
Опишите функцию random_answer
, которая принимает в качестве аргумента одну или несколько строк. Функция возвращает случайную строку из переданных.
Для решения используйте функцию
randint
из модуляrandom
.
Шаблон:
import random
# вместо этого коментария опишите необходимую функцию
# не исправляйте данный код
print(random_answer("возможно"))
print(random_answer("да", "нет"))
print(random_answer("наверное", "определённо", "не нужно", "точно"))
Запустите программу несколько раз. После каждого запуска ответы могут быть разными (кроме первого ответа, который всегда равен строке “возможно”).
Пример:
Ответ: возможно
Ответ: да
Ответ: определённо
Задание № 6 (sam06.py)
Даны длины сторон треугольника a, b и с. Найдите площадь треугольника, используя формулу Герона.
Формула Герона:
\[ s=\sqrt{p\cdot(p - a)\cdot(p - b)\cdot(p - c)} \]
где p - полупериметр:
\[ p=\frac{a+b+c}{2} \]
Опишите две функции - pol(a, b, c)
для нахождения полупериметра и geron(a, b, c)
для вычисления площади.
Шаблон:
# вместо этого коментария опишите необходимые функции
# не исправляйте данный код
x = 3
y = 6
z = 7
print("Полупериметр", pol(x, y, z))
s = geron(x, y, z)
print(f"s={s:.2f}")
Пример:
Полупериметр 8.0
s=8.94