ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 10.01.2024
Просмотров: 731
Скачиваний: 16
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
– промежуток начала среза; кон – конца среза; шаг –
шаг. По умолчанию нач = 0, кон = 1еn (последовательность); шаг = 1.
Если шагне указан, второе двоеточие можно опустить. Приведем пример работы со срезами:
15
>>> s = range(10)
>>> s
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> s[0:3]
[0, 1, 2]
>>> s[-1:]
[9]
>>> s[::3]
[0, 3, 6, 9]
>>> s[0:0] = [-1, -1, -1]
>>> s
[-1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> del s[:3]
>>> s
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Как видно из этого примера, с помощью срезов удобно задавать любую подстроку, даже если она нулевой длины, как для удаления элементов, так и для вставки в строго определенное место.
2.8. Тип dict
Словарь (хэш, ассоциативный массив) – это изменчивая струк- тура данных для хранения пар ключ-значение, где значение одно- значно определяется ключом. В качестве ключа может выступать неизменчивый тип данных (число, строка, кортеж и т. п.). Порядок пар ключ-значение произволен. Ниже приведен литерал для словаря и пример работы со словарем: d = {1: 'one', 2: 'two', 3: 'three', 4: 'four'} d0 = {0: 'zero'} print d[l]
# берется значение по ключу d[0] =0
# присваивается значение по ключу del d[0]
# удаляется пара ключ-значение с данным ключом print d for key, val in d.items():
# цикл по всему словарю print key, val for key in d.keys () :
# цикл по ключам словаря
16 print key, d[key] for val in d.values (): # цикл по значениям словаря print val d.update(d0)#пополняется словарь из другого print len(d)
2.9. Тип file
Объекты этого типа предназначены для работы с внешними данными. В простом случае – это файл на диске. Файловые объекты должны поддерживать основные методы: read(), write(), readline(), readlines(), seek(), tell(), close() и т. п. Копирование файла: f1=open("file1.txt","r") f2=open("file2.txt","w") for line in f1.readlines(): f2.write(line) f2.close() f1.close()
Кроме собственно файлов, в Python используются и файлопо- добные объекты. В очень многих функциях просто неважно, передан ли ей объект типа file или другого типа, если он имеет все те же мето- ды (и в том же смысле). Например, можно достигнуть копирования содержимого по ссылке (URL) в файл file.txt, если заменить первую строку на import urllib f1 = urilib.urlopen("http://python.onego.ru")
3. ВЫРАЖЕНИЯ
В современных языках программирования принято производить большую часть обработки данных ввыражениях.Синтаксис выраже- ний у многих языков программирования примерно одинаков. Синтак- сис выражений Python не удивит программиста чем-то новым. (Разве что цепочечные сравнения могут приятно порадовать.)
Приоритет операций показан в таблице (в порядке уменьшения).
Для унарных операций х обозначает операнд.Ассоциативность опе- раций в Python – слева направо.
17
Операция
Название lambda
Лямбда-выражение or
Логическое ИЛИ and
Логическое И not x
Логическое НЕ in, not in
Проверка принадлежности is, is not
Проверка идентичности
<, <=, >, >=, !=, ==
Сравнения
|
Побитовое ИЛИ
^
Побитовое исключающее
ИЛИ
&
Побитовое И
<<, >>
Побитовые сдвиги
+, -
Сложение и вычитание
*, /, %
Умножение, деление, остаток
+x, -x
Определение и смена знака
х
Побитовое НЕ
**
Возведение в степень х.атрибут
Ссылка на атрибут х[индекс]
Взятие элемента по индексу х[от:до]
Выделение среза (от и до) f(аргумент)
Вызов функции
(...)
Скобки или кортеж
[... ]
Список или списковое вклю- чение
{кл:зн,...}
Словарь пар ключ-значение 'выражения'
Преобразование к строке
(repr)
18
Порядок вычислений операндов определяется правилами:
1. Операнд слева вычисляется раньше операнда справа во всех бинарных операциях, кроме возведения в степень.
2. Цепочка сравнений видаa < b < c < … < y < zфактически рав- носильна данному выражению:
(а < b) and (b < с) and ... and (у < z).
3. Перед фактическим выполнением операции вычисляются нуж- ные для нее операнды. В большинстве бинарных операций предвари- тельно вычисляются оба операнда (сначала левый), но операции or и and, а также цепочки сравнений вычисляют такое количество операндов, ко- торого достаточно для получения результата. В невычисленной части выражения в таком случае могут даже быть неопределенные имена. Это важно учитывать, если используются функции с побочными эффектами.
4. Аргументы функций, выражения для списков, кортежей, сло- варей и т. п. вычисляются слева направо, в порядке следования в вы- ражении. В случае неясности приоритетов желательно применять скобки, несмотря на то что одни и те же символы могут использо- ваться для разных операций, приоритеты которых не меняются. Так,
«%» имеет тот же приоритет, что и «*», а потому в следующем при- мере скобки просто необходимы, чтобы операция умножения про- изошла перед операцией форматирования: print "%i" % (i*j)
Имена используются так, как если бы они были определены в текущем модуле: os.system("dir") digits = re.compile("\d+") print argv[0], environ
Повторный импорт модуля происходит гораздо быстрее, так как модули кэшируются интерпретатором. Загруженный модуль можно загрузить еще раз (например, если файл с текстом модуля изменился на диске) с помощью функции reload():
19 import mymodule reload(mymodule)
Однако в этом случае все объекты, являющиеся экземплярами классов из старого варианта модуля, не изменят своего поведения.
4. ФУНКЦИИ
Для создания функции применяется операторdef,как показано в следующем примере: def remainder(а,b): q = a/b г = а – q*b return r print (3.0,2.0)
Для того чтобы вызвать функцию, нужно просто указать имя функции, за которым следуют ее параметры, заключенные в круглые скобки. Для возврата из функции нескольких значений может приме- няться кортеж, как показано ниже: def divide(а,b): q = a/b #Если а и b – целые,q – целое. r = а – q*b return (q,r) a,b=divide(3.0,2.0) print a,b
Для того чтобы присвоить параметру значение, принятое по умолчанию, можно использовать оператор присваивания: def connect(hostname,port,timeout=300):
# Тело функции
Если в определении функции даны значения, принятые по умолча- нию, их можно опускать в последующих вызовах функции. Например: connect('www.python.org', 80)
20
Можно также вызывать функции, используя ключевые парамет- ры и указывая параметры в произвольном порядке. Например: connect(port=80,hostname="www.python.org")
При создании или присваивании значений переменных внутри функции область их определения является локальной. Для изменения значения глобальной переменной внутри функции используется опе- раторglobalследующим образом: а = 4.5 def foo () : global aа = 8.8
# Изменяет глобальную переменную а
5. ВСТРОЕННЫЕ ФУНКЦИИ
В среде Python без дополнительных операций импорта доступно более сотни встроенных объектов, в основном функций и исключе- ний. Для удобства функции можно условно разделить на следующие категории:
Категория
Функции
1 2
Функции преобразования типов и классы coerce, str, repr, int, list,tuple,long,float, complex, dict, super, file, bool, object
Числовые и строковые функции abs, divmod, ord, pow, len, chr, unichr,hex,oct,cmp,round, Unicode
Функции обработки данных apply, map, filter, reduce, zip, range, xrange, max, min, iter, enu- merate, sum
Функции определения свойств hash, id, callable, issubclass, isin- stance, type
Функции для доступа к внут- ренним структурам locals, globals, vars, intern, dir
21
Окончание таблицы
1 2
Функции компиляции и исполнения eval, execfile, reload, __import__, compile
Функции ввода-вывода input, raw_input, open
Функции для работы с атрибутами getattr, setattr, delattr, hasattr
Функции-«украшатели» методов классов staticmethod, classmethod, property
Прочие функции buffer, slice
Уточнить назначение функции, ее аргументов и результата можно в интерактивной сессии интерпретатора Python:
>>> help(len)
Help on built-in function len: len(...) len(object) -> integer
Return the number of items of a sequence or mapping.
## Или так:
>>> print len.__doc__ len(object) -> integer
Return the number of items of a sequence or mapping.
6. КЛАССЫ
Операторclassприменяется для определения объектов новых типов и для объектно-ориентированного программирования. Напри- мер, следующий класс определяет простой стек: classStack: def _init_(self): # Инициализировать стек self.stack = [ ] def push(self,object): self.stack.append(object) def pop(self, object):
22 return self.stack.pop() def length(self): return ten(self.stack)
В классе метод определяется с помощью оператораdef.Первый параметр каждого метода всегда ссылается на сам объект. В соответ- ствии с общепринятым соглашением для этого параметра применяет- ся имяself.Все операции, затрагивающие атрибуты объекта, должны явно ссылаться на переменнуюself.Методы с ведущими и конечны- ми двойными подчеркиваниями являются специальными методами.
Метод (конструктор) __init__ применяется для инициализации объек- та при его создании.
Для того чтобы использовать класс в целях создания объекта, можно применить код: s = Stack() # Создать стек s.push("Dave") # Продвинуть в него некоторые объекты s.push(42) s.push([3,4,5]) х = s.pop() # x получаетзначение [3,4,5] у = s.pop() # у получаетзначение 42 del s # Уничтожить s
7. ИСКЛЮЧЕНИЯ
Если в программе возникает ошибка, то активизируется исклю- чение и появляется сообщение об ошибке, как в следующем примере:
Traceback (Innermost last):
File "", line 42, in foo.py NameError: a
В сообщении об ошибке указан тип возникшей ошибки, а также место ее возникновения. Обычно ошибки приводят к аварийному за- вершению программы. Однако можно перехватывать и обрабатывать исключения с помощью операторовtry и except: try: f = open("file.txt","r")
23 except IOError,e: print e
При возникновении ошибкиIOErrorподробные сведения о причинах ошибки помещаются в переменную е и управление пе- редается коду в блокеexcept.При возникновении исключения ка- кого-то другого вида оно передается во включающий блок кода
(если он есть). Если ошибки не возникают, код в блокеexceptиг- норируется.
Для сообщения об исключении используется операторraise.
Для активизации исключения можно воспользоваться одним из встроенных исключений следующим образом: raise RuntimeError, "Unrecoverable error"
8. ФУНКЦИИ ПРЕОБРАЗОВАНИЯ ТИПОВ И КЛАССЫ
Функции и классы из этой категории служат для преобразования типов данных. В старых версиях Python для преобразования к нуж- ному типу использовалась одноименная функция. В новых версиях
Python роль таких функций играют имена встроенных классов (одна- ко семантика не изменилась). Пример:
>>> int(23.5)
23
>>> float('12.345')
12.345000000000001
>>> dict([('a', 2), ('b', 3)])
{'a': 2, 'b': 3}
>>> object
24
9. ЧИСЛОВЫЕ И СТРОКОВЫЕ ФУНКЦИИ
Функции работают с числовыми или строковыми аргументами.
Ниже даны описания этих функций.
Функции
Описание abs(x)
Модуль числа x divmod(x, у)
Частное и остаток от деления pow(x, y[,m])
Возведение х в степень у round(n[, z])
Округление чисел до заданного знака после точ- ки ord(s)
Функция возвращает код заданного символа в строке chr(n)
Возвращает строку с символом с заданным кодом len(s)
Возвращает число элементов последова- тельности oct(n), hex(n)
Возвращают строку с восьмеричным или шестна- дцатеричным представлением целого числа n сmр(х, у)
Сравнение двух значений. Результат: отрица- тельный, ноль или положительный, в зависимо- сти от результата сравнения
Unicode(s[, encoding[, errors]])
Создает Unicode-объект, соответствующий стро- ке s в заданной кодировке encoding
Ошибки кодирования обрабатываются в соответствии с errors, который может принимать следующие значения:
'strict' – строгое преобразование;
'replace' – с заменой несуществующих символов;
'ignore' – игнорировать несуществующие символы).
По умолчанию: encoding=' utf-8' , errors='strict'.
Следующий пример строит таблицу кодировки кириллических букв в Unicode:
25 print "Таблица Unicode (русские буквы)". center(18*4) i = 0 for c in"АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ"\
"абвгдежзийклмнопрстуфхцчшщъыьэюя": u = Unicode(с, 'koi8-r') print "%3i: %1s %s" % (ord(u) , с, 'и.'), i += 1 if i % 4 == 0: print
10. ФУНКЦИИ ОБРАБОТКИ ДАННЫХ
В программе Python предопределены функции генерации масси- ва чисел.
Пример с функциями range() и enumerate():
>>> for i,с in enumerate("АВС"): print i, с
0 А
1 В
2 С
>>> print range(4, 20, 2)
[4, 6, 8, 10, 12, 14, .16, 18]
11. ФУНКЦИИ ОПРЕДЕЛЕНИЯ СВОЙСТВ
Функции определения свойств обеспечивают доступ к некото- рым встроенным атрибутам объектов и другим свойствам. Следую- щий пример показывает некоторые из этих функций:
>>> s = "abcde"
>>> s1 ="abcde"
>>> s2 = "ab" + "cde"
>>> print "hash:", hash(s), hash(sl), hash(s2) hash: -1332677140 -1332677140 -1332677140
>>> print "id:", id(s), id(sl), id(s2) id: 1076618592 1076618592 1076618656
Здесь можно увидеть, что для одного и того же строкового лите- рала "abcde" получается один и тот же объект, тогда как для одинако- вых по значению объектов вполне можно получить разные объекты.
26
12. ФУНКЦИИ ДЛЯ ДОСТУПА
К ВНУТРЕННИМ СТРУКТУРАМ
В используемой реализации языка Python глобальные и локаль- ные переменные доступны в виде словаря благодаря функциям glob- als() и locals(). Изменять эти словари не рекомендуется.
Функция vars() возвращает таблицу локальных имен некоторого объекта (если параметр не задан, она возвращает то же, что и locals()): а=1 b=2 с=3 print "%(a)s + %(b)s = %(c)s" % vars()
13. ФУНКЦИИ КОМПИЛЯЦИИ И ИСПОЛНЕНИЯ
Функция reload() уже рассматривалась, а из остальных функций этой категории особого внимания заслуживает eval(). Эта функция вычисляет переданное ей выражение. Пример: а=2 b=3 for op in "+-*/%": е = "а" + op + "b" print е, "->", eval(e)
У функции eval(), кроме подлежащего вычислению выражения, есть еще два параметра – с их помощью можно задать глобальное и локальное пространства имен, из которых будут разрешаться имена выражения. Ниже представлен предыдущий пример для использова- ния с собственным словарем имен в качестве глобального простран- ства имен: for op in "+-*/%": е = "а" + op + "b" print е, "->", eval(e, {'а': 2, 'b': 3})
В целях безопасности не следует применять eval() для аргумен- та, в котором присутствует непроверенный ввод от пользователя.
27
14. ФУНКЦИИ ВВОДА-ВЫВОДА
Функции input() и raw_input() используются для ввода со стан- дартного ввода. Функция open() служит для открытия файла по име- ни для чтения, записи или изменения.
Функция принимает три аргумента. Первые два – имя файла
(путь к файлу), режим открытия ("r" – чтение, "w" – запись, "а" – до- бавление или "w+", "а+", "r+" – изменение; также может прибавлять- ся «t», что обозначает текстовый файл и имеет значение только на платформе Windows). Третий аргумент указывает режим буфериза- ции: 0 без буферизации; 1 построчная буферизация; больше 1 буфер указанного размера в байтах.
15. ВВОД И ВЫВОД ФАЙЛОВ
В следующей программе выполняется открытие файла и по- строчное чтение его содержимого: f = open("data.txt") #Возвращает объект-файл line = f.readline() #Вызывает метод readline()файла while line: print line line = f.readline() f.close ()
Функцияopen()открывает новый объект файла. Вызывая мето- ды этого объекта, можно выполнять различные операции с файлом.
Методreadline()считывает одну строку ввода, включая завершаю- щий символ новой строки. В конце файла возвращается пустая стро- ка. Аналогичным образом можно использовать методwrite()для за- писи результатов программы вычисления сложного процента в файл: f = open("out","w") # Открыть файл для записи while year <= numyears: principal = principal*(1+rate) f.write("%3d %0.2f\n" % (year,principal)) year = year + 1 f.close()
28
Функцияореn() возвращает объект файла, который поддержи- вает методы, перечисленные ниже.
Метод
Описание f.read([n])
Читать не более n байтов f.readline()
Читать одну строку ввода f.readlines()
Читать все строки и возвратить список
f.write(S)
Писать строку S f.writelines(L)
Писать все строки в списке L f. close()
Закрыть файл f.tell()
Возвратить текущий указатель файла f.seek(offset
[, where])
Установить указатель на новую позицию в фай- ле f.isatty()
Возвратить 1,если f – диалоговый терминал f.flush()
Вывести данные на устройство и очистить бу- фер вывода f.truncate(
[size])
Усечь файл до размера в байтах не болееsize f.fileno()
Возвратить целочисленный дескриптор файла
16. СТАНДАРТНЫЕ ФАЙЛЫ ВВОДА/ВЫВОДА ДАННЫХ
И ВЫВОДА ОШИБОК
В интерпретаторе предусмотрены три стандартных объекта файла, которые известны под названием стандартного файла ввода данных, стандартного файла вывода данных и стандартного файла вывода ошибок и доступны в модуле sys под именами sys.stdin, sys.stdout и sys.stderr соответственно. В частности, stdin – это объ- ект файла, соответствующий входному потоку символов, поступаю- щему в интерпретатор, stdout – это объект файла, который получает вывод, выработанный оператором print, a stderr – это файл, который получает сообщения об ошибках. Чаще всего stdin предполагает ввод с клавиатуры, a stdout и stderr – вывод текста на экран.
Методы, описанные в предыдущей главе, могут применяться для выполнения ввода/вывода произвольных данных с участием
29 пользователя. Например, следующая функция считывает строку вво- да из стандартного файла ввода: def gets(): text = " " while 1: с = sys.stdin.read(1) text = text + с if с == '\n' :
break return text
Для чтения строки текста из файлаstdin может также приме- няться встроенная функцияraw_input(prompt): s = raw_input("type something : ") print "You typed '%s'" % (s,)
И наконец, прерывания с клавиатуры (для выработки которых часто применяется комбинация клавиш ) активизируют ис- ключение Keyboardlnterrupt, которое может быть перехвачено с ис- пользованием обработчика исключений.
1 2 3 4 5
15
>>> s = range(10)
>>> s
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> s[0:3]
[0, 1, 2]
>>> s[-1:]
[9]
>>> s[::3]
[0, 3, 6, 9]
>>> s[0:0] = [-1, -1, -1]
>>> s
[-1, -1, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
>>> del s[:3]
>>> s
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
Как видно из этого примера, с помощью срезов удобно задавать любую подстроку, даже если она нулевой длины, как для удаления элементов, так и для вставки в строго определенное место.
2.8. Тип dict
Словарь (хэш, ассоциативный массив) – это изменчивая струк- тура данных для хранения пар ключ-значение, где значение одно- значно определяется ключом. В качестве ключа может выступать неизменчивый тип данных (число, строка, кортеж и т. п.). Порядок пар ключ-значение произволен. Ниже приведен литерал для словаря и пример работы со словарем: d = {1: 'one', 2: 'two', 3: 'three', 4: 'four'} d0 = {0: 'zero'} print d[l]
# берется значение по ключу d[0] =0
# присваивается значение по ключу del d[0]
# удаляется пара ключ-значение с данным ключом print d for key, val in d.items():
# цикл по всему словарю print key, val for key in d.keys () :
# цикл по ключам словаря
16 print key, d[key] for val in d.values (): # цикл по значениям словаря print val d.update(d0)#пополняется словарь из другого print len(d)
2.9. Тип file
Объекты этого типа предназначены для работы с внешними данными. В простом случае – это файл на диске. Файловые объекты должны поддерживать основные методы: read(), write(), readline(), readlines(), seek(), tell(), close() и т. п. Копирование файла: f1=open("file1.txt","r") f2=open("file2.txt","w") for line in f1.readlines(): f2.write(line) f2.close() f1.close()
Кроме собственно файлов, в Python используются и файлопо- добные объекты. В очень многих функциях просто неважно, передан ли ей объект типа file или другого типа, если он имеет все те же мето- ды (и в том же смысле). Например, можно достигнуть копирования содержимого по ссылке (URL) в файл file.txt, если заменить первую строку на import urllib f1 = urilib.urlopen("http://python.onego.ru")
3. ВЫРАЖЕНИЯ
В современных языках программирования принято производить большую часть обработки данных ввыражениях.Синтаксис выраже- ний у многих языков программирования примерно одинаков. Синтак- сис выражений Python не удивит программиста чем-то новым. (Разве что цепочечные сравнения могут приятно порадовать.)
Приоритет операций показан в таблице (в порядке уменьшения).
Для унарных операций х обозначает операнд.Ассоциативность опе- раций в Python – слева направо.
17
Операция
Название lambda
Лямбда-выражение or
Логическое ИЛИ and
Логическое И not x
Логическое НЕ in, not in
Проверка принадлежности is, is not
Проверка идентичности
<, <=, >, >=, !=, ==
Сравнения
|
Побитовое ИЛИ
^
Побитовое исключающее
ИЛИ
&
Побитовое И
<<, >>
Побитовые сдвиги
+, -
Сложение и вычитание
*, /, %
Умножение, деление, остаток
+x, -x
Определение и смена знака
х
Побитовое НЕ
**
Возведение в степень х.атрибут
Ссылка на атрибут х[индекс]
Взятие элемента по индексу х[от:до]
Выделение среза (от и до) f(аргумент)
Вызов функции
(...)
Скобки или кортеж
[... ]
Список или списковое вклю- чение
{кл:зн,...}
Словарь пар ключ-значение 'выражения'
Преобразование к строке
(repr)
18
Порядок вычислений операндов определяется правилами:
1. Операнд слева вычисляется раньше операнда справа во всех бинарных операциях, кроме возведения в степень.
2. Цепочка сравнений видаa < b < c < … < y < zфактически рав- носильна данному выражению:
(а < b) and (b < с) and ... and (у < z).
3. Перед фактическим выполнением операции вычисляются нуж- ные для нее операнды. В большинстве бинарных операций предвари- тельно вычисляются оба операнда (сначала левый), но операции or и and, а также цепочки сравнений вычисляют такое количество операндов, ко- торого достаточно для получения результата. В невычисленной части выражения в таком случае могут даже быть неопределенные имена. Это важно учитывать, если используются функции с побочными эффектами.
4. Аргументы функций, выражения для списков, кортежей, сло- варей и т. п. вычисляются слева направо, в порядке следования в вы- ражении. В случае неясности приоритетов желательно применять скобки, несмотря на то что одни и те же символы могут использо- ваться для разных операций, приоритеты которых не меняются. Так,
«%» имеет тот же приоритет, что и «*», а потому в следующем при- мере скобки просто необходимы, чтобы операция умножения про- изошла перед операцией форматирования: print "%i" % (i*j)
Имена используются так, как если бы они были определены в текущем модуле: os.system("dir") digits = re.compile("\d+") print argv[0], environ
Повторный импорт модуля происходит гораздо быстрее, так как модули кэшируются интерпретатором. Загруженный модуль можно загрузить еще раз (например, если файл с текстом модуля изменился на диске) с помощью функции reload():
19 import mymodule reload(mymodule)
Однако в этом случае все объекты, являющиеся экземплярами классов из старого варианта модуля, не изменят своего поведения.
4. ФУНКЦИИ
Для создания функции применяется операторdef,как показано в следующем примере: def remainder(а,b): q = a/b г = а – q*b return r print (3.0,2.0)
Для того чтобы вызвать функцию, нужно просто указать имя функции, за которым следуют ее параметры, заключенные в круглые скобки. Для возврата из функции нескольких значений может приме- няться кортеж, как показано ниже: def divide(а,b): q = a/b #Если а и b – целые,q – целое. r = а – q*b return (q,r) a,b=divide(3.0,2.0) print a,b
Для того чтобы присвоить параметру значение, принятое по умолчанию, можно использовать оператор присваивания: def connect(hostname,port,timeout=300):
# Тело функции
Если в определении функции даны значения, принятые по умолча- нию, их можно опускать в последующих вызовах функции. Например: connect('www.python.org', 80)
20
Можно также вызывать функции, используя ключевые парамет- ры и указывая параметры в произвольном порядке. Например: connect(port=80,hostname="www.python.org")
При создании или присваивании значений переменных внутри функции область их определения является локальной. Для изменения значения глобальной переменной внутри функции используется опе- раторglobalследующим образом: а = 4.5 def foo () : global aа = 8.8
# Изменяет глобальную переменную а
5. ВСТРОЕННЫЕ ФУНКЦИИ
В среде Python без дополнительных операций импорта доступно более сотни встроенных объектов, в основном функций и исключе- ний. Для удобства функции можно условно разделить на следующие категории:
Категория
Функции
1 2
Функции преобразования типов и классы coerce, str, repr, int, list,tuple,long,float, complex, dict, super, file, bool, object
Числовые и строковые функции abs, divmod, ord, pow, len, chr, unichr,hex,oct,cmp,round, Unicode
Функции обработки данных apply, map, filter, reduce, zip, range, xrange, max, min, iter, enu- merate, sum
Функции определения свойств hash, id, callable, issubclass, isin- stance, type
Функции для доступа к внут- ренним структурам locals, globals, vars, intern, dir
21
Окончание таблицы
1 2
Функции компиляции и исполнения eval, execfile, reload, __import__, compile
Функции ввода-вывода input, raw_input, open
Функции для работы с атрибутами getattr, setattr, delattr, hasattr
Функции-«украшатели» методов классов staticmethod, classmethod, property
Прочие функции buffer, slice
Уточнить назначение функции, ее аргументов и результата можно в интерактивной сессии интерпретатора Python:
>>> help(len)
Help on built-in function len: len(...) len(object) -> integer
Return the number of items of a sequence or mapping.
## Или так:
>>> print len.__doc__ len(object) -> integer
Return the number of items of a sequence or mapping.
6. КЛАССЫ
Операторclassприменяется для определения объектов новых типов и для объектно-ориентированного программирования. Напри- мер, следующий класс определяет простой стек: classStack: def _init_(self): # Инициализировать стек self.stack = [ ] def push(self,object): self.stack.append(object) def pop(self, object):
22 return self.stack.pop() def length(self): return ten(self.stack)
В классе метод определяется с помощью оператораdef.Первый параметр каждого метода всегда ссылается на сам объект. В соответ- ствии с общепринятым соглашением для этого параметра применяет- ся имяself.Все операции, затрагивающие атрибуты объекта, должны явно ссылаться на переменнуюself.Методы с ведущими и конечны- ми двойными подчеркиваниями являются специальными методами.
Метод (конструктор) __init__ применяется для инициализации объек- та при его создании.
Для того чтобы использовать класс в целях создания объекта, можно применить код: s = Stack() # Создать стек s.push("Dave") # Продвинуть в него некоторые объекты s.push(42) s.push([3,4,5]) х = s.pop() # x получаетзначение [3,4,5] у = s.pop() # у получаетзначение 42 del s # Уничтожить s
7. ИСКЛЮЧЕНИЯ
Если в программе возникает ошибка, то активизируется исклю- чение и появляется сообщение об ошибке, как в следующем примере:
Traceback (Innermost last):
File "
В сообщении об ошибке указан тип возникшей ошибки, а также место ее возникновения. Обычно ошибки приводят к аварийному за- вершению программы. Однако можно перехватывать и обрабатывать исключения с помощью операторовtry и except: try: f = open("file.txt","r")
23 except IOError,e: print e
При возникновении ошибкиIOErrorподробные сведения о причинах ошибки помещаются в переменную е и управление пе- редается коду в блокеexcept.При возникновении исключения ка- кого-то другого вида оно передается во включающий блок кода
(если он есть). Если ошибки не возникают, код в блокеexceptиг- норируется.
Для сообщения об исключении используется операторraise.
Для активизации исключения можно воспользоваться одним из встроенных исключений следующим образом: raise RuntimeError, "Unrecoverable error"
8. ФУНКЦИИ ПРЕОБРАЗОВАНИЯ ТИПОВ И КЛАССЫ
Функции и классы из этой категории служат для преобразования типов данных. В старых версиях Python для преобразования к нуж- ному типу использовалась одноименная функция. В новых версиях
Python роль таких функций играют имена встроенных классов (одна- ко семантика не изменилась). Пример:
>>> int(23.5)
23
>>> float('12.345')
12.345000000000001
>>> dict([('a', 2), ('b', 3)])
{'a': 2, 'b': 3}
>>> object
24
9. ЧИСЛОВЫЕ И СТРОКОВЫЕ ФУНКЦИИ
Функции работают с числовыми или строковыми аргументами.
Ниже даны описания этих функций.
Функции
Описание abs(x)
Модуль числа x divmod(x, у)
Частное и остаток от деления pow(x, y[,m])
Возведение х в степень у round(n[, z])
Округление чисел до заданного знака после точ- ки ord(s)
Функция возвращает код заданного символа в строке chr(n)
Возвращает строку с символом с заданным кодом len(s)
Возвращает число элементов последова- тельности oct(n), hex(n)
Возвращают строку с восьмеричным или шестна- дцатеричным представлением целого числа n сmр(х, у)
Сравнение двух значений. Результат: отрица- тельный, ноль или положительный, в зависимо- сти от результата сравнения
Unicode(s[, encoding[, errors]])
Создает Unicode-объект, соответствующий стро- ке s в заданной кодировке encoding
Ошибки кодирования обрабатываются в соответствии с errors, который может принимать следующие значения:
'strict' – строгое преобразование;
'replace' – с заменой несуществующих символов;
'ignore' – игнорировать несуществующие символы).
По умолчанию: encoding=' utf-8' , errors='strict'.
Следующий пример строит таблицу кодировки кириллических букв в Unicode:
25 print "Таблица Unicode (русские буквы)". center(18*4) i = 0 for c in"АБВГДЕЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ"\
"абвгдежзийклмнопрстуфхцчшщъыьэюя": u = Unicode(с, 'koi8-r') print "%3i: %1s %s" % (ord(u) , с, 'и.'), i += 1 if i % 4 == 0: print
10. ФУНКЦИИ ОБРАБОТКИ ДАННЫХ
В программе Python предопределены функции генерации масси- ва чисел.
Пример с функциями range() и enumerate():
>>> for i,с in enumerate("АВС"): print i, с
0 А
1 В
2 С
>>> print range(4, 20, 2)
[4, 6, 8, 10, 12, 14, .16, 18]
11. ФУНКЦИИ ОПРЕДЕЛЕНИЯ СВОЙСТВ
Функции определения свойств обеспечивают доступ к некото- рым встроенным атрибутам объектов и другим свойствам. Следую- щий пример показывает некоторые из этих функций:
>>> s = "abcde"
>>> s1 ="abcde"
>>> s2 = "ab" + "cde"
>>> print "hash:", hash(s), hash(sl), hash(s2) hash: -1332677140 -1332677140 -1332677140
>>> print "id:", id(s), id(sl), id(s2) id: 1076618592 1076618592 1076618656
Здесь можно увидеть, что для одного и того же строкового лите- рала "abcde" получается один и тот же объект, тогда как для одинако- вых по значению объектов вполне можно получить разные объекты.
26
12. ФУНКЦИИ ДЛЯ ДОСТУПА
К ВНУТРЕННИМ СТРУКТУРАМ
В используемой реализации языка Python глобальные и локаль- ные переменные доступны в виде словаря благодаря функциям glob- als() и locals(). Изменять эти словари не рекомендуется.
Функция vars() возвращает таблицу локальных имен некоторого объекта (если параметр не задан, она возвращает то же, что и locals()): а=1 b=2 с=3 print "%(a)s + %(b)s = %(c)s" % vars()
13. ФУНКЦИИ КОМПИЛЯЦИИ И ИСПОЛНЕНИЯ
Функция reload() уже рассматривалась, а из остальных функций этой категории особого внимания заслуживает eval(). Эта функция вычисляет переданное ей выражение. Пример: а=2 b=3 for op in "+-*/%": е = "а" + op + "b" print е, "->", eval(e)
У функции eval(), кроме подлежащего вычислению выражения, есть еще два параметра – с их помощью можно задать глобальное и локальное пространства имен, из которых будут разрешаться имена выражения. Ниже представлен предыдущий пример для использова- ния с собственным словарем имен в качестве глобального простран- ства имен: for op in "+-*/%": е = "а" + op + "b" print е, "->", eval(e, {'а': 2, 'b': 3})
В целях безопасности не следует применять eval() для аргумен- та, в котором присутствует непроверенный ввод от пользователя.
27
14. ФУНКЦИИ ВВОДА-ВЫВОДА
Функции input() и raw_input() используются для ввода со стан- дартного ввода. Функция open() служит для открытия файла по име- ни для чтения, записи или изменения.
Функция принимает три аргумента. Первые два – имя файла
(путь к файлу), режим открытия ("r" – чтение, "w" – запись, "а" – до- бавление или "w+", "а+", "r+" – изменение; также может прибавлять- ся «t», что обозначает текстовый файл и имеет значение только на платформе Windows). Третий аргумент указывает режим буфериза- ции: 0 без буферизации; 1 построчная буферизация; больше 1 буфер указанного размера в байтах.
15. ВВОД И ВЫВОД ФАЙЛОВ
В следующей программе выполняется открытие файла и по- строчное чтение его содержимого: f = open("data.txt") #Возвращает объект-файл line = f.readline() #Вызывает метод readline()файла while line: print line line = f.readline() f.close ()
Функцияopen()открывает новый объект файла. Вызывая мето- ды этого объекта, можно выполнять различные операции с файлом.
Методreadline()считывает одну строку ввода, включая завершаю- щий символ новой строки. В конце файла возвращается пустая стро- ка. Аналогичным образом можно использовать методwrite()для за- писи результатов программы вычисления сложного процента в файл: f = open("out","w") # Открыть файл для записи while year <= numyears: principal = principal*(1+rate) f.write("%3d %0.2f\n" % (year,principal)) year = year + 1 f.close()
28
Функцияореn() возвращает объект файла, который поддержи- вает методы, перечисленные ниже.
Метод
Описание f.read([n])
Читать не более n байтов f.readline()
Читать одну строку ввода f.readlines()
Читать все строки и возвратить список
f.write(S)
Писать строку S f.writelines(L)
Писать все строки в списке L f. close()
Закрыть файл f.tell()
Возвратить текущий указатель файла f.seek(offset
[, where])
Установить указатель на новую позицию в фай- ле f.isatty()
Возвратить 1,если f – диалоговый терминал f.flush()
Вывести данные на устройство и очистить бу- фер вывода f.truncate(
[size])
Усечь файл до размера в байтах не болееsize f.fileno()
Возвратить целочисленный дескриптор файла
16. СТАНДАРТНЫЕ ФАЙЛЫ ВВОДА/ВЫВОДА ДАННЫХ
И ВЫВОДА ОШИБОК
В интерпретаторе предусмотрены три стандартных объекта файла, которые известны под названием стандартного файла ввода данных, стандартного файла вывода данных и стандартного файла вывода ошибок и доступны в модуле sys под именами sys.stdin, sys.stdout и sys.stderr соответственно. В частности, stdin – это объ- ект файла, соответствующий входному потоку символов, поступаю- щему в интерпретатор, stdout – это объект файла, который получает вывод, выработанный оператором print, a stderr – это файл, который получает сообщения об ошибках. Чаще всего stdin предполагает ввод с клавиатуры, a stdout и stderr – вывод текста на экран.
Методы, описанные в предыдущей главе, могут применяться для выполнения ввода/вывода произвольных данных с участием
29 пользователя. Например, следующая функция считывает строку вво- да из стандартного файла ввода: def gets(): text = " " while 1: с = sys.stdin.read(1) text = text + с if с == '\n' :
break return text
Для чтения строки текста из файлаstdin может также приме- няться встроенная функцияraw_input(prompt): s = raw_input("type something : ") print "You typed '%s'" % (s,)
И наконец, прерывания с клавиатуры (для выработки которых часто применяется комбинация клавиш
1 2 3 4 5
17. ФУНКЦИИ ДЛЯ РАБОТЫ С АТРИБУТАМИ У объектов в языке Python могут быть атрибуты (в терминоло- гии языка C++ – члены-данные и члены-функции). Следующие две программы эквивалентны: # первая программа: class A: pass а = А() a.attr = 1 try: print a.attr except: print None del a.attr # вторая программа: class A: pass
30 а = А() setattr(a, 'attr', 1) if hasattrfa, 'attr'): getattr(a, 'attr') else: print None delattr(a, 'attr')
18. МОДУЛИ
По мере того как программы возрастают в размерах, может воз- никнуть необходимость разбить их на несколько файлов для удобства сопровождения. Для этого в языке Python предусмотрена возмож- ность поместить в файл определения и использовать их в качестве модуля,который можно импортировать в другие программы и сцена- рии. Для создания модуля нужно поместить соответствующие опера- торы и определения в файл, имеющий такое же имя, как у модуля.
Примечание.Файл должен иметь расширение .ру.
Например:
# файл : div.py def divide(a,b): q = a/b #Если а и b – целые, то q – целое число г = а – q*b return (q,r)
Для того чтобы использовать этот модуль в других программах, можно воспользоваться операторомimport: import div a, b = div.divide(2305, 29)
Операторimportсоздает новое пространство имен, которое со- держит все объекты, определенные в модуле. Для доступа к этому пространству имен можно просто использовать имя модуля в каче- стве префикса, как в случаеdiv.divide()из предыдущего примера. Для выполнения импорта конкретных определений в текущее простран- ство имен служит операторfrom: from div import divide a,b = divide(2305,29) # Префикс div больше ненужен
31
Для загрузки всего содержимого модуля в текущее пространство имен можно также использовать такую конструкцию: from div import *
Функцияdir()выводит на экран содержимое модуля и является полезным средством экспериментирования в интерактивном режиме:
>>> import string
>>> dir(string)
['__builtins__', '__doc__', '__file__', '__name__', '_idmap', '_idmapL',
'_lower', '_swapcase', '_upper', 'atof, 'atof_error','atoi', 'atoi_error', 'atol',
'atol_error', 'capitalize', 'capwords', 'center', 'count', 'digits', 'expandtabs',
'find',
19. МОДУЛИ СТАНДАРТНОЙ БИБЛИОТЕКИ
Модули стандартной библиотеки условно разбиты на группы по тематике.
Группа
Модули (пакеты)
Сервисы периода выполне- ния sys, atexit, copy, traceback, math, cmath, random, time, calendar, datetime, sets, array, struct, itertools, locale, gettext
Поддержка цикла разработки pdb, hotshot, profile, unittest, pydoc
(docutils, distutils)
Взаимодействие с ОС os, os.path, getopt, glob, popen2, shutil, select, signal, stat, tempfile
Обработка текстов string, re, StringIO, codecs, difflib, mmap, sgmllib, htmllib, htmlentitydefs
(xml)
Многопоточные вычисле- ния threading, thread, Queue
Хранение данных. Архива- ция pickle, shelve, anydbm, gdbm, gzip, zlib, zipfile, bz2, csv, tarfile
32
Окончание таблицы
Группа
Модули (пакеты)
Поддержка сети. Протоко- лы Internet cgi, Cookie, urllib, uriparse, httplib, smtplib, poplib, telnetlib, socket, asyn- core (SocketServer, BaseHTTPServer, xmlrpclib, asynchat)
Поддержка Internet. Форма- ты данных quopri, uu, base64, binhex, binascii, rfc822, mimetools, MimeWdter, multi- file, mailbox, (email)
Python о себе parser, symbol, token, keyword, inspect, tokenize, pyclbr, py_compile, com- pileall, dis, compiler
Модули могут содержать один или несколько классов, с помо- щью которых создается объект нужного типа, а затем речь идет уже не об именах из модуля, а об атрибутах этого объекта. И наоборот, некоторые модули содержат общие функции для работы над произ- вольными объектами.
19.1. Модуль sys
Модуль sys содержит информацию о среде выполнения программы интерпретатора Python. Ниже представлены наиболее популярные объекты из этого модуля, остальное можно изучить по документации:
exit([с]) – выход из программы, можно передать числовой код завер- шения;
0 – в случае успешного завершения, другие числа при аварийном завершении программы;
argv – список аргументов командной строки. Обычно sys.argv[0] содержит имя запущенной программы, а остальные параметры пере- даются из командной строки;
platform – платформа, на которой работает интерпретатор
version – версия интерпретатора;
setrecursionlimit(limit) – установка уровня максимальной вложенно- сти рекурсивных вызовов;
exc_info() – информация об обрабатываемом исключении.
33
19.2. Модуль copy
Модуль содержит функции для копирования объектов. Следу- ющий пример: lst1 = [0, 0, 0] lst = [lst1] *3 print lst[0][1] = 1 print lst
Список lst содержит ссылки на один и тот же список. Для того чтобы действительно размножить список, необходимо применить функцию copy() из модуля copy: from copy import copy lst1 = [0, 0, 0] lst = [copy(lst1) for i in range(3)] print lst lst[0][1] = 1 print lst
Получили тот результат, который ожидался:
[[0, 0, 0], [0, 0, 0], [0, 0, 0]]
[[0, 1, 0], [0, 0, 0], [0, 0, 0]]
В модуле copy есть еще и функция deepcopy() для глубокого копирования, при которой объекты копируются на всю возможную глубину рекурсивно.
19.3. Модули math и cmath
В этих модулях собраны математические функции для действи- тельных и комплексных аргументов. Это те же функции, что исполь- зуются в языке С. В таблице даны функции модуля math. Там, где ар- гумент обозначен буквой z, аналогичная функция определена и в мо- дуле cmath.
34
Функция или кон- станта
Описание acos(z)
Арккосинус z asin(z)
Арксинус z atan(z)
Арктангенс z atan2(y,x) atan(y/x) ceil(x)
Наименьшее целое, большее или равное х cos(z)
Косинус z cosh(х)
Гиперболический косинус х е
Константа е ехр(z)
Экспонента (то есть е * * z) fabs(x)
Абсолютное значение х floor(х)
Наибольшее целое, меньшее или равное х fmod(х, у)
Остаток от деления х на у frexp(x)
Возвращает мантиссу и порядок х как пару (m, i), где m – число с плавающей точкой, а i – це- лое, такое что х = m * 2. **i. Если 0 – возвраща- ет (0,0), иначе 0.5<=abs(m)<1.0 hypot(x,y) sqrt(x*x+y*y) ldexp(m,i) m * (2**i) log(z)
Натуральный логарифм z log10(z)
Десятичный логарифм z modf(x)
Возвращает пару (у, q) – дробную и целую часть х. Обе части имеют знак исходного числа pi
Константа Пи pow(x,y) х**у sin(z)
Синус z sinh(z)
Гиперболический синус z sqrt (z)
Корень квадратный от z tan(z)
Тангенс z tanh(z)
Гиперболический тангенс z
35
19.4. Модуль random
Этот модуль генерирует псевдослучайные числа для нескольких различных распределений. Наиболее используемые функции:
Функция
Описание random()
Генерирует псевдослучайное число из полу- открытого диапазона [0.0,1.0) choice(s)
Выбирает случайный элемент из последова- тельности s shuffle(s)
Размешивает элементы изменчивой последо- вательности s на месте randrange([start,] stop[, step])
Выдает случайное целое число из диапазона range (start, stop,step) Аналогично choice (range (start, stop, step)) normalvariate(mu, sigma)
Число из последовательности нормально рас- пределенных псевдослучайных чисел, mu – среднее, sigma – среднеквадратическое от- клонение (sigma > 0)
В модуле есть функция seed(n), которая позволяет установить генератор случайных чисел в некоторое состояние, например если возникнет необходимость многократного использования одной и той же последовательности псевдослучайных чисел.
19.5. Модуль sets
Модуль реализует тип данных для множеств. Следующий при- мер показывает, как использовать этот модуль. Следует заметить, что в Python 2.4 и старше тип set стал встроенным: import sets
А = sets.Set([1, 2, 3])
В = sets.Set([2, 3, 4]) print A|В, А&В, А-В, А^В for i in A: if i in B: print i,
36
В результате будет выведено:
Set([1, 2, 3, 4])
Set([2, 3])
Set([1])
Set([1, 4])
2 3
19.6. Модуль locale
Модуль locale применяется для работы с культурной средой, где могут использоваться свои правила написания чисел, валют, вре- мени и даты и т. п.
19.7. Модуль os
Разделители каталогов и другие связанные с этим обозначения доступны в виде констант.
Константа
Значение os.curdir
Текущий каталог os.pardir
Родительский каталог
Константа
Значение os.sep
Разделитель элементов пути os.altsep
Другой разделитель элементов пути os.pathsep
Разделитель путей в списке путей os.defpath
Список путей по умолчанию os.linesep
Признак окончания строки
Программа на Python работает в операционной системе в виде отдельного процесса. Функции модуля os дают доступ к различным значениям, относящимся к процессу и к среде, в которой он исполня- ется. Одним из важных объектов, доступных из модуля os, является словарь environ. Например, с помощью переменных окружения web- сервер передает некоторые параметры в CGI-сценарий. В следующем примере можно получить переменную окружения path:
37 import os
PATH = os.environ['PATH']
Группа функций посвящена работе с файлами и каталогами.
Приводятся только те функции, которые доступны как в Unix, так и в Windows. Режим запрашиваемого доступа указывается значением flags, составленных комбинацией (побитовым ИЛИ) флагов.
Функция
Действие access(path, flags) Доступность файла или каталога с именем path os.F_OK
Файл существует os.R_OK
Из файла можно читать os.W_OK
В файл можно писать os.X_OK
Файл можно исполнять, каталог можно просмат- ривать chdir(path)
Делает path текущим рабочим каталогом getcwd()
Текущий рабочий каталог chmod(path, mode)
Устанавливает режим доступа к path в значение mode
Режим доступа можно получить, скомбинировав флаги (см. ни- же). Функция chmod() не дополняет действующий режим, а устанав- ливает его заново.
Функция
Действие listdir(dir)
Возвращает список файлов в каталоге dir mkdir(path[, mode])
Создает каталог path makedirs(path[, mode])
Аналог mkdir(), создающий все необходимые ка- талоги, если они не существуют. Возбуждает ис- ключение, когда последний каталог уже суще- ствует
38
Окончание таблицы
Функция
Действие remove(path), unlink(path)
Удаляет файл path rmdir(), removedirs()
Удаление каталогов. Удаляет path до первого непустого каталога. В случае, если самый по- следний вложенный подкаталог в указанном пути не пустой, возбуждается исключение
OSError rename(src, dst)
Переименовывает файл или каталог src в dst renames(src, dst)
Аналог rename(), создающий все необходимые каталоги для пути dst и удаляющий пустые ка- талоги пути src
19.8. Модуль shelve
Для хранения объектов в родном для Python формате применя- ется shelve. Интерфейс shelve такой же, как у словаря. Модуль shelve позволяет создать объектно-ориентированную базу данных, обеспечивающую сохраняемость объектов, «сериализуемых» [10] с использованием модуляpickle и anydbm. Файлы, создаваемые этим модулем, представлены в двоичном формате.
Функция
Действие import shelve
Подключение модуля data = ("abc", 12)
Организация данных key = "key"
Ключ (строка) filename = "polka.dat"
Имя файла для хранения d=shelve.open(filename)
Открытие файла d[key] = data
Сохранить данные с ключом key data= d[key]
Загрузить значение по ключу из базы len(d)
Получить количество объектов в файле
39
Окончание таблицы
Функция
Действие d.sync()
Запись изменений в БД на диске del d[key]
Удалить ключ и значение flag = d.has_key(key)
Проверка наличия ключа lst = d.keys()
Список ключей d.close()
Закрытие полки
На базе модуля shelveсоздадим свой модуль. from shelve import * def put_shelve(key,data,fname): d = open(fname) d[key] = data d.sync() d.close() return 1 def get_shelve(key,fname): d = open(fname) if d.has_key(key): data=d[key] d.close() return data else: d.close() return 0 def del_shelve(key,fname): d = open(fname) if d.has_key(key): del d[key] d.sync() d.close() return 1 else: d.close() return 0
40 a={'10':('name1','age1'),'111':('2','3'),'121':('1','2')} put_shelve('key',a,'data.dat') b=get_shelve('key','data.dat') print b if del_shelve('key','data.dat'): print 'Данные удалены'
19.9. Модуль csv
Формат CSV (comma separated values – значения, разделенные запятыми) достаточно популярен для обмена данными между элек- тронными таблицами и базами данных. Следующий ниже пример по- священ записи в CSV-файл и чтению из него: mydata = [(1, 2, 3) , (1, 3, 4)] import csv
## Запись в файл: f = file("my.csv", "w") writer = csv.writer(f) for row in mydata: writer.writerow(row) f.close()
#Чтение из файла: reader = csv.reader(file("my.csv")) for row in reader: print row
В данном случае количество рекурсивных вызовов растет экс- поненциально от числа n, что совсем не соответствует временной сложности решаемой задачи.
При работе с рекурсивными функциями можно легко превысить глубину допустимой в Python рекурсии. Для настройки глубины ре- курсии следует использовать функцию setrecursionlimit(N) из моду- ля sys, установив требуемое значение N.
20. ФУНКЦИИ КАК ПАРАМЕТРЫ И РЕЗУЛЬТАТ
Функции являются такими же объектами Python, как числа, строки или списки. Это означает, что их можно передавать в качестве параметров функций или возвращать из функций.