Функції (за матеріалами сайту https://acode.com.ua/functions-python/)
Функція — це блок коду, який виконує певне завдання. В Python є два типи функції: вбудовані та користувацькі. Параметр — це значення, яке приймає функція. Аргумент — це значення, яке передається у функцію під час її виклику у програмі. Оператор return використовується для повернення значення функції.
Що таке функція?
Функція — це блок коду, який виконує певну задачу.
Припустимо, нам потрібно написати програму, яка намалює коло, а потім зафарбує його. Ви можете створити дві функції для вирішення цієї задачі:
функція створення кола;
функція для зафарбування кола.
Поділ складного завдання на дрібніші частини робить нашу програму простою для розуміння та повторного використання.
Типи функцій в Python
Є два типи функцій:
Функції зі Стандартної бібліотеки Python — це вбудовані функції, доступні для використання.
Функції користувача — ми можемо створювати власні функції на основі наших вимог.
Оголошення функції в Python
Синтаксис оголошення функції:
def ім'я_функції(параметри):
# тіло функції
return
|
Розглянемо детально:
def
— ключове слово, яке використовується для оголошення функції;
ім'я_функції
— будь-яке ім’я, дане функції;
параметри
— значення, які приймає функція;
return
(необов’язково) — повертає значення з функції.
Розглянемо приклад:
def greet():
print('Hello, World!')
|
Тут ми створили функцію під назвою greet(). Вона виводить текст Hello, World!
на екран. Ця функція не має параметрів і не повертає ніяких значень.
Виклик функції в Python
Виклик функції greet(), яку ми створили вище, виконується в наступний спосіб:
# Викликаємо функцію
greet()
|
Розглянемо ще один приклад використання функції в Python:
def greet():
print('Hello World!')
# Викликаємо функцію
greet()
print('Outside function')
|
Результат:
Параметри та аргументи функції в Python
Функція може мати параметри. Параметр — це значення, яке приймає функція. Наприклад:
# Функція з двома параметрами
def add_numbers(num1, num2):
sum = num1 + num2
print('Sum: ',sum)
# Функція без параметрів
def add_numbers():
# код
|
Якщо ми створюємо функцію з параметрами, нам потрібно надсилати відповідні значення (аргументи) під час виклику функції в програмі. Наприклад:
# Викликаємо функцію, вказавши 2 аргументи
add_numbers(5, 4)
# Викликаємо функцію без надання аргументів
add_numbers()
|
Тут add_numbers(5, 4)
вказує, що параметри num1
та num2
отримають аргументи 5
та 4
відповідно.
Розглянемо ще один приклад:
# Визначення функції з двома параметрами
def add_numbers(num1, num2):
sum = num1 + num2
print("Sum: ",sum)
# Виклик функції з вказанням двох аргументів
add_numbers(5, 4)
|
Результат:
Sum: 9
Ми також можемо викликати функцію з вказанням параметрів у коді:
add_numbers(num1 = 5, num2 = 4)
|
В Python це називається іменованим аргументом. Вищенаведений рядок коду рівнозначний наступному рядку коду:
add_numbers(5, 4)
|
Оператор return в Python
Функція Python може повертати чи не повертати значення. Якщо потрібно, щоб функція повертала якесь значення, слід використовувати оператор return. Наприклад:
def add_numbers():
...
return sum
|
Тут ми повертаємо змінну sum
назад у викликаючий об’єкт (caller).
Примітка: Оператор return також позначає завершення виконання функції.
Розглянемо приклад використання оператора return на практиці:
# Визначення функції
def find_square(num):
result = num * num
return result
# Виклик функції
square = find_square(3)
print('Square:',square)
|
Результат:
Square: 9
Тут ми створили функцію під назвою find_square(). Функція приймає число (num
) та повертає квадрат цього числа.
Розглянемо ще один приклад:
# Функція додавання двох чисел
def add_numbers(num1, num2):
sum = num1 + num2
return sum
# Викликаємо функцію, вказавши 2 аргументи
result = add_numbers(5, 4)
print('Sum: ', result)
|
Результат:
Функції зі Стандартної бібліотеки Python
В Python функції зі Стандартної бібліотеки — це вбудовані функції, які можна використовувати напряму в коді. Наприклад:
print()
— виводить текст на екран;
sqrt()
— повертає квадратний корінь числа;
pow()
— виконує операцію піднесення числа до степеня.
Ці бібліотечні функції визначено всередині модуля, тому для їх використання необхідно підключити модуль до програми. Наприклад, функція sqrt() визначена всередині модуля math.
Розглянемо приклад використання бібліотечної функції в Python:
import math
# Функція sqrt() обчислює квадратний корінь числа
square_root = math.sqrt(4)
print("Square Root of 4 is",square_root)
# Функція pow() виконує піднесення числа до степеня
power = pow(2, 3)
print("2 to the power 3 is",power)
|
Результат:
Square Root of 4 is 2.0
2 to the power 3 is 8
Тут ми використали:
math.sqrt(4)
— для обчислення квадратного кореня з 4;
pow(2, 3)
— для піднесення числа 2 до степеня 3, тобто 2³.
Зверніть увагу на наступний рядок коду:
import math
|
Оскільки функцію sqrt() визначено всередині модуля math, нам необхідно підключити його до нашої програми.
Переваги використання функцій
Перевага №1: Повторне використання коду. Ми можемо використати ту саму функцію декілька разів у нашій програмі, що робить наш код багаторазовим. Наприклад:
# Визначення функції
def get_square(num):
return num * num
for i in [1,2,3]:
# Виклик функції
result = get_square(i)
print('Square of',i, '=',result)
|
Результат:
Square of 1 = 1
Square of 2 = 4
Square of 3 = 9
Тут ми створили функцію під назвою get_square() для обчислення квадрата числа. Потім написали цикл for для обчислення квадрата чисел від 1 до 3. Одна й та сама функція обчислення квадрата числа використовується декілька разів у циклі.
Перевага №2: Читабельність коду. Функції допомагають розбивати код на менші частини, щоб зробити програму читабельною та легкою для розуміння.
Параметри та аргументи функції в Python
Параметр — це значення, яке приймає функція. Аргумент — це значення, яке передається у функцію під час її виклику у програмі.
Розглянемо приклад використання параметрів функції в Python:
def add_numbers(a, b):
sum = a + b
print('Sum:', sum)
add_numbers(2, 3)
|
Результат:
Sum: 5
Тут функція add_numbers() приймає два параметри: a
та b
. Зверніть увагу на наступний рядок коду:
add_numbers(2, 3)
|
Параметри a
та b
отримають відповідні значення 2
та 3
.
Параметри зі значеннями за замовчуванням
У Python за допомогою оператора =
ми можемо вказати значення за замовчуванням для параметрів функції. Наприклад:
def add_numbers( a = 7, b = 8):
sum = a + b
print('Sum:', sum)
# Виклик функції з 2 аргументами
add_numbers(2, 3)
# Виклик функції з 1 аргументом
add_numbers(a = 2)
# Виклик функції без надання аргументів
add_numbers()
|
Результат:
Sum: 5
Sum: 10
Sum: 15
Зверніть увагу на визначення функції:
def add_numbers(a = 7, b = 8):
...
|
Тут ми вказали значення за замовчуванням 7
та 8
для параметрів a
та b
відповідно. Ось як працює ця програма:
add_number(2, 3)
— під час виклику функції передаються обидва значення. Отже, ці значення використовуються замість значень за замовчуванням.
add_number(2)
— під час виклику функції передається лише одне значення. Параметру a
надається значення 2, а для параметра b
використовується значення за замовчуванням.
add_number()
— під час виклику функції значення не передаються. Отже, для обох параметрів a
та b
використовуються значення за замовчуванням.
Іменовані аргументи в Python
Іменовані аргументи є парою “ім’я-значення”, що передається функції. Ім’я та значення пов’язуються з аргументом напряму, тому при передачі аргументу плутанини з порядком не виникає. Наприклад:
def display_info(first_name, last_name):
print('First Name:', first_name)
print('Last Name:', last_name)
display_info(last_name = 'Cartman', first_name = 'Eric')
|
Результат:
First Name: Eric
Last Name: Cartman
Зверніть увагу на виклик функції:
display_info(last_name = 'Cartman', first_name = 'Eric')
|
Тут ми вказали як імена аргументів, так і їх значення під час виклику функції.
Відповідно, аргумент first_name
у виклику функції стає параметром first_name
у визначенні функції. Так само аргумент last_name
у виклику функції стає параметром last_name
у визначенні функції.
У таких сценаріях порядок надання аргументів немає значення.
Довільні аргументи в Python
Іноді ми заздалегідь не знаємо кількість аргументів, які будуть передані в функцію. Щоб впоратися з подібною ситуацією, ми можемо використовувати довільні аргументи в Python.
Довільні аргументи дозволяють передавати різну кількість значень під час виклику функції. Для вказівки даного типу аргументів використовується зірочка (*
) перед ім’ям параметра у визначенні функції. Наприклад:
def find_sum(*numbers):
result = 0
for num in numbers:
result = result + num
print("Sum = ", result)
# Виклик функції з 3 аргументами
find_sum(1, 2, 3)
# Виклик функції з 2 аргументами
find_sum(4, 9)
|
Результат:
Sum = 6
Sum = 13
Тут ми створили функцію find_sum(), яка приймає довільну кількість аргументів. Зверніть увагу на виклики функції:
find_sum(1, 2, 3)
find_sum(4, 9)
|
Ми можемо викликати ту саму функцію з різною кількістю аргументів.
Примітка: Після отримання декількох значень об’єкт numbers
починає поводити себе як масив, тому ми можемо використовувати цикл for для доступу до кожного значення.
Рекурсія в Python
Рекурсія — це процес визначення чогось у межах самого себе. Прикладом у фізичному світі може бути розміщення двох дзеркал одне напроти одного. Будь-який об’єкт між ними відображатиметься рекурсивно.
Рекурсивна функція в Python
У Python ми знаємо, що функція може викликати інші функції. Функція може навіть викликати саму себе. Подібні типи конструкцій називаються рекурсивними функціями.
Нижче наведено приклад рекурсивної функції для знаходження факторіала цілого числа.
Примітка: Факторіал числа — це добуток всіх цілих чисел від 1 до вказаного числа. Наприклад, факторіал числа 6 дорівнює 1*2*3*4*5*6 = 720
.
def factorial(x):
"""Це рекурсивна функція
знаходження факторіала цілого числа."""
if x == 1:
return 1
else:
return (x * factorial(x-1))
num = 3
print("The factorial of", num, "is", factorial(num))
|
Результат:
The factorial of 3 is 6
Тут factorial() є рекурсивною функцією, оскільки вона викликає саму себе. Коли ми викликаємо цю функцію з додатним цілим числом, вона рекурсивно викликатиме себе, зменшуючи число.
Ось зображення, яке показує покроковий процес того, що відбувається:
Наша рекурсія закінчується, коли число зменшується до 1. Це називається базовою умовою.
Кожна рекурсивна функція повинна мати базову умову, яка зупиняє рекурсію, інакше функція буде нескінченно викликати саму себе. Інтерпретатор Python обмежує глибину рекурсії, щоб уникнути нескінченних рекурсій, що призводять до переповнення стека.
За замовчуванням максимальна глибина рекурсії дорівнює 1000. Якщо межа перевищена, то виникає помилка RecursionError
. Розглянемо приклад нескінченної рекурсії:
def recursor():
recursor()
recursor()
|
Результат:
Traceback (most recent call last):
File "", line 3, in
File "", line 2, in a
File "", line 2, in a
File "", line 2, in a
[Previous line repeated 996 more times]
RecursionError: maximum recursion depth exceeded
Переваги рекурсії
Рекурсивні функції роблять код чистішим.
Складну задача можна розбити на простіші підзадачі за допомогою рекурсії.
Генерація послідовності простіша з рекурсією, ніж з використанням будь-якої вкладеної ітерації.
Недоліки рекурсії
Іноді логіку рекурсії важко зрозуміти.
Рекурсивні виклики дорогі (неефективні), тому що забирають багато пам’яті та часу.
Рекурсивні функції важко відлагоджувати.