How to Think Like a Computer Scientist: Learning with Python 2nd Edition. / Как стать программистом: учимся вместе с Python. Второе издание.: Chapter 5 Fruitful functions

← →
Английский оригинал Перевод на русский

Сожалеем, но текст оригинала доступен только зарегистрированным пользователям.

5 Плодотворные функции

czech 08.07.10 в 01:10

0

5.1 Возврат значений

czech 08.07.10 в 01:10

0

Встроенные функции, которые мы использовали, такие как abs, pow и max возвращают значения. Вызов любой из этих функций создает новое значение, которое обычно связывается с переменной, участвующей в выражении.

czech 08.07.10 в 01:12

0

biggest = max(3, 7, 2, 5)
x = abs(3 - 11) + 10

czech 08.07.10 в 01:12

0

Но из тех функций, что написали мы, ни одна не возвращала значений.

czech 08.07.10 в 01:19

0

В этой главе мы будем писать функции, которые возвращают значения. Назовем их плодотворными функциями, потому что это неплохо звучит. Первым примером будет функция area возвращающая площадь круга по его радиусу:

czech 08.07.10 в 01:22

0

def area(radius):
    temp = 3.14159 * radius**2
    return temp

czech 08.07.10 в 01:22

0

Мы видели работу выражения return и раньше, но в плодотворных функциях это выражение включает возвращаемое значение. Это выражение означает: немедленно выйти из функции и вернуть из нее вычисленное значение. Приведенный пример немного усложнен, можно его немного упростить:

czech 08.07.10 в 01:53

0

def area(radius):
    return 3.14159 * radius**2

czech 08.07.10 в 01:53

0

С другой стороны, временные переменные типа temp могут упростить процесс отладки.

czech 08.07.10 в 01:54

0

Иногда бывает полезно использовать несколько выражений return в каждой ветви вычислений. Мы уже работали со встроенной функцией abs, теперь попробуем написать свой аналог:

czech 08.07.10 в 01:55

0

def absolute_value(x):
    if x < 0:
        return -x
    else:
        return x

czech 08.07.10 в 01:56

0

В этом коде только одно из выражений return будет выполнено. Как только одно из них сработает, вычисление функции прервется, без далнейшей обработки последующий инструкций.

czech 08.07.10 в 01:58

0

По другому эту функцию можно написать, исключив операцию else:

czech 08.07.10 в 01:59

0

def absolute_value(x):
    if x < 0:
        return -x
    return x

czech 08.07.10 в 02:00

0

Эти две функции работают совершенно одинаково.

czech 08.07.10 в 02:01

0

Код, написанный после выражения return никогда не будет вычислен; его назывют мертвым кодом.

czech 08.07.10 в 02:02

0

В плодотворных функциях необходимо учитывать все возможные варианты возвращаемых значений. В следующем коде учтено не все:

czech 08.07.10 в 02:06

0

def absolute_value(x):
    if x < 0:
        return -x
    elif x > 0:
        return x

czech 08.07.10 в 02:07

0

Эта версия не корректна, потому что не предусмотрен вариант проверки нуля. В этом случае функция вернет специальное значение None.

czech 08.07.10 в 02:08

0

>>> print absolute_value(0)
None

czech 08.07.10 в 02:08

0

None - это уникальное значение с типом данных NoneType.

czech 08.07.10 в 02:09

0

>>> type(None)

czech 08.07.10 в 02:09

0

В python все функции возвращают None, если явно не возвращают другое значение.

czech 08.07.10 в 02:10

0

5.2 Разработка программы

czech 08.07.10 в 02:10

0

На данном этапе, мы уже способны, посмотрев на законченную функцию, сказать, что она делает. Еще, если мы усердо делали все упражнения, мы можем написать свои небольшие функции. Если вы приступите к написанию больших функций, вы можете столкнутся с некоторыми трудностями в лице ошибок выполнения и семантических ошибок.

czech 08.07.10 в 02:13

0

Для того, чтобы приступить к написанию более сложных программ, мы рассмотрим одну из техник, которая называется инкрементной (пошаговой) разработкой. Смысл пошаговой разработки - это добавление к программе небольших кусков кода и их постоянное тестирование.

czech 08.07.10 в 02:16

0

Для примера, допустим, что нам нужно найти расстояние между двумя точками с координатами (x1, y1) и (x2, y2). Расстояние вычисляется по теореме Пифагора.

