Вступ

Як ми і домовлялися попереднього уроку, цього разу ми з вами розберемося з функціями у Пітоні.

Що таке функція? Функція – це невелика автономна програма (кусок коду), що виконує певне завдання і яку ви можете використовувати в різних місцях вашої основної більшої програми. Після того як ви створили вашу функцію ви можете використовувати її у будь-який час, у будь-якому місці і скільки завгодно разів.

Таким чином функції економлять ваш час і зусилля допомагаючи уникати повторювання вашого коду кожен раз коли вам потрібно запрограмувати одне і те ж завдання.

Використання Функцій

Python має багато вже готових (вбудованих) функцій, які ми з вами можемо використовувати одразу ж після інсталяції цієї мови, просто ‘викликавши‘ її. Виклик функції у себе включає передачу даних функції і потім отримання певного значення від неї. На дуже простому прикладі це виглядає отак:

  • function_name‘ тут є назвою функції, яку ми викликаємо
  • а ‘parameters‘ – це значення, які ми передаємо функції, щоб дати їй знати що робити і як саме це робити. Наприклад, якщо функція множить будь-яке дане число на 5, тоді у даному випадку ‘parameters’ буде казати функції, яке число вона повинна множити на 5. Якщо ми передамо 70 в параметрах, тоді функція поверне 70 x 5 = 350.

Якщо не все зрозуміло поки – не хвилюйтесь. В наступних секціях цього уроку ми пройдемося детальніше по виклику функції, її аргументах та результату функції.

Параметри і Результати Функцій – Зв’язок з Функцією

Насправді для комп’ютера не важлива сама назва функції, а більше те, що функція отримує в якості її аргументів, і що вона повертає як результат свого виконання (виклику). І на практиці, коли комп’ютер виконує функцію, він не бачить назву функції, але її результат який ця функція повертає. Так само як із змінними – комп’ютер не бачить назв змінних, але бачить значення цих змінних.

Назвемо ту функцію, що множить передане їй число на 5 – multiply. При виклику цієї функції передаємо їй число, яке хочемо щоб вона нам помножила на 5 в дужках. Наприклад:

Насправді для комп’ютера це виглядатиме як:

Ми викликали функцію під назвою multiply передавши їй число 70 в дужках, і вона повернула нам 350 (результат 70 помножити на 5).

А тепер спробуємо приклад із справжньою функцією, тому можете запускати Пітон інтерпретатор і також спробувати наступні рядочки, та перевірити чи результат ваш співпаде з нижченаведеним.

Ми викличемо функцію raw_input. Дана функція запитує користувача ввести будь-які дані (символ, або цілу стрічку), вона отримує введені користувачем дані і повертає їх у вашу програму у вигляді стрічки тексту. Пробуємо наступний код:

Після запуску першого рядка дана програма зупиниться і запросить вас ввести що-небудь рядочком “What is your name?“. Тоді ви вводите, наприклад “John“, натискаєте ввід (Enter) і після цього програма продовжує свою роботу. Змінна ‘a‘ отримує стрічку “John” значенням і у наступному рядку ми цю стрічку роздруковуємо.

Пітон інтерпретатор бачитиме нашу програму приблизно у наступному вигляді:

Пам’ятаємо, що змінна – це лише збережені в пам’яті комп’ютера значення. Для комп’ютера змінна ‘a‘ не виглядає як ‘a‘, просто як значення що в ній зберігається. Функції у цьому сенсі є подібні до змінних – для головної програми (у якій ці функції використовуються), вони виглядають просто як значення, які ці функції повертають.

Програма Калькулятор

Давайте тепер спробуємо написати ще одну програму, яка працюватиме для нас як калькулятор. Цього разу вона вже буде дійсно корисною і трохи цікавішою, ніж ті які розглядали перед цим. Ми зробимо так, що програма буде спочатку питати, яку операцію ми хочемо здійснити – додавання, множення двох чисел, ділення чи віднімання одного числа від іншого.

З цим ми спочатку будемо мати невеличку проблемку – функція ‘raw_input’ (та яку ми щойно використовували у прикладі наведеному вище) повертає дані від користувача у вигляді стрічки, а нам потрібно буде мати число. На щастя, хтось в Пітоні вже давним давно написав функцію, подібну по до ‘raw_input‘, але яка транслює введені дані користувацькі у числовий формат. Це означає, що всередині нашої програми калькулятора ми зможемо мати числові дані введені користувачем, а саме дані типу ‘integer‘ – це ціле число в Пітоні.

