К сожалению, у нас пока нет особых поводов для радости.
Себастьян говорит, что пройдет еще несколько лет, прежде чем у меня появится
свой собственный беспилотный автомобиль, но главная проблема в том,
что мы еще не поговорили о том, как использовать процедуры.
Мы всего лишь научились создавать их; пока мы не сможем их использовать,
у нас не будет веской причины для радости.
Мы вскоре научимся ими пользоваться и снова сможем широченно улыбаться.
А сейчас мы собственно и узнаем, как использовать процедуру.
Для этого нам понадобится <имя процедуры>, за которым следует
открывающая скобка и список <входных данных>.
В принципе их может быть сколько угодно, но их количество должно совпадать с
тем, что ожидает процедура.
Эти входные данные иногда называются «операндами».
А иногда – «аргументами».
Мы не будем спорить, что правильнее.
Мы просто будем называть их входными данными.
Вообще-то вы уже использовали похожую запись.
Еще в разделе 1 вы узнали, как использовать метод find() строковых переменных.
В find() передаются один или два входа.
Первый – это строка.
Строка, которую вы ищете – это первый параметр,
а необязательный второй – это целое число, позиция, с которой нужно начать
поиск данной строки.
В лекциях раздела 1 мы нашли множество применений методу find(), а вы закрепили эти знания,
выполняя домашнюю работу.
find() слегка отличается от процедур, которые вы определяете самостоятельно.
Во-первых, он встроен в язык.
Во-вторых, помимо уже упомянутых, у нас есть
еще один вход – вот этот.
У нас есть строка, в которой мы осуществляем поиск – к примеру,
переменная page – которая по сути является просто еще одним входом.
Позже мы поговорим о том, чем отличается такая запись, но в целом она
очень похожа на вызов процедуры, у которой один параметр находится здесь,
а остальные два – вот здесь.
Есть и отличия, но в этом разделе мы не будем на них останавливаться,
однако в дальнейшем вы узнаете, что на самом деле происходит при вызове метода.
У процедур, которые вы объявляете самостоятельно, нет
объекта, от имени которого они вызываются.
Есть только сама процедура и ее аргументы, или операнды, или входы –
как вам больше нравится – которые передаются в нее.
Посмотрим, как это работает, на примере простой процедуры.
Я определю процедуру rest_of_string(), и мы снабдим ее
параметром s; это значит, что у нее один вход и мы будем обращаться к
его значению через имя s.
Мы заставим ее возвращать все символы строки от первой [не нулевой!] позиции до ее конца.
Для этого мы будем использовать оператор индексации строк – return s[1:].
Это даст нам ту же строку без первой буквы, то есть все символы
от позиции 1 до конца строки.
Вот их мы и вернем.
Итак, на выходе rest_of_string() будет новая строка, начинающаяся
со второй буквы входной строки.
Вот пример использования этой процедуры.
Мы можем вызвать ее напрямую.
Мы можем написать print rest_of_string.
Это наша процедура.
Теперь нужно поставить открывающую скобку и передать в нее входное значение.
У rest_of_string() один параметр, так что нам понадобится передать в нее
одно значение, и оно должно быть строкой.
Мы передадим в процедуру строку 'audacity'.
Когда мы вызываем процедуру, контроль переходит
к телу процедуры.
Мы можем представить, что сейчас делает интерпретатор.
Вместо выполнения кода, интерпретатор сделает переход.
Когда мы вызовем процедуру, он перейдет к выполнению кода внутри нее.
Он присвоит параметрам поданные на вход значения.
Мы можем представить это как операцию присваивания, которая присваивает s
переданное в процедуру входное значение.
Теперь нам нужно выполнить тело процедуры.
В данном случае оно состоит из одной команды – вот этой команды return.
Нам нужно вычислить это значение, s[1:].
Оно будет равно строке 'udacity'.
Теперь перехойдем к команде return.
return означает, что мы переходим обратно.
Мы возвращаемся к месту вызова процедуры, но уже
с его результатом.
Когда мы переходим обратно, значение вызова становится равным значению,
которое мы вернули.
В данном случае это строка 'udacity'.
Итак, у нас пока нет собственной машины-беспилотника,
но теперь вы умеете определять и использовать процедуры.
Это очень мощная концепция.
Все, чем мы будем заниматься в рамках этого курса, как и деятельность
практически любого компьютерного программиста сводится к определению
процедур и их использованию.
А теперь у нас должна появиться широкая улыбка.
Мы можем думать о процедурах как о коде, преобразующем входные данные в выходные.
Мы также можем думать о людях как о существах, занимающихся тем же самым.
У нас есть входные значения, поступающие через глаза, через
рот – наверное, даже через нос.
Я не буду пытаться изобразить выходные данные человека-процедуры, но раз уж
процедуры играют настолько важную роль, мы посвятим им несколько
следующих заданий, чтобы убедиться, что вы хорошо их понимаете.