czech 08.07.10 в 02:18

0

Первым шагом будет представление математической функции в окружении python. Другими словами, какие параметры нужно будет ввести, и что получить на выходе.

czech 08.07.10 в 02:20

0

В этом случае, две точки - это ввод, представленные четырьмя параметрами. Возвращаемое значение - это расстояние, дробное число.

czech 08.07.10 в 02:22

0

Мы готовы написать каркас функции:

czech 08.07.10 в 02:22

0

def distance(x1, y1, x2, y2):
    return 0.0

czech 08.07.10 в 02:23

0

Понятно, что на данном этапе наша функция расстояния не вычислит; она всегда будет возвращать 0.0. Но синтаксически все написано верно, что означает, мы можем ее протестировать, прежде чем приступать к следующему шагу.

czech 08.07.10 в 02:24

0

Для тестирования функции, вызовем ее с простыми параметрами:

czech 08.07.10 в 02:25

0

>>> distance(1, 2, 4, 6)
0.0

czech 08.07.10 в 02:25

0

Для наших параметров, горизонтальное расстояние будет равно 3, вертикальное - 4, а расстояние между точками - 5 (гипотинуза треугольника 3-4-5). Когда запускаете функцию на тестирование, лучше знать правильный ответ.

czech 08.07.10 в 02:28

0

Протестировав функцию, мы убедились, что она синтаксически верна. Теперь мы можем приступисть к заполнению тела функции. После каждого шага мы будем вновь тестировать функцию. Если возникнет ошибка, мы будем знать где она скрывается - в последних добавленных строках.

czech 08.07.10 в 02:30

0

Логически, на втором этапе нужно найти разницу между координатами x2-x1 и y2-y1. Мы сохраним результаты во временных переменных dx и dy и выведем их на экран.

czech 08.07.10 в 02:36

0

def distance(x1, y1, x2, y2):
    dx = x2 - x1
    dy = y2 - y1
    print "dx is", dx
    print "dy is", dy
    return 0.0

czech 08.07.10 в 02:37

0

Если функция работает, на экране мы увидим числа 3 и 4. Зная ответ, мы можем предположить, что функция приняла параметры и правильно выполнила свои операции. Если ответы не совпадают, нам нужно разобраться в работе всего пары строк.

czech 08.07.10 в 02:50

0

Далее, вычислим сумму квадратов dx и dy:

czech 08.07.10 в 02:51

0

def distance(x1, y1, x2, y2):
    dx = x2 - x1
    dy = y2 - y1
    dsquared = dx**2 + dy**2
    print "dsquared is: ", dsquared
    return 0.0

czech 08.07.10 в 02:51

0

Обратите внимание, что мы стерли выражения print с прошлого шага. Код такого типа назвается строительными лесами, потому что помогает в построении программы, но не нужен в финальной ее реадизации.

czech 08.07.10 в 02:53

0

Мы опять запускаем программу и смотрим, что получилось. Должно получиться 25.

czech 08.07.10 в 02:54

0

Наконец, воспользовавшись возведением в степень 0.5, найдем квадратный корень из полученной суммы квадратов:

czech 08.07.10 в 02:55

0

def distance(x1, y1, x2, y2):
    dx = x2 - x1
    dy = y2 - y1
    dsquared = dx**2 + dy**2
    result = dsquared**0.5
    return result

czech 08.07.10 в 02:56

0

Если все работает нормально, наша работа завершена. С другой стороны, нам может понадобится вывести полученный результат прежде чем возвращать его.

czech 08.07.10 в 02:57

0

Когда мы только начинали, мы добавляли по одной-две строки за раз. Когда вы наберетесь опыта, подберете сами для себя объем кода, который будете вводить и отлаживать за один шаг. В любом случае, пошаговая разработка способна сильно сократить время отладки программы.

czech 08.07.10 в 03:00

0

Ключевые аспекты метода:

czech 08.07.10 в 03:01

0

Начните с работающего кода и вносите в него незначительные изменения. На любом этапе, если возникнет ошибка, вы будете знать, где именно она находится. Используйте временные переменные, для хранения промежуточных данных, чтобы их можно было вывести на экран и проверить. Из рабочего кода можно удалить все вспомогательные выражения (строительные леса), а простые выражения объединить в составные, но только в том случае, если это не усложнит чтение и понимание программы.

czech 08.07.10 в 03:05

0
Минутку...

Следующая страница →