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

0

Как мы уже знаем, можно вызвать функцию из другой функции. Эта способность называется композицией.

czech 08.07.10 в 04:29

0

Например, мы можем написать функцию, которая принимает две точки: центра круга и точки на периметре, и вычисляет площадь.

czech 08.07.10 в 04:31

0

Будем считать, что координаты центра хранятся в переменных xc и yc, а координаты точки, лежащей на периметре, будут хранится в переменных xp и yp. Сначала нам нужно вычислить радиус круга, который является расстоянием между двумя заданными точками. К счастью, мы только что написали подобную функцию, так что, все что нам надо, это воспользоваться ей:

czech 08.07.10 в 04:35

0

radius = distance(xc, yc, xp, yp)

czech 08.07.10 в 04:35

0

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

czech 08.07.10 в 04:36

0

result = area(radius)
return result

czech 08.07.10 в 04:36

0

Обернем это все в функцию:

czech 08.07.10 в 04:37

0

def area2(xc, yc, xp, yp):
    radius = distance(xc, yc, xp, yp)
    result = area(radius)
    return result

czech 08.07.10 в 04:37

0

Мы назвали новую функцию area2, потому как имя area уже занято. В одном модуле каждая функция должна носить уникальное имя.

czech 08.07.10 в 04:39

0

Временные переменные radius и result полезны на стадии разработки и отладки, но когда программа отлажена, мы можем ее скомпановать:

czech 08.07.10 в 04:40

0

def area2(xc, yc, xp, yp):
    return area(distance(xc, yc, xp, yp))

czech 08.07.10 в 04:41

0

5.4 Булевы функции

czech 08.07.10 в 04:41

0

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

czech 08.07.10 в 04:42

0

def is_divisible(x, y):
    if x % y == 0:
        return True
    else:
        return False

czech 08.07.10 в 04:43

0

Имя этой функции - is_divisible. Обычно подобным булевым функциям дают имена, звучащие как вопросы, на которые нужно отвечать да или нет. Функция is_divisible возвращает истину или ложь в зависимости от того, делится ли x на y или нет.

czech 10.07.10 в 06:56

0

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

czech 10.07.10 в 07:00

0

def is_divisible(x, y):
    return x % y == 0

czech 10.07.10 в 07:00

0

Следующие примеры показывают функцию в действии:

czech 10.07.10 в 07:00

0

>>> is_divisible(6, 4) False
>>> is_divisible(6, 3) True

czech 10.07.10 в 07:02

0

Булевы функции чаще используют в условных операциях:

czech 10.07.10 в 07:03

0

if is_divisible(x, y):
    print "x is divisible by y"
else:
    print "x is not divisible by y"

czech 10.07.10 в 07:03

0

Можно, конечно, написать так:

czech 10.07.10 в 07:05

0

if is_divisible(x, y) == True:

czech 10.07.10 в 07:05

0

но это излишне.

czech 10.07.10 в 07:05

0

5.5 Тип функция

czech 10.07.10 в 07:06

0

Функция - это еще один тип в python в добавок к int, float, str, bool и NoneType.

czech 10.07.10 в 07:07

0

>>> def func():
... return "function func was called..."
...
>>> type(func) <type 'function'>
>>>

czech 10.07.10 в 07:08

0

Как и другие типы, функция может передвататься в качестве аргумента в другую функцию:

czech 10.07.10 в 07:09

0

def f(n):
    return 3*n - 6

czech 10.07.10 в 07:09

0

def g(n):
    return 5*n + 2

czech 10.07.10 в 07:09

0

def h(n):
    return -2*n + 17

czech 10.07.10 в 07:10

0

def doto(value, func):
    return func(value)

czech 10.07.10 в 07:10

0

print doto(7, f)
print doto(7, g)
print doto(7, h)

czech 10.07.10 в 07:11

0

Функция doto вызывается три раза. 7 - аргумент value, а функции f, g и h - аргументы func. На выходе скрипта получим:

czech 10.07.10 в 07:12

0

15
37
3

czech 10.07.10 в 07:12

0

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

czech 10.07.10 в 07:16

0

5.6 Программирование со стилем

czech 10.07.10 в 07:19

0

Удобочитаемость является очень важным параметром, на практике читать и модифицировать программы приходится гораздо чаще, чем писать. Все примеры в этой книге соответствуют Предложению по расширению python 8 (PEP 8), руговодству по стилю разработки в сообществе python.

czech 10.07.10 в 07:23

0

Мы будем больше говорить о стиле, когда наши программы станут более сложными, но несколько пунктом можно озвучить уже сейчас:

czech 10.07.10 в 07:25

0

- используйте 4 пробела для отступов
- импорт функций должен происходить в начале скрипта
- отделяете объявление функции двумя пустыми строками
- объявления функций должны находиться в одном месте в начале скрипта
- держите вместе выражения импорта функций, вызова функций

czech 10.07.10 в 07:29

0

5.7 Тройные кавычки

czech 10.07.10 в 07:29

0

В добавок к одиночным и двойным кавычкам, с которыми мы познакомились раньше, python также работает с тройными кавычками:

czech 10.07.10 в 07:31

0

>>> type("""This is a triple quoted string using 3 double quotes.""")
<type 'str'>
>>> type('''This triple quoted strings uses 3 single quotes.''')
<type 'str'>
>>>

czech 10.07.10 в 07:32

0

Тройные кавычки внутри себя могут содержать текст как с двойными так и одинарными кавычками:

czech 10.07.10 в 07:33

0

>>> print '''"Oh no", she exclaimed, "Ben's bike is broken!"'''
"Oh no", she exclaimed, "Ben's bike is broken!"
>>>

czech 10.07.10 в 07:33

0

Наконец, тройные кавычки могут содержать многострочный текст:

czech 10.07.10 в 07:35

0

>>> message = """This message will
...span several
...lines."""
>>> print message
This message will
span several
lines.
>>>

czech 10.07.10 в 07:35

0

5.8 Unit-тесты с doctest

czech 10.07.10 в 07:37

0

В наше время наилучшей практикой в разработке программ является включение автоматических unit-тестов в исходный код. Unit-тестирование подразумевает автоматическю проверку отдельных участков кода, таких как функции, на работоспособность. Становится возможным следить за поведением функции при изменениях кода как внутри нее, так и в самой программе.

czech 10.07.10 в 07:41

0
Минутку...

← Предыдущая страница

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