Анимация
JavaScript
|
Главная Библионтека >>> print fib(0) None Довольно просто написать функцию, которая возвращает список чисел ряда Фибоначчи, вместо того, чтобы выводить их: >>> def fib2(n): ... Возвращает список, содержащий числа ряда ... Фибоначчи, не превышающие n ... result = [] ... a, b = 0, 1 ... while b < n: ... result.append(b) ... a, b = b, a+b ... return result >>> # Вызываем только что определенную функцию ... f100 = fib2(100) >>> # Выводим результат ... f100 [1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89] Этот пример, как обычно, демонстрирует несколько новых особенностей языка Python: • Инструкция return выходит из функции и возвращает значение. Без аргументов return используется для выхода из середины процедуры (иначе выход происходит при достижении конца процедуры), в этом случае возвращается значение None. • Инструкция result.append(b) вызывает метод объекта-списка result. Метод - это функция, "принадлежащая" объекту, вызывается как obj.methodname, где obj - объект (или выражение его определяющее) и methodname - имя метода, определенного для данного типа объектов. Различные типы имеют различные наборы методов. Методы различных типов могут иметь одинаковые имена, не приводя к неопределенности. (Вы можете определить собственные типы объектов - >>> f = fib >>> f(100) 1 1 2 3 5 8 13 21 34 55 89 Вы можете возразить, что fib является процедурой, а не функцией. В языке Python, как и в C, процедура - всего лишь функция, которая не возвращает никакого значения. Строго говоря, процедуры все же возвращают значение, которое, скорее, не представляет большого интереса. Это значение - None (встроенное имя). Значение None обычно не выводится интерпретатором, но Вы можете его увидеть, если действительно хотите этого: 4.7 Дополнительные возможности в определении функций В языке Python можно определить функцию с переменным числом аргументов. Для этого существуют три способа, которые можно комбинировать. 4.7.1 Значения аргументов по умолчанию Наиболее полезный способ - установить значения по умолчанию для одного или нескольких аргументов. Таким образом, получается функция, которую можно вызывать с меньшим количеством аргументов, чем в определении, например: def ask ok(prompt, retries=4, complaint=Да или нет, пожалуйста!): while 1: ok = raw input(prompt) if ok in (д, да): return 1 if ok in (н, не, нет): return 0 retries = retries - 1 if retries < 0: raise IOError( Пользователь отказывается отвечать) print complaint Эта функция может быть вызвана так: ask ok(Вы действительно хотите вхй-ти?), или так: ask ok(Перезаписать файл?, 2). Значения по умолчанию вычисляются в месте определения функции в области видимости определения, так что def f(arg = i): print arg i=6 f() выведет 5. Важное замечание: значение по умолчанию вычисляется только один раз. Это отражается в том случае, когда аргумент со значением по умолчанию является объектом, классы - и методы работы с ними.) Метод append() , используемый в примере, определен для объектов-списков. Он добавляет элемент в конец списка. В приведенном примере его использование эквивалентно записи result = result + [ b] , но более эффективно. 4.7.2 Произвольный набор аргументов Наконец, не так часто используемый вариант - определить функцию таким образом, чтобы ее можно было вызвать с произвольным числом аргументов. В этом случае аргументы будут переданы в виде кортежа4. Перед переменным числом аргументов может присутствовать произвольное число обычных аргументов: def fprintf(file, format, *args): file.write(format % args) 4.7.3 Именованные аргументы Функция может быть вызвана с использованием именованных аргументов (keyword arguments) в виде keyword = value. Например, функция ask ok() (раздел 4.7.1) может быть вызвана следующими способами: 3Такое поведение является, скорее, нежелательной особенностью языка, использование которой может привести к трудно отлавливаемым ошибкам. В качестве статических переменных рекомендуется использовать глобальные переменные модуля. 4Кортеж - своего рода последовательность объектов, в которую Вы не можете вносить изменения. допускающим изменения, таким как список или словарь. Например, следующая функция накапливает передаваемые аргументы (то есть переменная l является статической)3: def f(a, l = []): l.append(a) return l print f(1) print f(2) print f(3) Результат выполнения будет следующий: [1] [1, 2] [1, 2, 3] Если Вы не хотите, чтобы аргумент по умолчанию совместно использовался при последующих вызовах, можете немного изменить функцию: def f(a, l = None): if l is None: l = [] l.append(a) return l 0 1 2 3 4 5 6 7 [ 8 ] 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 |