Допълнителни инструкции към функция

Споменахме, че има няколко начина за писане на функции в Python и че функциите, които сме написали и използвали досега, имат най-простата форма. Такива функции са, например, движение (), turn_left (), turn_right (), pick_ball () и drop_ball () от библиотеката Karel, както и функциите back (), take_at_neighboring_square () и go_to_neighboring_nonempty_square (), което ние написахме сами. Всички тези функции изпълняват конкретна работа, винаги по един и същи начин.

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

Функции с параметри

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

Функцията, която движи Karel определен брой квадратчета напред или назад, може да бъде наречена go и може да има един цяло число параметър. Ако този параметър е положителен, Karel ще премести толкова много квадратчета напред, а ако е отрицателен, Karel ще върне съответно (противоположно) число квадратчета назад. Например, обаждането go (5) ще означава “отидете 5 квадрата напред”, докато go (-2) ще означава “върнете 2 квадрата назад”. Ето как можем да напишем такава функция:

Тази функция може да опрости много програми, които трябва да кажат на Karel да се движи няколко пъти по един път в двете посоки. Ето един пример.

Извършване на определени премествания

Karel е разположен на началния квадрат на пътека с достатъчна дължина и трябва да извършва следните измествания на топки:

  • 3 топки от квадрат 3 до квадрат 4

  • 4 топки от квадрат 5 до квадрат 1

При решаването на тази задача ще използваме описаната функция go. За да опростим допълнително решението, можем също да въведем функцията displace, която измества определения брой топки за определен брой квадратчета напред или назад. Това описание показва, че функцията displaceтрябва да има два аргумента.

За да направим по-ясна целта на всеки параметър, ще им дадем имена, които описват тяхната роля:

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

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

Please try loading this page in HTML5 enabled web browsers. All the latest versions of famous browsers such as Internet explorer, Chrome, Firefox, Opera support HTML5.

(Karel_functions__displace_balls)

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

Вземете определен брой топки

Напишете функцията take_up_to(n), която казва на Карел да вземе максимум n топки от квадрата, на който стои. По-точно, ако на площада има n или повече топки, Карел взема n от тях, а ако има по-малко топки, Карел взема колкото може.

Карел, който е на първия квадрат, трябва да вземе до 4 топки от втория квадрат, след това до 2 топки от третия квадрат и до 3 топки от четвъртия квадрат, а след това да донесе всички събрани топки до първия квадрат. Разбира се, функцията take_up_to (n), написана в първата част на задачата, трябва да се използва за тази цел.

Please try loading this page in HTML5 enabled web browsers. All the latest versions of famous browsers such as Internet explorer, Chrome, Firefox, Opera support HTML5.

(Karel_functions__take_balls_up_to)

Шофиране според инструкциите

Дадени са функции face_left_at_intersection() и go_left (n).

  • Функция face_left_at_intersection() позиционира Karel да се изправи срещу първата улица, на която се натъква от лявата страна. При изпълнението на тази функция Карел върви напред, докато не срещне площад, където може да отиде наляво, но всъщност не отива наляво, вместо това остава на кръстовището, обърнат наляво. Ако Карел може да отиде наляво преди повикването на функцията, той няма да се движи от неговия квадрат по време на изпълнението на тази функция, а ще се обърне само вляво;

  • Функцията go_left(n) премества Karel по един квадрат до n-та улица вляво. Ако Карел вече е на кръстопът, улицата вляво от него се отчита като първа;

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

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

Please try loading this page in HTML5 enabled web browsers. All the latest versions of famous browsers such as Internet explorer, Chrome, Firefox, Opera support HTML5.

(Karel_functions__travel_instructions_1)