Тепер давайте з вами змоделюємо наш калькулятор. Ми хочемо мати щось на зразок меню, до якого будемо повертатися кожного разу після того, як закінчимо додавати, віднімати чи іншу операцію. Тобто нам потрібно буде запрограмувати постійний цикл, що буде працювати до моменту допоки користувач не накаже програмі закінчити дію.

На даному етапі ми розглядаємо лише чотири математичних операції: додавання, віднімання, множення і ділення. Давайте спочатку напишемо так званий псевдо-код програми. Тобто, змоделюємо алгоритм українською мовою. А вже коли матимемо його, тоді перекладемо на мову Python 😉

Як бачите, більшість програми міститься всередині циклу. Тобто програма закінчиться лише тоді коли користувач обере Варіант 5 – який наказує програмі зупинити своє виконання. Якщо ж користувач вибирає будь-який з попередніх чотирьох варіантів – тоді ми просимо його ввести послідовно два числа, над якими і виконуємо обрану перед цим операцію. На кінець – виводимо результат на екран. От і вся логіка!

А тепер спробуємо протранслювати наш псевдо-калькулятор на реальний калькулятор, з псевдо-мови на мову Пітон 🙂

Ух! Велика получилась програмуліна. Якщо ви цього ще не зробили, тоді спробуйте тепер її скопіювати у свій власний файлик в редакторі чи в Python IDE, зберегти його як ‘calculator.py‘ і запустити. Спробуйте побавитись з різними опціями і варіантами, що ми щойно напрограмували, вводячи як цілі числа (тип integer в Пітоні) так і дроби (тип float в Пітоні). Також спробуйте вводити неправильні дані, як от текст, і гляньте, що станеться, як поведеться програма, які помилки віддасть вам у відповідь. Пізніше ми з вами навчимося відловлювати різного роду помилки у нашому коді, і правильно обробляти їх, навіть якщо користувач ввів неправильний формат даних.

Зверніть увагу на те, що більшість програми знаходиться всередині циклу. І виходимо ми з нього лише коли користувач обере Варіант 5. Також на початку кожного циклу ми знову виводимо довідкову інформацію про набір доступних дій.

Визначення Власних Функцій

Ок, це дуже добре, що ми вже навчились користуватися готовими існуючими функціями, що вже є написані для нашого користування. Але, що коли нам самим потрібно написати власну функцію, щоб наприклад заощадити трохи часу, уникнути дублікації коду, а також щоб мати можливість використати її у наших інших програмах?

Тут і приходить нам на допомогу пітонівський оператор ‘def’. Оператором ми називаємо певну інструкцію, яка вказує Пітону що саме зробити. Наприклад, оператор ‘+’ вказує на те, що треба виконати операцію додавання, оператор ‘while’ заставляє Пітон інтерпретатор розпочати виконання циклу.

Оcь як працює оператор ‘def’:

function_name – це ім’я нашої функції. У наступному рядочку після ‘def’ ми пишемо код, який називається “тілом функції” – це те, що наша функція власне робить. Тіло функції завжди починається з додаткових відступів. Про параметри (агрументи) функції paremeter_1 i parameter_2 ми поки не будемо хвилюватися, а розберемо їх трішки пізніше.

Функція – це як мініатюрна програма, яка може також приймати певні параметри (аргументи, вхідні дані), вона запускається з вхідними даними, і наприкінці свого виконання зазвичай повертає певне значення. Тому що функція є, ніби, окремою програмою, вона не зазвичай не бачить змінних, які є визначені у нашій головній програмі, і навпаки – наша основна програма не бачить змінних, які є визначені всередині нашої функції. Наприклад, нижченаведена функція, яка виводить слово “hello” на екран, а потім ще й повертає число ‘1234’ головній програмі:

Що ми зробили в останньому рядочку програми наведеної вище? Введіть дану програму у вашому редакторі, і запустіть. Результат буде наступним:

