{"nbformat":4,"nbformat_minor":0,"metadata":{"colab":{"provenance":[],"authorship_tag":"ABX9TyOaMFcZkKAw8b+u0RoaAZ5V"},"kernelspec":{"name":"python3","display_name":"Python 3"},"language_info":{"name":"python"}},"cells":[{"cell_type":"markdown","source":["# Функції"],"metadata":{"id":"e2QgtogWlX0g"}},{"cell_type":"markdown","source":["Щоб виконати завдання, визначене у вигляді функції, ви вказуєте ім'я функції, що відповідає за це завдання. Якщо зача повинна багаторазово виконуватися в програмі, вам не доведеться заново вводити весь необхідний код; просто викличте функцію, призначену для вирішення задачі, і цей виклик наказує Python виконати код, який міститься всередині функції."],"metadata":{"id":"oXtw7br6lZUE"}},{"cell_type":"code","source":["def greet_user():\n"," print(\"Hello!\")\n","\n","greet_user()"],"metadata":{"id":"Zaycm5iQlYRP","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1698145147694,"user_tz":-180,"elapsed":302,"user":{"displayName":"Іван Клопов","userId":"16257059839054245446"}},"outputId":"e992563e-49da-4b10-f12d-d04c585ba476"},"execution_count":4,"outputs":[{"output_type":"stream","name":"stdout","text":["Hello!\n"]}]},{"cell_type":"code","source":["greet_user()"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"XuWcdNn1VtgU","executionInfo":{"status":"ok","timestamp":1698145179313,"user_tz":-180,"elapsed":278,"user":{"displayName":"Іван Клопов","userId":"16257059839054245446"}},"outputId":"3d6a8663-fdd2-473f-8d97-e975bcf4a869"},"execution_count":5,"outputs":[{"output_type":"stream","name":"stdout","text":["Hello!\n"]}]},{"cell_type":"markdown","source":["## Передача інформації функції"],"metadata":{"id":"1toPIwh-lgQ3"}},{"cell_type":"markdown","source":["З невеликими змінами функція greet_user() зможе не лише сказати «Привіт!» користувачеві, але й привітати його на ім'я. Для цього слід включити ім'я username у круглих дужках для визначення функції def greet_user(). З додаванням username функція набуде будь-якого значення, яке буде укладено в дужки під час виклику. Тепер функція очікує, що під час кожного виклику буде надсилатися ім'я користувача. При виклику greet_user() вкажіть ім'я (наприклад, 'jesse') у круглих дужках:"],"metadata":{"id":"s-milz48lr48"}},{"cell_type":"code","source":["def greet_user(username):\n"," #\"\"\"Виводить просте привітання.\"\"\"\n"," print(\"Hello, \" + username.title() + \"!\")\n","\n","greet_user('ivan')\n","greet_user('dmutro')\n","greet_user('kurull')"],"metadata":{"id":"ZPBOF9eWlndh","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1698145580023,"user_tz":-180,"elapsed":300,"user":{"displayName":"Іван Клопов","userId":"16257059839054245446"}},"outputId":"e0906d4e-9e11-4a7a-d6b1-da458c205d47"},"execution_count":7,"outputs":[{"output_type":"stream","name":"stdout","text":["Hello, Ivan!\n","Hello, Dmutro!\n","Hello, Kurull!\n"]}]},{"cell_type":"markdown","source":["## Аргументи та параметри"],"metadata":{"id":"2Ptxji7vlzIs"}},{"cell_type":"markdown","source":["Функція greet_user() визначена так, що для роботи вона має отримати значення змінної username. Після того, як функція буде викликана та отримає необхідну інформацію (ім'я користувача), вона виведе правильне привітання."],"metadata":{"id":"uRgb4Y0ql4JS"}},{"cell_type":"markdown","source":["Змінна username у визначенні greet_user() — параметр, тобто умовні дані, необхідні функції виконання її роботи. Значення 'jesse' в greet_user('jesse') - _аргумент_, тобто конкретна інформація, передана при виклику функції. Викликаючи функцію, ви укладаєте значення, з яким функція має працювати, у круглі дужки. В даному випадку аргумент 'jesse' був переданий функції greet_user(), а його значення було збережено у змінній username."],"metadata":{"id":"Gja6GTGfl87S"}},{"cell_type":"markdown","source":["## Передача аргументів"],"metadata":{"id":"q1JJ4RgCmCBR"}},{"cell_type":"markdown","source":["Визначення функції може мати кілька параметрів, і може виявитися, що під час виклику функції необхідно передавати кілька аргументів. Існують кілька способів передачі аргументів функцій. Позиційні аргументи перераховуються в порядку, точно відповідному порядку запису параметрів; іменовані аргументи складаються з імені змінної значення; нарешті, існують списки та словники значень. Розглянемо всі ці методи."],"metadata":{"id":"PlCJ6pS2mIvd"}},{"cell_type":"markdown","source":["### Позиційні аргументи"],"metadata":{"id":"m22FF8kHmNPw"}},{"cell_type":"markdown","source":["При виклику функції кожному аргументу повинен бути поставлений у відповідність параметр визначення функції. Найпростіше зробити це виходячи з порядку перерахування аргументів. Значення, пов'язані з аргументами подібним чином, називаються позиційними аргументами. Щоб зрозуміти, як працює ця схема, розглянемо функцію для виведення інформації про свійських тварин. Функція повідомляє тип тварини та її ім'я:"],"metadata":{"id":"CYwDJQTRmRqW"}},{"cell_type":"code","source":["def describe_pet(animal_type, pet_name):\n"," # \"\"\"Выводит информацию оживотном.\"\"\"\n"," print(\"\\nI have a \" + animal_type + \".\")\n"," print(\"My \" + animal_type + \"'s name is \" + pet_name.title() + \".\")\n","\n","describe_pet('dog', 'bim')"],"metadata":{"id":"wx3z7Z4omD5Y","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1698145861996,"user_tz":-180,"elapsed":274,"user":{"displayName":"Іван Клопов","userId":"16257059839054245446"}},"outputId":"e1168c8c-6497-4075-e4ba-d42b0ea43fe6"},"execution_count":9,"outputs":[{"output_type":"stream","name":"stdout","text":["\n","I have a dog.\n","My dog's name is Bim.\n"]}]},{"cell_type":"markdown","source":["### Багаторазові виклики функцій"],"metadata":{"id":"ooSG5JipmYRQ"}},{"cell_type":"markdown","source":["Функція може викликатися в програмі стільки разів, скільки потрібно. Для виведення інформації про іншу тварину достатньо одного виклику __describe_pet()__:"],"metadata":{"id":"2uLXoGnPmZTa"}},{"cell_type":"code","source":["def describe_pet(animal_type, pet_name):\n","# \"\"\"Выводит информацию оживотном.\"\"\"\n"," print(\"\\nI have a \" + animal_type + \".\")\n"," print(\"My \" + animal_type + \"'s name is \" + pet_name.title() + \".\")\n","\n","describe_pet('hamster', 'harry')\n","describe_pet('dog', 'willie')"],"metadata":{"id":"uUNAEwy6mYh_","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1698145920093,"user_tz":-180,"elapsed":266,"user":{"displayName":"Іван Клопов","userId":"16257059839054245446"}},"outputId":"99ed6d78-2234-4d7b-a169-70475bc1c554"},"execution_count":10,"outputs":[{"output_type":"stream","name":"stdout","text":["\n","I have a hamster.\n","My hamster's name is Harry.\n","\n","I have a dog.\n","My dog's name is Willie.\n"]}]},{"cell_type":"markdown","source":["### Про важливість порядку позиційних аргументів"],"metadata":{"id":"HytuKlA4mhKf"}},{"cell_type":"markdown","source":["Якщо порушити порядок дотримання аргументів у виклику під час використання позиційних аргументів, можливі несподівані результати:"],"metadata":{"id":"ZKKIkFCXmqht"}},{"cell_type":"code","source":["def describe_pet(animal_type, pet_name):\n"," \"\"\"Выводит информацию оживотном.\"\"\"\n"," print(\"\\nI have a \" + animal_type + \".\")\n"," print(\"My \" + animal_type + \"'s name is \" + pet_name.title() + \".\")\n","describe_pet('harry', 'hamster')"],"metadata":{"id":"tm9EjgPGmk-N"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":["## Іменовані аргументи"],"metadata":{"id":"ukQK_T_6mwQr"}},{"cell_type":"markdown","source":["_Іменований аргумент_ є пару «ім'я-значення», що передається функції. Ім'я призначення пов'язуються з аргументом безпосередньо, тому при передачі аргументу плутанина з порядком виключається. Іменовані аргументи позбавляють клопоту з порядком аргументів при виклику функції, а також прояснюють роль кожного значення у виклику функції."],"metadata":{"id":"FikxisWXm1I1"}},{"cell_type":"code","source":["def describe_pet(animal_type, pet_name):\n"," \"\"\"Выводит информацию оживотном.\"\"\"\n"," print(\"\\nI have a \" + animal_type + \".\")\n"," print(\"My \" + animal_type + \"'s name is \" + pet_name.title() + \".\")\n","\n","describe_pet( pet_name='harry', animal_type='hamster')"],"metadata":{"id":"4okv9K75mwnu","colab":{"base_uri":"https://localhost:8080/"},"executionInfo":{"status":"ok","timestamp":1698146028719,"user_tz":-180,"elapsed":287,"user":{"displayName":"Іван Клопов","userId":"16257059839054245446"}},"outputId":"e9ba686a-f851-46fc-9ffa-64d89c1cc8ea"},"execution_count":11,"outputs":[{"output_type":"stream","name":"stdout","text":["\n","I have a hamster.\n","My hamster's name is Harry.\n"]}]},{"cell_type":"markdown","source":["### Значення за замовчуванням"],"metadata":{"id":"yf4btBzFm7r5"}},{"cell_type":"markdown","source":["Для кожного параметра функції можна визначити значення за замовчуванням. Якщо під час виклику функції передається аргумент, який відповідає даному параметру, Python використовує значення аргументу, а якщо ні — використовує значення за промовчанням. Таким чином, якщо для параметра визначено значення за замовчуванням, можна опустити відповідний аргумент, який зазвичай включається в виклик функції. Значення за промовчанням спрощують виклики функцій прояснюють типові способи використання функцій. Наприклад, якщо ви помітили, що більшість викликів d escribe_pet() використовується для опису собак, задайте animal_type значення за замовчуванням 'dog'. Тепер у будь-якому виклику describe_pet() для собаки цю інформацію можна опустити:"],"metadata":{"id":"7XZYtlb6nBSu"}},{"cell_type":"code","source":["def describe_pet(pet_name, animal_type='dog'):\n"," \"\"\"Выводит информацию оживотном.\"\"\"\n"," print(\"\\nI have a \" + animal_type + \".\")\n"," print(\"My \" + animal_type + \"'s name is \" + pet_name.title() + \".\")\n","\n","describe_pet(pet_name='willie')"],"metadata":{"id":"1YPYr9A9m769"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":["### Еквівалентні виклики функцій"],"metadata":{"id":"X7R-I1_lnIMq"}},{"cell_type":"markdown","source":["Оскільки позиційні аргументи, іменовані аргументи за промовчанням можуть використовуватися одночасно, часто існують кілька еквівалентних способів виклику функцій. Візьмемо оператор describe_pets() з одним значенням за замовчуванням:\n","def describe_pet(pet_name, animal_type='dog'):\n","При такому визначенні аргумент для параметра pet_name повинен задаватися у будь-якому випадку, але це значення може передаватися як у позиційному, так і в іменованому форматі. Якщо описувана тварина не є собакою, то аргумент animal_type теж повинен бути включений у виклик, і цей аргумент також може бути заданий як у позиційному, так і в іменованому форматі.\n","describe_pet('willie')\n","describe_pet(pet_name='willie')\n","describe_pet('harry', 'hamster')\n","describe_pet(pet_name='harry', animal_type='hamster')\n","describe_pet(animal_type='hamster', pet_name='harry')\n","Усі виклики функції видадуть такий же результат, як і в попередніх прикладах."],"metadata":{"id":"WVE6sWM3nOIX"}},{"cell_type":"markdown","source":["### Значення, що повертається"],"metadata":{"id":"g3IYxWeqnS2d"}},{"cell_type":"markdown","source":["Функція має виводити результати своєї роботи. На місце цього вона може обробити дані, а потім повернути значення або набір повідомлень. Значення, що повертається функцією, називається значенням, що повертається. Команда __return__ передає значення з функції до рядка, в якому ця функція була викликана. Значення, що повертаються, допомагають перемістити більшу частину рутинної роботи у вашій програмі у функції, щоб спростити основний код програми."],"metadata":{"id":"Zv62I3l-nc45"}},{"cell_type":"markdown","source":["### Повернення простого значення"],"metadata":{"id":"jMbsp9OCniWa"}},{"cell_type":"markdown","source":["Розглянемо функцію, яка отримує ім'я та прізвище та повертає акуратно відформатоване повне ім'я:"],"metadata":{"id":"dCQDYf2UnoOu"}},{"cell_type":"code","source":["def get_formatted_name(first_name, last_name):\n"," \"\"\"Возвращает аккуратно отформатированное полное имя.\"\"\"\n"," full_name = first_name + ' ' + last_name\n"," return full_name.title()\n","\n","musician = get_formatted_name('jimi', 'hendrix')\n","print(musician)"],"metadata":{"id":"FGtfTL_CnTfA"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":["### Необов'язкові аргументи"],"metadata":{"id":"KuLMVPLqnskU"}},{"cell_type":"markdown","source":["Іноді буває зручно зробити аргумент необов'язковим, щоб розробник, який використовує функцію, міг передати додаткову інформацію лише тому випадку, якщо цього захоче. Щоб зробити аргумент необов'язковим, можна скористатися значенням за промовчанням. Допустимо, ви захотіли розширити функцію get_formatted_name(), щоб вона також працювала і з іншими іменами. Перша спроба могла б виглядати так:"],"metadata":{"id":"H44Zxgz6obpm"}},{"cell_type":"code","source":["def get_formatted_name(first_name, middle_name, last_name):\n"," \"\"\"Возвращает аккуратно отформатированное полное имя.\"\"\"\n"," full_name = first_name + ' ' + middle_name + ' ' + last_name\n"," return full_name.title()\n","\n","musician = get_formatted_name('john', 'lee', 'hooker')\n","print(musician)"],"metadata":{"id":"nIwNf5lcnwXF"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":["Однак інші імена потрібні не завжди, а в такому записі функція не працюватиме, якщо під час виклику їй передаються лише ім'я та прізвище. Щоб середній аргумент був необов'язковим, можна надати аргументу middle_name порожнє значення за замовчуванням; цей аргумент ігнорується, якщо користувач не передав йому значення. Щоб функція get_formatted_name() працювала без другого імені, слід призначити для параметра middle_name порожній рядок за промовчанням і перемістити його в кінець списку параметрів:"],"metadata":{"id":"Me_pK2yVolbZ"}},{"cell_type":"code","source":["def get_formatted_name(first_name, last_name, middle_name=''):\n"," \"\"\"Возвращает аккуратно отформатированное полное имя.\"\"\"\n"," if middle_name:\n"," full_name = first_name + ' ' + middle_name + ' ' + last_name\n"," else:\n"," full_name = first_name + ' ' + last_name\n"," return full_name.title()\n","\n","musician = get_formatted_name('jimi', 'hendrix')\n","print(musician)\n","\n","musician = get_formatted_name('john', 'hooker', 'lee')\n","print(musician)"],"metadata":{"id":"2DbOZVlvofnY"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":["## Повернення словника"],"metadata":{"id":"ohOulgkRpNK1"}},{"cell_type":"markdown","source":["Функція може повернути будь-яке значення, необхідне вам, у тому числі складнішу структуру даних (наприклад, список або словник). Так, наступна функція отримує частини імені та повертає словник, що представляє людину:"],"metadata":{"id":"PuqcKrWRpVPk"}},{"cell_type":"code","source":["def build_person(first_name, last_name):\n"," \"\"\"Возвращает словарь синформацией очеловеке.\"\"\"\n"," person = {'first': first_name, 'last': last_name}\n"," return person\n","\n","musician = build_person('jimi', 'hendrix')\n","print(musician)"],"metadata":{"id":"nNBq4stXpQ0F"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":["## Використання функції в циклі while"],"metadata":{"id":"2-OIUKeMpc7_"}},{"cell_type":"code","source":["def get_formatted_name(first_name, last_name):\n"," \"\"\"Возвращает аккуратно отформатированное полное имя.\"\"\"\n"," full_name = first_name + ' ' + last_name\n"," return full_name.title()\n","\n","while True:\n"," print(\"\\nPlease tell me your name:\")\n"," print(\"(enter 'q' at any time to quit)\")\n"," f_name = input(\"First name: \")\n"," if f_name == 'q':\n"," break\n"," l_name = input(\"Last name: \")\n"," if l_name == 'q':\n"," break\n","\n","formatted_name = get_formatted_name(f_name, l_name)\n","print(\"\\nHello, \" + formatted_name + \"!\")"],"metadata":{"id":"cPgN3jTPphGL"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":["## Передача списку"],"metadata":{"id":"e65xa6YspYs4"}},{"cell_type":"markdown","source":["Часто під час виклику функції зручно передати список — імен, чисел чи складніших об'єктів (наприклад, словників). Під час передачі списку функція отримує прямий доступ до всього вмісту. Ми скористаємось функціями для того, щоб зробити роботу зі списком більш ефективною. Допустимо, ви хочете вивести вітання для кожного користувача зі списку. У наступному прикладі список імен передається функції greet_users(), яка виводить вітання для кожного користувача окремо:"],"metadata":{"id":"hcrRB6cdpso7"}},{"cell_type":"code","source":["def greet_users(names):\n"," \"\"\"Вывод простого приветствия для каждого пользователя всписке.\"\"\"\n"," for name in names:\n"," msg = \"Hello, \" + name.title() + \"!\"\n"," print(msg)\n","\n","usernames = ['hannah', 'ty', 'margot']\n","greet_users(usernames)"],"metadata":{"id":"u1vpVxogpnUR"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":["## Зміна списку до функцій"],"metadata":{"id":"cSOXkU-vp08K"}},{"cell_type":"markdown","source":["Якщо ви надсилаєте список функції, код функції зможе змінити список. Всі зміни, внесені до списку в тілі функції, закріплюються, що дозволяє ефективно працювати зі списком навіть за більших обсягів даних. Допустимо, компанія друкує на 3D-принтері моделі, надані користувачем. Проекти зберігаються у списку, а після друку переміщуються до окремого списку. У наступному прикладі наведена реалізація, яка не використовує функції:"],"metadata":{"id":"7Ol6q8Glp76A"}},{"cell_type":"code","source":["# Список моделей, которые необходимо напечатать.\n","unprinted_designs = ['iphone case', 'robot pendant', 'dodecahedron']\n","completed_models = []\n","# Цикл последовательно печатает каждую модель до конца списка.# После печати каждая модель перемещается в список completed_models.\n","while unprinted_designs:\n"," current_design = unprinted_designs.pop()\n"," # Печать модели на 3D-принтере.\n"," print(\"Printing model: \" + current_design)\n"," completed_models.append(current_design)\n","# Вывод всех готовых моделей.\n","print(\"\\nThe following models have been printed:\")\n","for completed_model in completed_models:\n"," print(completed_model)"],"metadata":{"id":"YRzB0d5HpwFg"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":["На початку програми створюється список моделей і порожній список completed_models, який кожна модель переміщається після друку. Поки в unprinted_designs залишаються моделі, цикл, коли імітує друк кожної моделі: модель видаляється з кінця списку, зберігається в current_design, а користувач отримує повідомлення про те, що поточна модель була надрукована. Потім модель переміщується до списку надрукованих. Після завершення циклу виводиться список надрукованих моделей."],"metadata":{"id":"jqTa_alVqFv9"}},{"cell_type":"markdown","source":["Ми можемо змінити структуру цього коду: для цього слід написати дві функції, кожна з яких вирішує одну конкретну задачу. Більшість коду залишиться незмінною; Просто програма стає більш ефективною. Перша функція займається друком, а друга виводить зведення надрукованих моделей:"],"metadata":{"id":"HxMxPok6qOfX"}},{"cell_type":"code","source":["def print_models(unprinted_designs, completed_models):\n"," \"\"\"Имитирует печать моделей, пока список не станет пустым.Каждая модель после печати перемещается вcompleted_models.\"\"\"\n"," while unprinted_designs:\n"," current_design = unprinted_designs.pop()\n"," # Имитация печати модели на 3D-принтере.\n"," print(\"Printing model: \" + current_design)\n"," completed_models.append(current_design)\n","def show_completed_models(completed_models):\n"," \"\"\"Выводит информацию обо всех напечатанных моделях.\"\"\"\n"," print(\"\\nThe following models have been printed:\")\n"," for completed_model in completed_models:\n"," print(completed_model)\n","unprinted_designs = ['iphone case', 'robot pendant', 'dodecahedron']\n","completed_models = []\n","print_models(unprinted_designs, completed_models)\n","show_completed_models(completed_models)"],"metadata":{"id":"8Iqpem5jqGK7"},"execution_count":null,"outputs":[]},{"cell_type":"markdown","source":["### Заборона зміни списку в функції"],"metadata":{"id":"_RpMc7cFueme"}},{"cell_type":"markdown","source":["Іноді потрібно запобігти зміні списку функції. Допустимо, у вас є список моделей для друку, і ви пишете функцію для переміщення їх до списку готових моделей, як у попередньому прикладі. Можливо, навіть після друку всіх моделей, вихідний список потрібно залишити для звітності. Але оскільки всі імена моделей були перенесені зі списку unprinted_designs, залишився тільки порожній список; вихідну версію списку втрачено. Проблему можна вирішити передачею функції копії списку замість оригіналу. У цьому випадку всі зміни, що вносяться функцією до списку, поширюватимуться лише на копію, а оригінал списку залишається незмінним."],"metadata":{"id":"wRjtPoe6ujRs"}},{"cell_type":"code","source":[],"metadata":{"id":"nebDB63zue8r"},"execution_count":null,"outputs":[]}]}