How to Think Like a Computer Scientist: Learning with Python 2nd Edition. / Как стать программистом: учимся вместе с Python. Второе издание.: Chapter 5 Fruitful functions
| Английский оригинал | Перевод на русский | |
|---|---|---|
Сожалеем, но текст оригинала доступен только зарегистрированным пользователям. |
5 Плодотворные функции czech 08.07.10 в 01:10 |
|
|
5.1 Возврат значений czech 08.07.10 в 01:10 |
||
|
Встроенные функции, которые мы использовали, такие как abs, pow и max возвращают значения. Вызов любой из этих функций создает новое значение, которое обычно связывается с переменной, участвующей в выражении. czech 08.07.10 в 01:12 |
||
|
biggest = max(3, 7, 2, 5) czech 08.07.10 в 01:12 |
||
|
Но из тех функций, что написали мы, ни одна не возвращала значений. czech 08.07.10 в 01:19 |
||
|
В этой главе мы будем писать функции, которые возвращают значения. Назовем их плодотворными функциями, потому что это неплохо звучит. Первым примером будет функция area возвращающая площадь круга по его радиусу: czech 08.07.10 в 01:22 |
||
|
def area(radius): czech 08.07.10 в 01:22 |
||
|
Мы видели работу выражения return и раньше, но в плодотворных функциях это выражение включает возвращаемое значение. Это выражение означает: немедленно выйти из функции и вернуть из нее вычисленное значение. Приведенный пример немного усложнен, можно его немного упростить: czech 08.07.10 в 01:53 |
||
|
def area(radius): czech 08.07.10 в 01:53 |
||
|
С другой стороны, временные переменные типа temp могут упростить процесс отладки. czech 08.07.10 в 01:54 |
||
|
Иногда бывает полезно использовать несколько выражений return в каждой ветви вычислений. Мы уже работали со встроенной функцией abs, теперь попробуем написать свой аналог: czech 08.07.10 в 01:55 |
||
|
def absolute_value(x): czech 08.07.10 в 01:56 |
||
|
В этом коде только одно из выражений return будет выполнено. Как только одно из них сработает, вычисление функции прервется, без далнейшей обработки последующий инструкций. czech 08.07.10 в 01:58 |
||
|
По другому эту функцию можно написать, исключив операцию else: czech 08.07.10 в 01:59 |
||
|
def absolute_value(x): czech 08.07.10 в 02:00 |
||
|
Эти две функции работают совершенно одинаково. czech 08.07.10 в 02:01 |
||
|
Код, написанный после выражения return никогда не будет вычислен; его назывют мертвым кодом. czech 08.07.10 в 02:02 |
||
|
В плодотворных функциях необходимо учитывать все возможные варианты возвращаемых значений. В следующем коде учтено не все: czech 08.07.10 в 02:06 |
||
|
def absolute_value(x): czech 08.07.10 в 02:07 |
||
|
Эта версия не корректна, потому что не предусмотрен вариант проверки нуля. В этом случае функция вернет специальное значение None. czech 08.07.10 в 02:08 |
||
|
>>> print absolute_value(0) czech 08.07.10 в 02:08 |
||
|
None - это уникальное значение с типом данных NoneType. czech 08.07.10 в 02:09 |
||
|
>>> type(None) czech 08.07.10 в 02:09 |
||
|
В python все функции возвращают None, если явно не возвращают другое значение. czech 08.07.10 в 02:10 |
||
|
5.2 Разработка программы czech 08.07.10 в 02:10 |
||
|
На данном этапе, мы уже способны, посмотрев на законченную функцию, сказать, что она делает. Еще, если мы усердо делали все упражнения, мы можем написать свои небольшие функции. Если вы приступите к написанию больших функций, вы можете столкнутся с некоторыми трудностями в лице ошибок выполнения и семантических ошибок. czech 08.07.10 в 02:13 |
||
|
Для того, чтобы приступить к написанию более сложных программ, мы рассмотрим одну из техник, которая называется инкрементной (пошаговой) разработкой. Смысл пошаговой разработки - это добавление к программе небольших кусков кода и их постоянное тестирование. czech 08.07.10 в 02:16 |
||
|
Для примера, допустим, что нам нужно найти расстояние между двумя точками с координатами (x1, y1) и (x2, y2). Расстояние вычисляется по теореме Пифагора. czech 08.07.10 в 02:18 |
||
|
Первым шагом будет представление математической функции в окружении python. Другими словами, какие параметры нужно будет ввести, и что получить на выходе. czech 08.07.10 в 02:20 |
||
|
В этом случае, две точки - это ввод, представленные четырьмя параметрами. Возвращаемое значение - это расстояние, дробное число. czech 08.07.10 в 02:22 |
||
|
Мы готовы написать каркас функции: czech 08.07.10 в 02:22 |
||
|
def distance(x1, y1, x2, y2): czech 08.07.10 в 02:23 |
||
|
Понятно, что на данном этапе наша функция расстояния не вычислит; она всегда будет возвращать 0.0. Но синтаксически все написано верно, что означает, мы можем ее протестировать, прежде чем приступать к следующему шагу. czech 08.07.10 в 02:24 |
||
|
Для тестирования функции, вызовем ее с простыми параметрами: czech 08.07.10 в 02:25 |
||
|
>>> distance(1, 2, 4, 6) czech 08.07.10 в 02:25 |
||
|
Для наших параметров, горизонтальное расстояние будет равно 3, вертикальное - 4, а расстояние между точками - 5 (гипотинуза треугольника 3-4-5). Когда запускаете функцию на тестирование, лучше знать правильный ответ. czech 08.07.10 в 02:28 |
||
|
Протестировав функцию, мы убедились, что она синтаксически верна. Теперь мы можем приступисть к заполнению тела функции. После каждого шага мы будем вновь тестировать функцию. Если возникнет ошибка, мы будем знать где она скрывается - в последних добавленных строках. czech 08.07.10 в 02:30 |
||
|
Логически, на втором этапе нужно найти разницу между координатами x2-x1 и y2-y1. Мы сохраним результаты во временных переменных dx и dy и выведем их на экран. czech 08.07.10 в 02:36 |
||
|
def distance(x1, y1, x2, y2): czech 08.07.10 в 02:37 |
||
|
Если функция работает, на экране мы увидим числа 3 и 4. Зная ответ, мы можем предположить, что функция приняла параметры и правильно выполнила свои операции. Если ответы не совпадают, нам нужно разобраться в работе всего пары строк. czech 08.07.10 в 02:50 |
||
|
Далее, вычислим сумму квадратов dx и dy: czech 08.07.10 в 02:51 |
||
|
def distance(x1, y1, x2, y2): czech 08.07.10 в 02:51 |
||
|
Обратите внимание, что мы стерли выражения print с прошлого шага. Код такого типа назвается строительными лесами, потому что помогает в построении программы, но не нужен в финальной ее реадизации. czech 08.07.10 в 02:53 |
||
|
Мы опять запускаем программу и смотрим, что получилось. Должно получиться 25. czech 08.07.10 в 02:54 |
||
|
Наконец, воспользовавшись возведением в степень 0.5, найдем квадратный корень из полученной суммы квадратов: czech 08.07.10 в 02:55 |
||
|
def distance(x1, y1, x2, y2): czech 08.07.10 в 02:56 |
||
|
Если все работает нормально, наша работа завершена. С другой стороны, нам может понадобится вывести полученный результат прежде чем возвращать его. czech 08.07.10 в 02:57 |
||
|
Когда мы только начинали, мы добавляли по одной-две строки за раз. Когда вы наберетесь опыта, подберете сами для себя объем кода, который будете вводить и отлаживать за один шаг. В любом случае, пошаговая разработка способна сильно сократить время отладки программы. czech 08.07.10 в 03:00 |
||
|
Ключевые аспекты метода: czech 08.07.10 в 03:01 |
||
|
Начните с работающего кода и вносите в него незначительные изменения. На любом этапе, если возникнет ошибка, вы будете знать, где именно она находится. Используйте временные переменные, для хранения промежуточных данных, чтобы их можно было вывести на экран и проверить. Из рабочего кода можно удалить все вспомогательные выражения (строительные леса), а простые выражения объединить в составные, но только в том случае, если это не усложнит чтение и понимание программы. czech 08.07.10 в 03:05 |
