Функції у Python
Функції – важливий компонент будь-якої мови, і Python не є винятком. При написанні будь-якого великого проекту не можна обійтися без функцій, тому кожен програміст повинен знати, як працювати з ними.
Що таке функція
Функція - це блок коду, який можна багаторазово викликати виконання. Вона є фундаментальною частиною будь-якої мови програмування.
[su_sovet]Функція дозволяє розділяти програму на самостійні, але пов'язані частини. Програмісти використовують функції, щоб зробити програму модульною та уникнути повторення коду.[/su_sovet]
Функція може використовуватися для обробки даних, вона отримує на вхід значення, обробляє його та повертає результат у програму. Також вона може не повертати значення, а виводити його на екран або записувати файл.
Програміст може написати власну функцію або використовувати готові рішення мови, якщо вони, звичайно. Наприклад, краще самому не написати функцію визначення максимального числа, а скористатися стандартної max() .
Оголошення
Оголошуючи функцію, слід дотримуватися певних правил:
- Оголошення відбувається за допомогою ключового слова def, за ним іде ім'я функції та круглі дужки ().
- Аргументи, що передаються в функцію, повинні знаходитись у круглих дужках. Там же можна визначити їх значення за промовчанням, вказавши їх після знаку одно.
- Перед основним вмістом бажано включити рядок документації (docstring), який зазвичай визначає призначення та основні принципи роботи функції.
- Тіло функції починається після знака двокрапки. Важливо не забути про відступи.
- Щоб вийти з функції Python, використовують оператор return [значення] . Якщо оператор опущено, буде повернуто значення None .
Функцію можна оголосити будь-де: всередині модуля, класу або іншої функції. Якщо вона оголошує всередині класу, то називається методом класу і викликається так: class_name.function() .
Синтаксис оголошення
Параметри (аргументи) потрібно передавати в порядку, в якому вони визначені в круглих дужках.
def Ім'я(аргументи): "Документація" Тіло (інструкції) return [значення]
Приклад коду
Функція складає два числа, передані як аргументи. Якщо один або обидва аргументи не були передані, використовуються значення за промовчанням.
def print_sum(a = 2, b = 2): sum = a + b print(sum) return # поверне None
Виклик
Після визначення функції її можна викликати у будь-якій точці скрипта, як у тілі самого скрипта, і у тілі інший функції:
# визначаємо функцію def print_sum (a = 2, b = 2): sum = a + b print (sum) # Викликаємо її print_sum (5, 1)
Значення функції можна відразу передати в змінну або іншу функцію:
def sum(a = 2, b = 2): sum = a + b return sum # поверне суму c = sum(4, 3) # змінна c дорівнюватиме значення print(sum(5, 5)) # можна передати значення в аргументи іншої функції
[su_sovet]Виклик функції працює повільніше, ніж звичайний код. Це непомітно, поки її не викликають у циклі.
Необов'язкові параметри
При описі функції Python 3 аргументи, яким задаються початкові значення, є необов'язковими.
При виклику функції нам необов'язково вказувати значення необов'язкових параметрів.
def example(first, second=3, third=5): print(first) print(second) print(third) example('my string', third=4)
Висновок буде наступним:
Функція зі змінною кількістю аргументів
Часто виникає потреба створити таку функцію, яка може приймати різну кількість аргументів. Це можна реалізувати за допомогою передачі списку або масиву, проте Python дозволяє використовувати більш зручний підхід (також з використанням списку).
Щоб функція могла прийняти змінну кількість аргументів, перед ім'ям аргументу ставиться символ " * ". Коли програміст передає аргументи, вони записуються до кортежу, ім'я якого відповідає імені аргументу:
def variable_len(*args): for x in args: print(x) variable_len(1,2,3) # Виведе 1,2,3
Замість одного символу зірочки можна використовувати два, тоді аргументи поміщатимуться не до списку, а до словника:
def variable_len(**args): print(type(args)) for x, value in args.items(): print(x, value) variable_len(apple = "яблуко", bread = "хліб") # Виведе apple яблуко bread хліб
Анонімні функції
Це особливий вид функцій, які оголошуються за допомогою ключового слова lambda замість def:
Лямбда функції приймають будь-яку кількість аргументів, але можуть містити кілька висловів і завжди повертають лише одне значення.
У програмуванні на Python можна обійтися без анонімних функцій, які є звичайними, але без імені і з обмеженням в один вираз. Проте їх використання у потрібних місцях спрощує написання та сприйняття коду. Наприклад, у програмі калькулятор ми з її допомогою зробили обробники натискання кнопок.
Синтаксис
Синтаксис лямбда функції Python 3 передбачає використання тільки одного виразу: lambda arg1, arg2, … argn: вираз .
На практиці вони працюють так:
x = lambda arg1, arg2: arg1 * arg2 print(x(5,5)) # Виведе 25 print(x(3,5)) # Виведе 15
Повернення значень
За допомогою оператора return із функції можна повернути одне або кілька значень. Об'єктом, що повертається, може бути: число, рядок, None.
Щоб повернути кілька значень, потрібно написати їх через кому. Python дозволяє повернути з функції список або інший контейнер: достатньо вказати після ключового слова return ім'я контейнера.
Ось приклад, коли повертається список:
def x(n): a = [1,3] a = a * n return a print(x(2)) # виведе [1,3,1,3]
А це приклад того, як функція Python 3 повертає кілька значень. Оскільки змінні перераховані через кому, всі вони утворюють список. Ці значення можна присвоїти відразу декільком змінним, як це показано в наступному прикладі:
def example(): language = "python" version = 3 flag = True return language, version, flag language, version, flag = example() print(language, version, flag) # виведено буде python 3 True
Рекурсія
Рекурсією називається процес, коли функція викликає саму себе. Її можна використовувати замість циклів, наприклад, для завдання щодо знаходження факторіалу.
def f(num): if num == 0: return 1 return f(num-1) * num print(f(5)) # Виведе число 120
Рекурсію рекомендується використовувати лише там, де це дійсно потрібно. Інтерпретатор Python автоматично виділяє пам'ять для виконуваної функції, якщо викликів самої себе буде занадто багато, це призведе до переповнення стека та аварійного завершення програми. Наступний код викличе виключення «RecursionError», яка показує, що перевищено максимальний ліміт рекурсії.
def x(num): a = num - 1 print(a) x(a) x(5)
Дізнатися максимальний ліміт і змінити його можна за допомогою getrecursionlimit() і setrecursionlimit(межа) з бібліотеки sys.
Один із прикладів застосування рекурсії – це розрахунок чисел Фібоначчі.
Порожня функція
Щоб створити порожню функцію, потрібно в її тілі використовувати оператор заглушки pass . Тоді вона існуватиме і не виконуватиме жодних дій.
Такі функції можуть бути використані для різних специфічних завдань, наприклад, при роботі з класами, асинхронною відправкою форм.
[su_sovet]Зазвичай програмісти роблять функцію порожньою, коли хочуть відкласти її реалізацію потім (наприклад, алгоритм її вже спланований, але ще реалізований, а запустити виконання код треба, щоб перевірити працездатність решти кода).[/su_sovet]
Області видимості
Область видимості – важлива складова будь-якої мови програмування. З її допомогою в одному модулі можна використовувати те саме ім'я змінної кілька разів.
Області видимості також роблять програму безпечнішою, не дозволяючи отримати доступ до важливих змінних.
У Python існує дві області видимості:
- Світова. Змінні оголошуються безпосередньо всередині модуля та доступні з будь-якої точки програми.
- Локальна. Змінні оголошуються в тілі функції та доступні лише всередині неї.
Важливо розуміти, що з локальної області видимості можна звернутися до змінних, які перебувають у глобальній, але не навпаки.
[su_sovet] Причому читання глобальної змінної можна здійснити, просто звернувшись до неї. А ось для запису треба окремо вказувати за допомогою ключового слова global, що ми працюємо саме із глобальною змінною![/su_sovet]
val1 = "my global" val2 = "another global" def example(): print(val1) # Виведе my global global val2 val2 = "change another global" example() print(val2) # Виведе change another global
Докладніше про область видимості можна прочитати в окремій статті на сайті.
Основні вбудовані функції в Python
Python надає програмісту всі необхідні основні функції для роботи, крім того, використовуючи додаткові модулі (підключаючи різні бібліотеки), можна знайти вже реалізовані методи практично будь-якого завдання.
- print() Виводить об'єкти на екран або файл. Приклад використання print("output string", end=""). Приймає аргументи:
- object - те, що потрібно вивести;
- sep - роздільник, який ставиться між об'єктами, за замовчуванням - пробіл;
- end - закінчення після об'єкта, наприклад керуючий символ "\n";
- file - атрибут, що дозволяє передати об'єкт у файл (за замовчуванням виводить на екран);
Функції Python
Ми можемо визначити функцію Python, використовуючи ключове слово def. Давайте подивимося на кілька прикладів функції в Python.
def hello(): print('Hello World') def add(x, y): print(f'arguments are and ') return x + y
Грунтуючись на наведених вище прикладах, ми можемо визначити структуру функції як це.
def function_name(arguments): # code statements
Як викликати функцію Python?
Ми можемо викликати функцію на її ім'я. Якщо функція приймає настройки, ми повинні надіслати їх під час виклику функції.
hello() sum = add(10, 5) print(f'sum is ')
Ми викликаємо певні функції hello() і add(). Ми також викликаємо функцію print(), яка є однією з вбудованих функцій у Python.
Типи
У Python є два типи функцій.
- вбудовані: функції, що надаються мовою Python, такі як print(), len(), str() тощо.
- Користувацькі: функції, визначені нами у програмі Python.
Чи може функція мати значення за замовчуванням?
Python допускає стандартні значення для параметрів функції. Якщо абонент не передає параметр, використовується значення за замовчуванням.
def hello(year=2019): print(f'Hello World') hello(2020) # function parameter is passed hello() # function parameter is not passed, so default value will be used
Hello World 2020 Hello World 2019
Чи можемо ми мати кілька операторів повернення всередині функції?
Так, функція може мати кілька операторів повернення. Однак при досягненні одного з операторів повернення виконання функції припиняється, і значення повертається стороні, що викликає.
def odd_even_checker(i): if i % 2 == 0: return 'even' else: return 'odd' print(odd_even_checker(20)) print(odd_even_checker(15))
Чи функція Python може повертати кілька значень одне за одним?
Функція Python може повертати кілька значень одне за одним. Це реалізовано за допомогою ключового слова yield. Це корисно, коли ви хочете, щоб функція повертала велику кількість значень та обробляла їх. Ми можемо розділити значення, що повертаються на кілька частин, використовуючи оператор yield. Цей тип функції також називається функцією генератора.
def return_odd_ints(i): x = 1 while x
Аргументи
Python допускає три типи параметрів у визначенні функції.
- Формальні аргументи: ті, які ми бачили у прикладах досі.
- Змінна кількість аргументів без ключових слів: наприклад, def add(*args)
- Змінна кількість аргументів ключових слів або іменованих аргументів: наприклад, def add(**kwargs)
Деякі важливі моменти щодо змінних аргументів у Python:
- Порядок аргументів має бути формальним, *args та **kwargs.
- Не обов'язково використовувати імена змінних параметрів як args і kwargs. Однак найкраще використовувати їх для кращого читання коду.
- Тип args – кортеж. Таким чином, ми можемо передати кортеж для відображення зі змінною * args.
- Тип кваргів – дикт. Таким чином, ми можемо передати словник для зіставлення зі змінною ** kwargs.
Ось простий приклад.
def add(x, y, *args, **kwargs): sum = x + y for in args: sum += a for k, v in kwargs.items(): sum += v return sum total = add( 1, 2, *(3, 4), **) print(total) # 21
Рекурсивна функція Python
Коли функція викликає сама себе, вона називається рекурсивною функцією. У програмуванні цей сценарій називається рекурсією.
Ви повинні бути дуже обережними при використанні рекурсії, тому що є ймовірність, що функція ніколи не завершиться і перейде в нескінченний цикл. Ось простий приклад друку ряду Фібоначчі із використанням рекурсії.
def fibonacci_numbers_at_index(count): if count
Корисно знати про рекурсію, але в більшості випадків при програмуванні це не потрібно. Те саме можна зробити за допомогою циклу for або while.
Тип даних функції
Функції Python є екземплярами класу "функція". Ми можемо перевірити це за допомогою функції type().
def foo(): pass print(type(foo))
Порівняння функції з методом
- Функція Python є частиною сценарію Python, в якому вона визначена, тоді як методи визначені всередині визначення класу.
- Ми можемо викликати функцію безпосередньо, якщо вона знаходиться у тому самому модулі. Якщо функцію визначено в іншому модулі, ми можемо імпортувати модуль, а потім викликати функцію безпосередньо. Нам потрібний клас чи об'єкт класу для виклику методів.
- Функція Python може звертатися до всіх глобальних змінних, тоді як методи класу Python можуть звертатися до глобальних змінних, а також до атрибутів та функцій класу.
- Тип даних функцій Python – це «функція», а тип даних методів Python – «метод».
Давайте подивимося на простий приклад функцій та методів у Python.
class Data: def foo(self): print('foo method') def foo(): print('foo function') # calling a function foo() # calling a method d = Data() checking data types print(type(foo)) print(type(d.foo))
foo function foo method
Переваги
- Можливість повторного використання коду, тому що ми можемо викликати ту саму функцію кілька разів
- Модульний код, оскільки ми можемо визначати різні функції для різних завдань
- Покращує ремонтопридатність коду
- Абстракція, оскільки абоненту, що викликає, не потрібно знати реалізацію функції
Анонімна функція
Анонімні функції немає імені. Ми можемо визначити анонімну функцію Python, використовуючи ключове слово lambda.
def square(x): return x * x f_square = lambda x: x * x print(square(10)) # 100 print(f_square(10)) # 100