Дефиниране на функции

В частта, посветена на управлението на Карел, споменахме, че можем да отделим група от команди в отделна единица, наречена функция. Нека си припомним как изглежда функция, написана в Python:

Следните правила важат за функциите за писане в Python:

Правила за писане на функции:

  • Дефиницията на функцията започва с думата def, последвана от името на функцията, след това списък на аргументи в скоби и ‘’:’’ знак (двоеточие) в края на реда.

  • Всяко правилно написано име може да се появи като име на функция (правилата са същите като за имената на променливи).

  • Празен списък (нищо) може да се появи като аргумент argument_list ако функцията не използва аргументи или един или повече аргументи, разделени със запетая.

  • Всички операции на Python могат да се появят във функционалното тяло (statement_1,… statement_k). Тези команди се пишат с отстъпи по отношение на реда, съдържащ името на функцията и аргументите.

Функциите могат или не могат да върнат някаква стойност. Досега имахме възможност да видим и двата типа функции. Например функциите, чрез които Карел (роботът) се движи напред, обръща се, вдига и оставя топки, всички функции, не връщат никаква стойност. От друга страна, математически функции като abs или round, както и функции за проверка дали Карел има топки със себе си, дали има някакви топки на квадрата или дали Карел може да върви напред са функции, които връщат стойност.

Функции за писане, които връщат стойност

За да може една функция да върне стойност, е необходимо да посочите оператора return поне веднъж в тялото на функцията. Декларацията за връщане се състои от думата return, следвана от израз, чиято стойност функцията е да върне.

return може да се появи на няколко места във функция (обикновено с различни стойности) и трябва да бъде посочена в края на функционното тяло. Функцията abs, ако не беше вградена, можеше да бъде дефинирана по следния начин:

Функцията може да върне повече от една стойност. Една такава функция е вградената функция divmod, която връща две числа - резултат от целочислено деление и напомняне. Използваме функцията divmod, както правим с функции, които връщат една стойност, ние поставяме само върнатите стойности в множество променливи:

Когато пишем функции, които връщат множество стойности, е достатъчно да посочим стойностите, разделени със запетая след думата return. Ако сами трябва да определим вградената функция divmod, бихме могли да я напишем така:

Пример

Example - painting:

За боядисване на \(1m^{2}\) стени са необходими около \(0.5kg\) боя. Напишете функция, която приема следните 4 аргумента:

  • дължината на стаята

  • ширината на стаята

  • височината на стаята

  • дължина, която не се боядисва (обща ширина на вратите, прозорците, килерите и т.н.)

Функцията трябва да връща количеството боя (в килограми), необходимо за боядисване на стените и таваните.

След функцията напишете програма, която зарежда данните за 5 различни стаи и след това с помощта на написаната функция изчислява и отпечатва общото количество боя, необходимо за боядисване на всичките пет стаи.

Задачи за упражнения:

Задача - географски координати в GPS формат

Намерихте стара карта на погребаното съкровище и прочетохте координатите на съкровището в градуси, минути и секунди. Вашето GPS устройство обаче поддържа само географски координати в градуси като реални числа.

Напишете програма, която за дадена координата в градуси, минути и секунди отпечатва реален брой градуси.

Програмата е почти изцяло написана. Трябва да се добави израз, за да се изчисли реалният брой градуси. За да преобразуваме минути в градуси, ги разделяме по \(60\), и преобразуваме секундите в градуси, като делим на \(60 \cdot 60 = 3600\).

Задача - Географски координати във формата на старата карта

След като разбрахте, че старата карта от предишното задание е шега, решихте да направите подобна шега на някого. Избрали сте местоположение наблизо и четете координати от вашето GPS устройство. Сега трябва да конвертирате координатите от устройството в реални градуси в цели градуси, цели минути и закръглени секунди, за да създадете правилна “стара” карта.

     Завършете стартираната програма, която извършва това преобразуване.

Задача - водопроводчик:

Майк е водопроводчик и има планирани три интервенции за днес. За всяка интервенция Майк ще записва кога е започнала и кога е приключила. Въз основа на тази информация трябва да се изчисли колко време е прекарал Майк в интервенциите.

Дадена е частично написана програма, която зарежда началното и крайното време в часове и минути за всяка намеса на Майк и след това определя и отпечатва общата продължителност на всички интервенции.

Завършете програмата като напишете функцията за продължителност(h1, m1, h2, m2) която изчислява колко изминали минути от h1 часа и минути до h2 часа и m2 минути.

Функции, които не връщат стойност

Функциите, които не връщат стойност, просто вършат някаква работа и ние ги използваме като команди. Такива бяха например функциите back() или take_at_neighboring_square(), които написахме в раздела, посветен на управлението на Karel. Нека да разгледаме пример за такава функция в програма с текстов интерфейс.

Пример - транспорт:

Отнема съответно 55, 35, 40 и 20 минути на членовете на четиричленно семейство, за да се приберат вкъщи от мястото, където са, при условие че започнат да се прибират преди 16:00. В противен случай им трябват още 15 минути.

Напишете програма, която зарежда часана отпътуване в часове и минути за всеки член на семейството и посочва часа на пристигане у дома.

Функцията process_family_member изпълнява всички необходими действия за един член на семейството: зарежда времето за отпътуване, отколкото въз основа на времето на отпътуване, ако е необходимо, удължава продължителността на пътуването, след това изчислява и отпечатва времето на пристигане у дома. В основната програма тази функция просто се извиква за всеки член на семейството.

Задачи за упражнения:

Задача - отстъпка:

Един производител предлага стоки на цена от 10 евро на брой, а за поръчки от 50 или повече бройки се отпуска 10% отстъпка. Няколко купувачи обявиха, че идват да купуват определен брой парчета. Имената на клиентите и количествата, заявени са дадени в началото на програмата.

Напишете функция, която за даденото име на клиента и количеството стоки отпечатва колко трябва да плати този клиент.

Името на клиента се предава на функцията тук само за печат. Цената на стоки се изчислява въз основа на количеството, което се предава на функцията като втори аргумент

Задача - текст подчертаване:

Напишете функцията за подчертаване underline(text).

Съвет: Функцията underline трябва да съдържа само два print оператора. Първото изявление трябва да отпечата дадения текст, а второто - да отпечата реда. Можете да получите низ, съдържащ ред, като умножите низ '-' по дължината на дадения низ.


Накрая, нека споменем някои от предимствата на писането на функции, които поради краткостта на нашите примери и задачи не можеха да излязат на преден план:

  • Функциите в дългите програми често се използват, за да разложат в основната част на програмата и да я направят по-кратка и лесна за разбиране. Нашите програми не са толкова дълги, за да е необходимо да ги разложим, но показват как би могло да се направи с по-дълги програми.

  • Функциите могат да помогнат да се избегне повтарянето на същия или подобен код в програмите. Повтарянето на кода трябва да се избягва, тъй като такъв код е по-трудно да се поддържа - всяка промяна трябва да се направи на няколко места, което е досадно и вероятността загрешки е по-голяма.

  • Когато пишем функции, ние даваме възможност на други да използват части от кода ни по-лесно. Функциите, които пишем, могат да бъдат извлечени в отделен модул, който другите хора могат лесно да включат в своите програми.

  • За много големи програми, формирането на функции позволява на програмата да бъде разделена на няколко файла, вместо на един огромен и неразбираем файл.