Функції
Як відомо, підпрограмою називають відокремлену частину програми, що реалізує деякий алгоритм та може викликатись з інших частин програми. Раніше згадувалося, що підпрограми поділяють на процедури (що не повертають значень) та функції (які облислюють результат). У Python такого розрізнення немає, тому всі підпрограми називають функціями.
Визначаються вони ключовим словом def
від англійського define — “визначити”. Перелік даних, які може приймати функція, називається параметрами, а конкретні значення, надані під час виклику, є аргументами. Створимо простеньку функцію my_func
без параметрів та викличемо її:
def my_func():
print("Привіт з функції!")
my_func()
За конвенцією назви змінних та функцій слід писати у зміїному регістрі, napryklad_os_tak. Щодо параметрів, у Пайтоні можна вказувати параметри “за замовчуванням”. Це означає, що якщо у відповідність параметру не надали аргумент, буде використано вказане значення. Це дещо схоже на зручнішу альтернативу до перевантаження функцій у Java. Параметри за замовчуванням вказуються як значення після знаку “дорівнює”.
def square(number = 3):
return number * number;
print( square(8) ) # 64
print( square() ) # 9, адже було використано 3 за замовчуванням
Також можна вказувати аргументи незалежно від їх порядку — для цього до кожного значення треба написати, до якого параметра слід його надати.
def func(a, b = 2, c = 3):
pass
func(1) # a = 1, b = 2, c = 3
func(10, 11) # a = 10, b = 11, c = 3
func(10, c = 12) # a = 10, b = 2, c = 12
func(10, c = 12, b = 11) # a = 10, b = 11, c = 12
func(10, 11, 12) # a = 10, b = 11, c = 12
З попердніх розділів можливо було помітити, що там, де у Java були ...
— у Python *
. Аргументи змінної довжини (variable-length arguments) — особливий параметр, призначений для приймання довільної кількості аргументів. До нього записується залишок аргументів у вигляді кортежу.
def print_all(*varargs):
for arg in varargs:
print(arg)
print_all('Тут', 'три', 'аргументи')
Область видимості
Облась видимості, або область дії імен — це та частина програми, посилання імені на об’єкт у якій дійсне. Коли відбувається присвоєння значення до змінної, то значення зберігається в певній комірці пам’яті, яка має адресу (наприклад, 0x13fb07). У просторі даної функції або у глобальному просторі створюється посилання на цю комірку, яке і має ім’я.
У першому розділі розповідалось, що змінні створюються за співвикористанням, тобто якщо написати var1 = var2 = 2
, на відміну від Java не створиться два значення “2”, а просто буде два посилання на це значення.
Таким чином, коли відбувається вихід із функції, усі посилання, створені у ній, знищуюються. Відповідно, у Python змінні створюються у найбільш вужчій області видимості. Блоки не створюють окрему область, тому змінна, створена у циклі, залишається після нього доступною. Якщо ж створити змінну у функції, поза нею вона не буде доступною.
x = 2
def func():
x = 5 # Це нова внутрішня змінна x, незалежна від зовнішньої
for i in range(3):
pass
# Після циклю i = 2 так і залишилось тут
# x = 2, адже функція не могла її змінити
Для того, щоб функція не створювала внутрішню змінну, а використовувала глобальну, таку змінну слід вказати global
на початку функції. Також, так як функції можуть бути вкладеними, можна звертатись до змінної на одну область видимості вище, оголосивши змінну словом nonlocal
.
x = 2
def func1():
x = 3
def func2():
nonlocal x # x посилатиметься на x у функції вище, x = 3
x = 4
func2()
# тому тут тепер x = 4
func1()
# x все ще дорівнює тут 2
def func3():
def func4():
global x # x посилається на перший глобальний x = 2
x = 5
func4()
func3()
# тепер x = 5
Лямбда-функції
У Python є можливість створювати функції без назв, які називають анонімними функціями. Вони є аналогічними “стрілочним функціям” у математиці: x ↦ M. У цій мові такі функції називають “лямбда-функціями” і зазвичай використовують для передачі невеликих алгоритмів в інші функції. Записують їх у такій формі:
lambda <параметри>: <вираз>
Вираз обов’язково має повертати деяке значення. Наприклад, створимо лямбда-функцію суми a
і b
та запишемо цю функцію у змінну suma
. Тепер можна викликати цю змінну з аргументами, адже вона зберігає функцію.
suma = lambda a, b: a + b
print( suma(2, 3) ) # 5
Такі функції мають широкий спектр застосувань. Для прикладу наведу можливість зробити власний алгоритм сортування, нехай за довжиною рядків:
arr = ['дім', 'автомобіль', "комп'ютер"]
arr.sort(key = lambda x: len(x))