How to Think Like a Computer Scientist: Learning with Python 2nd Edition. / Как стать программистом: учимся вместе с Python. Второе издание.: Chapter 5 Fruitful functions
| Английский оригинал | Перевод на русский | |
|---|---|---|
Сожалеем, но текст оригинала доступен только зарегистрированным пользователям. |
5.3 Композиция czech 08.07.10 в 04:28 |
|
|
Как мы уже знаем, можно вызвать функцию из другой функции. Эта способность называется композицией. czech 08.07.10 в 04:29 |
||
|
Например, мы можем написать функцию, которая принимает две точки: центра круга и точки на периметре, и вычисляет площадь. czech 08.07.10 в 04:31 |
||
|
Будем считать, что координаты центра хранятся в переменных xc и yc, а координаты точки, лежащей на периметре, будут хранится в переменных xp и yp. Сначала нам нужно вычислить радиус круга, который является расстоянием между двумя заданными точками. К счастью, мы только что написали подобную функцию, так что, все что нам надо, это воспользоваться ей: czech 08.07.10 в 04:35 |
||
|
radius = distance(xc, yc, xp, yp) czech 08.07.10 в 04:35 |
||
|
Вторым шагом будет поиск площади круга с заданным радиусом и возврат значения вычисленной площади. Опять таки воспользуемся ранее написанной функцией: czech 08.07.10 в 04:36 |
||
|
result = area(radius) czech 08.07.10 в 04:36 |
||
|
Обернем это все в функцию: czech 08.07.10 в 04:37 |
||
|
def area2(xc, yc, xp, yp): czech 08.07.10 в 04:37 |
||
|
Мы назвали новую функцию area2, потому как имя area уже занято. В одном модуле каждая функция должна носить уникальное имя. czech 08.07.10 в 04:39 |
||
|
Временные переменные radius и result полезны на стадии разработки и отладки, но когда программа отлажена, мы можем ее скомпановать: czech 08.07.10 в 04:40 |
||
|
def area2(xc, yc, xp, yp): czech 08.07.10 в 04:41 |
||
|
5.4 Булевы функции czech 08.07.10 в 04:41 |
||
|
Функции могут возвращать булевы значения, что часто используется для целей тестирования разрабатываемых функций. Например: czech 08.07.10 в 04:42 |
||
|
def is_divisible(x, y): czech 08.07.10 в 04:43 |
||
|
Имя этой функции - is_divisible. Обычно подобным булевым функциям дают имена, звучащие как вопросы, на которые нужно отвечать да или нет. Функция is_divisible возвращает истину или ложь в зависимости от того, делится ли x на y или нет. czech 10.07.10 в 06:56 |
||
|
Мы можем сделать функцию более компактной, приняв во внимание тот факт, что условие в операции if само по себе является булевым выражением. Мы можем вернуть значение напрямую, исключив выражение if: czech 10.07.10 в 07:00 |
||
|
def is_divisible(x, y): czech 10.07.10 в 07:00 |
||
|
Следующие примеры показывают функцию в действии: czech 10.07.10 в 07:00 |
||
|
>>> is_divisible(6, 4) False czech 10.07.10 в 07:02 |
||
|
Булевы функции чаще используют в условных операциях: czech 10.07.10 в 07:03 |
||
|
if is_divisible(x, y): czech 10.07.10 в 07:03 |
||
|
Можно, конечно, написать так: czech 10.07.10 в 07:05 |
||
|
if is_divisible(x, y) == True: czech 10.07.10 в 07:05 |
||
|
но это излишне. czech 10.07.10 в 07:05 |
||
|
5.5 Тип функция czech 10.07.10 в 07:06 |
||
|
Функция - это еще один тип в python в добавок к int, float, str, bool и NoneType. czech 10.07.10 в 07:07 |
||
|
>>> def func(): czech 10.07.10 в 07:08 |
||
|
Как и другие типы, функция может передвататься в качестве аргумента в другую функцию: czech 10.07.10 в 07:09 |
||
|
def f(n): czech 10.07.10 в 07:09 |
||
|
def g(n): czech 10.07.10 в 07:09 |
||
|
def h(n): czech 10.07.10 в 07:10 |
||
|
def doto(value, func): czech 10.07.10 в 07:10 |
||
|
print doto(7, f) czech 10.07.10 в 07:11 |
||
|
Функция doto вызывается три раза. 7 - аргумент value, а функции f, g и h - аргументы func. На выходе скрипта получим: czech 10.07.10 в 07:12 |
||
|
15 czech 10.07.10 в 07:12 |
||
|
Пример, конечно, немного надуман, но вскоре мы увидим, какую пользу можно извлечь от таких комбинаций. czech 10.07.10 в 07:16 |
||
|
5.6 Программирование со стилем czech 10.07.10 в 07:19 |
||
|
Удобочитаемость является очень важным параметром, на практике читать и модифицировать программы приходится гораздо чаще, чем писать. Все примеры в этой книге соответствуют Предложению по расширению python 8 (PEP 8), руговодству по стилю разработки в сообществе python. czech 10.07.10 в 07:23 |
||
|
Мы будем больше говорить о стиле, когда наши программы станут более сложными, но несколько пунктом можно озвучить уже сейчас: czech 10.07.10 в 07:25 |
||
|
- используйте 4 пробела для отступов czech 10.07.10 в 07:29 |
||
|
5.7 Тройные кавычки czech 10.07.10 в 07:29 |
||
|
В добавок к одиночным и двойным кавычкам, с которыми мы познакомились раньше, python также работает с тройными кавычками: czech 10.07.10 в 07:31 |
||
|
>>> type("""This is a triple quoted string using 3 double quotes.""") czech 10.07.10 в 07:32 |
||
|
Тройные кавычки внутри себя могут содержать текст как с двойными так и одинарными кавычками: czech 10.07.10 в 07:33 |
||
|
>>> print '''"Oh no", she exclaimed, "Ben's bike is broken!"''' czech 10.07.10 в 07:33 |
||
|
Наконец, тройные кавычки могут содержать многострочный текст: czech 10.07.10 в 07:35 |
||
|
>>> message = """This message will czech 10.07.10 в 07:35 |
||
|
5.8 Unit-тесты с doctest czech 10.07.10 в 07:37 |
||
|
В наше время наилучшей практикой в разработке программ является включение автоматических unit-тестов в исходный код. Unit-тестирование подразумевает автоматическю проверку отдельных участков кода, таких как функции, на работоспособность. Становится возможным следить за поведением функции при изменениях кода как внутри нее, так и в самой программе. czech 10.07.10 в 07:41 |