Отже, що відбулося?

  1. коли рядочок ‘def hello()’ був запущений Пітон інтерпретатором, функція ‘hello’ була створена у цей момент
  2. у рядочку ж ‘print hello()’ ми зробили ВИКЛИК функції ‘hello’, тобто код, що знаходиться всередині визначеної функції, запустився
  3. відповідно функція виконала свій рядочок “print ‘hello'”, та потім повернула число ‘1234’ назад у головну програму
  4. і на кінець – головна програма вивела на екран те значення, що повернула наша функція “print hello()” і таким чином ми отримали у другому рядочку число ‘1234’ як результат виконання нашої цілої програми

Зауважте, головна програма навіть не здогадувалася, що слово ‘hello’ було виведене на екран. Все про що вона знала – це те, що функція повернула їй значення ‘1234’, яке вона успішно вивела на екран 😉

Параметри Функцій

Ще одну річ, яку ми розберемо з вами у цьому не маленькому уроці – це те, як саме передавати параметри (аргументи) функції. Давайте з вами пригадаємо попередній вигляд того, як ми визначили нашу функцію ‘function_name’:

У даному визначенні на місці parameter_1 та parameter_2 (всередині дужок) ми зазвичайн ставимо імена змінних, в яких ми передаємо певні параметри нашій функції. Ми можемо передавати скільки завгодно параметрів, головне пам’ятати ставити кому між ними. Коли ми викликаємо функцію, перше значення, яке ми передаємо нашій функції буде передане під назвою parameter_1. Відповідно друге значення у нашому випадку передане функції буде доступне (всередині функції) як – parameter_2.

Тобто наступний запис:

викличе нашу функцію function_name і передасть їй два аргументи (параметри): стрічку ‘test’ та число 2345. Стрічка ‘test’ буде доступна всередині функції під якою назвою? Саме так – parameter_1 🙂 Відповідно число 2345 можна буде отримати через змінну під назвою parameter_2.

У мові Пітон є також можливість визначати функції з параметрами, які по замовчуванню міститимуть уже певне значення. А також приймати аргументи навмання, за їхньою позицією, або іменах (ключах) змінних. Але поки ці складніші випадки зачіпати не будемо.

Кінцева Програма

Давайте тепер з вами пригадаємо наш калькулятор! І спробуємо переписати його використовуючи наші знання про функції. З однією основною метою – зробити тіло головного циклу нашого калькулятора – простішим для розуміння і з меншою кількістю коду.

Щоб довго не пояснювати, спочатку наведу вам те, що у мене вийшло з функціями, тобто кінцеву програму. А потім трошки розберемо:

Зауважте – сама програма загалом стала трохи більшою, ніж була перед цим. Проте ми значно спростили тіло нашого основного циклу використовуючи у ньому наші функції. Тобто загалом, програма наша стала легшою для розуміння.

Ми визначили усі наші функції із самого початку програми. Тобто це ми визначили кусочки функціоналу, який не запускається в момент коли Пітон інтерпретатор зчитує і пробує зрозуміти наш модуль, а лише коли запущена програма доходить до рядочків, де напряму явно здійснюється виклик наших функцій. Напр.:

В даній програмі ви викликаємо наші функції знову і знову, допоки користувач не вийде з калькулятора. Таким чином можемо перевикористовувати логіку закладену у нашу функцію скільки завгодно разів.

І на останок, щодо нашої оновленої програми калькулятора. Тепер, кожного разу коли вам потрібно буде оновити логіку калькулятора, тобто оновити основний цикл нашої програми, вам буде достатньо переглянути близько 24 рядочків коду, замість 50-ти, які були у нашому циклі перед використанням функцій. Тобто функції допомогли нам зробити наш код таким, що буде легше підтримувати і оновлювати у майбутньому.

На закінчення…

Ура!!! Який доооооовжелезний урок у нас з вами вийшлов! Але, в будь-якому випадку, ви молодці, що дійшли до цього моменту!

Цей урок забрав у мене не одну годину часу, і я старався донести інформацію якомога простіше. Тому маю велику надію, що матеріал корисний і доступний.

Функції – це одна з найважливіших концепцій у більшості мов програмування. Тому зрозуміти даний матеріал є надзвичайно важливим для нас з вами, щоб успішно рухатися далі!

Дописуйте у коментарі, якщо виникають питання, або знайшли помилки у прикладах. І будемо по-трохи рухатися далі до наступного уроку. Наш наступний крок – розібратися із трішки складнішими типами даних у мові Пітон – таких як кортежі, списки та словники!