Programming: Python:


В мире животных: Python 2



Абстракт. В статье рассмотрены действия с числовыми данными и списками, а также основные управляющие конструкции языка Python 2. Изложенный материал позволит читателю без затруднений использовать интерпретатор Python в качестве программируемого калькулятора, например, для решения нестандартных вычислительных задач - вычислений с длинными и комплексными числами.

Содержание

Интродюкшн. Всякий программист наверняка, хотя бы раз, да сталкивался с задачей, связанной с обработкой "длинных" чисел. И наверняка, если сталкивался, разработал для себя подпрограммы для работы с такими числами (или скачал из Интернета %)). Но что делать, если вдруг понадобилось спрограмить что-нибудь эдакое, под рукой своих инструментов нет, а времени на написание программы не то, что в обрез, а в пол-обреза?
Если на компе есть интерпретатор Python - считай, спасен! У Питона - встроенная поддержка длинных чисел. А также комплексных. Кроме прочего, у него очень удобная и понятная манера оформления кода. Сейчас мы разберем основные моменты этого языка, и, по прочтении статьи, читатель сможет самостоятельно справиться с написанием своей вычислительной Python-программы.

Обозначения. Фигурные скобки {} в определениях используются для обозначения необязательных элементов.

Где взять и как установить. Скачать установочный пакет можно с официального сайта разработчиков языка . Новейшая версия на момент написания статьи - 2.3.4 (2.4 еще идет как alpha 1). Приятно то, что в пакет установки входит удобно структурированная и полная документация по программированию в Питоне, поэтому отдельно скачивать документацию не нужно.
Будем считать, что мы скачали установочный файл Python-2.3.4.exe для Win32. Смело его запускаем и следуем инструкциям.

Как записать и запустить программу. После установки, в меню кнопки "Пуск" в разделе "Программы" появится подменю "Python 2.0". Для запуска интерпретатора языка необходимо выбрать в это подменю пункт "IDLE (Python GUI)". В результате появится окно интерпретатора с заголовком "Python Shell". Это окно предназначено для интерактивного ввода команд. Каждая вводимая строка тут же и выполняется. Программу можно записать и в таком режиме, но это неудобно. Для того, чтобы работать с текстом программы в обычном режиме, необходимо нажать [Ctrl+N] - создать новое окно. В этом окне уже можно вводить текст программы как в обычном текстовом редакторе.

Примечание - А.Р.
Безусловно, текст Питон-программы можно записать в любом текстовом редакторе, но встроенный редактор IDLE удобен тем, что автоматически расставляет отступы и, при необходимости, увеличивает их. Кроме того, имеется очень полезная возможность закомментировать/раскомментировать выделенный код.


После набора текста программы запустить ее можно, нажав комбинацию [Ctrl+F5]. Не забудем сохранить программу перед запуском. Если же мы все-таки забудем, система напомнит об этом сама, т.к. запускать можно только программу, сохраненную в дисковом файле. При запуске программы активным становится окно Python Shell - то, которое мы открыли первым. Весь вывод программы и сообщения об ошибках будут отображаться в этом окне.

Как выглядит Питон-программа. Никаких особых обозначений для начала либо конца программы не нужно. Также нет никаких особых условий на порядок следования элементов программы (кроме здравого смысла, разумеется). Записываем инструкции в обычный текстовый файл - вот она и программа.

Данные. Всякий элемент данных в Питоне - это объект. Всякий объект имеет подпись (identity), тип и значение.
Подпись - штука постоянная и уникальная: с ее помощью можно однозначно определить, тождественны ли два объекта (такую проверку выполняет оператор is).
Тип - указывает на поддерживаемые объектом операции и его возможные значения. Тип объекта неизменяем. В Питоне типы переменных явно не указываются. Они определяются из контекста.

Примечание - А. Р.
Кажущееся изменение типа при присваивании объектов с разными типами на самом деле не является таковым: после присваивания x=y, x и y - один и тот же объект (точнее, x и y - ссылаются на один и тот же объект).


Все объекты делятся на изменяемые (mutable) и неизменяемые (immutable). Понятия "изменяемый" и "не-" являются довольно тонкими и связаны с возможностью изменения значения самого объекта после его создания. Изменяемость объекта однозначно определяется по его типу.

Далее мы рассмотрим числовые типы и тип-список, как наиболее востребованные при составлении вычислительных программ.

Числовые типы. Относятся к неизменяемым. Т.е. для объекта x такого типа нельзя написать, например, x.value = 3. Для изменения значения нужно писать x = 3 - присваивание объекта.

1. Целый (plain integer) тип.
Размер может варьироваться от 32 бит и выше - в зависимости от аппаратуры. В любом случае, выделяемая память - не меньше 32 бит. Диапазон допустимых значений: не уже -2147483648..2147483647.
Литералы, представляющие числа целого типа, могут задаваться в одной из трех систем счисления: 8-, 10-, и 16-ричной. Восьмеричный литерал начинается с 0 (012 = десятичное 10), десятичный с ненулевой десятичной цифры (12 = десятичное 12), а 16-ный - с 0x или 0X (0x12 = 0X12 = десятичное 18). Разумеется, все цифры литерала должны соответствовать выбранной системе счисления.
В случае 32-битового типа для 8- и 16-ричной систем допустимы литералы, обозначающие десятичные значения 0..4294967295, но значения, большие 2147483647, преобразовываются в отрицательное число (вычитанием 4294967296).
2. Длинный целый (long integer) тип.
Единственное ограничение на значения длинных целых чисел заключается в объеме доступной памяти. Не хило, правда?
Литералы, представляющие числа длинного целого типа, образуются приставкой к числу целого формата префикса l либо L (1L - длинное целое, хотя и вмещается в 32 бита).
3. Тип с плавающей точкой (floating point).
В Питоне представлен только числами с двойной точностью (уровня математического сопроцессора). Как написано в документации, "... нет причин усложнять язык двумя типами чисел с плавающей точкой". Диапазон допустимых значений зависит от аппаратуры.
Литералы, представляющие числа этого типа, задаются либо в записи через точку, либо в экспоненциальном виде (5.2e-1 = 5.2E-1 = 0.52, 5.2e+1 = 5.2E+1 = 52). Всегда трактуются как десятичные (03.5 - синтаксическая ошибка). Поддерживается сокращенная запись: 1. = 1 с плавающей точкой, .1 = 0.1. Показатель степени в экспоненциальной форме записи может быть только целым (1.2e+0.2 - синтаксическая ошибка).
4. Комплексный (complex) тип.
Представляет собой упорядоченную пару чисел с плавающей точкой. Все, сказанное выше о числах с плавающей точкой, верно и для обеих составляющих комплексного числа.
Литералов, представляющих комплексные числа, - нет. Есть только литералы, представляющие мнимые числа, т.е. комплексные числа с нулевой действительной частью. Такие литералы образуются с помощью префикса j либо J (12j = 12J = 0.0+12i).
Комплексные числа с ненулевой действительной частью образуются суммированием действительного числа и мнимого: (4+7j) - комплексное число.
Доступ (на чтение!) к действительной и мнимой компонентам комплексного числа z: z.real, z.imag.

Тип-список. Список - это изменяемая упорядоченная последовательность элементов (т.е. по форме - обычный массив) не обязательно одинакового типа. Обращение к i-му элементу списка A производится так: A[i]. Также можно задействовать несколько стоящих подряд элементов:

A[i:j]
- выбираются элементы с индексами i..(j-1)
A[i:]
- выбираются все элементы A, начиная с i-го
A[:j]
- выбираются все элементы A, заканчивая (j-1)-м
A[:]
- копия списка A
Если список имеет длину N, тогда его элементы имеют номера 0..N-1. Т.к. список - изменяем, доступ к его элементам - как на чтение, так и на запись.
Создаются списки так: A = [a0,a1,...,aN-1] - простым перечислением элементов в квадратных скобках.

Примечание - А.Р.
Если элементы перечислить в круглых скобках, это был бы уже другой тип - один из вариантов неизменяемых последовательностей, которые в этой статье мы рассматривать не будем.

Операторы. Числовые операторы. Разберемся сначала, по каким правилам Питон выполняет приведение типов переменных к общему, если аргументы бинарного оператора имеют различные типы.

Итак, правила приведения числовых типов:

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

Арифметические
Унарные
+x
- оставляет x неизменным
-x
- изменяет знак x на противоположный
Бинарные
x+y, x-y, x*y
- сложение, вычитание, умножение
x/y
- деление. Если оба аргумента - целочисленные, результатом будет наименьшее целое число, не превышающее частного аргументов
x%y
- возвращает остаток от деления аргументов. Работает и для нецелых чисел (12.37%2.01 = 0.31)
x**y
- возведение x в степень y
Побитовые (применимы только к числам целых типов)
Унарные
~x
- побитовое инвертирование (отрицание) x
Бинарные
x&y
- булево умножение (логическое "И")
x|y
- булево сложение (логическое "ИЛИ")
x^y
- булево сложение по модулю 2 (логическое "ИСКЛЮЧАЮЩЕЕ ИЛИ")
Операторы сдвига (применимы только к числам целых типов)
x<<n (x>>n)
- сдвиг x на n (n≥0) бит влево (вправо)

Операторы над списками.

X+Y
- слияние списков
A*n, n*A
- слияние n копий списка A. Случай n<0 трактуется как и n=0 - в результате получаем пустой список

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

not x
- если x есть ложь, возвращается 0. В противном случае - 1
x or y
- если x есть истина, возвращается значение x. В противном случае возвращается значение y
x and y
- если x есть ложь, возвращается значение x. В противном случае возвращается значение y

Операции сравнения. Все сравнения возвращают 0 либо 1. Сравнения могут быть связаны в цепочку: a<b<c - то же самое, что и a<b and b<c (вот только, если b является выражением, тогда в первом случае оно вычисляется один раз, а во втором - два). Цепочки могут иметь произвольную длину и содержать любые операции. Раскрываются они, как в указанном примере, через логическое "И" всех сравнений, составляющих цепочку. Например, a<b>=c - то же, что и a<b and b>=c (смотрится несколько необычно, не правда ли?)
Перед числовым сравнением аргументы приводятся к общему типу.
Списки сравниваются путем поочередного сравнения элементов с одинаковыми индексами, начиная с 0.
Объекты разных типов всегда считаются неравными.

x<y
- меньше
x>y
- больше
x==y
- равно
x>=y
- больше либо равно
x<=y
- меньше либо равно
x<>y
- не равно
x!=y
- не равно
x is y
- проверка тождественности объектов. Негативная форма - is not: x is not y
x in A
- проверка, содержит ли правый аргумент-список значение-левый аргумент. Негативная форма - not in: x not in A
Операторы <> и != - эквиваленты, но предпочтение стоит отдавать оператору != (в стиле Си), т.к. <> - считается устаревшим.

Приоритеты операторов (в порядке возрастания).

or
and
not
in, not in
is, is not
<, <=, >, >=, <>, !=, ==
|
^
&
<, >
+, -
*, /, %
**
+x, -x
~x
Для явного указания приоритетов, как и в любом другом языке программирования, можно использовать круглые скобки.

Имена и пространства имен. Имена переменных могут содержать символы 'a'..'z','A'..'Z','0'..'9','_'. Первый символ имени - буква или символ подчеркивания. Длина имен ограничения не имеет. Регистр символов - учитывается, т.е. var и Var - два разных имени.

В Питоне всякое имя может принадлежать локальному, глобальному либо встроенному (built-in) пространствам имен. Локальное пространство присутствует, например, в функциях. Глобальное - пространство основной программы. Поиск соответствия между именем и объектом производится в порядке Л - Г - В. Если, к примеру, в функции используется имя x, но в самой функции и ее формальных параметрах оно не определено, производится поиск в глобальном пространстве - все такие имена "видны" из тела функции. Но это "видение" дает доступ исключительно на чтение: присваивание приводит к появлению локального имени, а расширенное присваивание - к ошибке (о присваиваниях написано ниже). Для того, чтобы можно было использовать имена из глобального пространства в левой части присваиваний, необходимо в теле функции объявить желаемые имена переменных со словом global: global x,y,z.

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

Примеры.

x = 5
a = 4; b = a + 5
Комментарий начинается с символа '#' и продолжается до конца строки. Многострочных комментариев - нет.

Примечание - А.Р.
По крайней мере, на моей машине с WinXP и Python 2.0.1, мне не удалось "русифицировать" Питон по части кириллических символов в тексте программы и, в том числе, в комментариях: если набирать в русской раскладке, выводятся символы cp1252, перекодированные из cp1251, и манипуляции с реестром (как для Photoshopа) ничего не дают! При вставке же из буфера, в окне появляются верные символы, однако Питон выдает ошибку даже при попытке сохраниться.
Поэтому во всех примерах комментарии будем записывать на транслите.


Примеры.
# Programma nichego ne delaet
i = 0 # Zadaem nachalnoe znachenie i
Присваивание имеет расширенный синтаксис по сравнению с другими языками.
Как справа, так и слева от знака равенства могут стоять списки: слева - список переменных, справа - список значений. Если это не вызывает двусмысленности, скобки для обозначения списков можно не ставить. Главное, чтобы количество объектов по обе стороны знака равенства совпадало. Присваивания могут быть связаны в цепочку. При присваивании сначала вычисляется все, что стоит в правой части, а затем вычисленные значения поочередно присваиваются тому, что стоит в левой части. Поэтому, например, выражение a, b = b, a - не приводит к "затиранию" значений, а корректно обменивает значения переменных a и b.

Примеры.
x = 2
a, b = -4, 5
z, y = [1,2,3], [4,7,[6,9]]
p, r, [s, u] = [1,2], 3, [4, [5,6,7]]
i, j = k, m = n = 0, 4
Последнее присваивание не ошибочно (как может показаться), т.к. для списка [0, 4] просто опущены скобки, отсутствие которых в данном случае не приводит к двусмысленности

Примеры ошибок.
x, y = 1
- справа не хватает еще одного значения
a, b, c = 1, 2, 3, 4
- справа - лишнее значение
z, [y, p] = 1, 2, 4
- справа нужны скобки вокруг [2,4]

Кроме обычного присваивания, в Питоне есть и расширенные присваивания в стиле Си, которые получаем, приставляя слева к знаку равенства символы бинарных операций, например: x += y (x = x + y). В общем случае: x op= y - то же, что и x = x op y. Объединять такие присваивания в цепочки нельзя.

Примечание - А.Р.
Не смотря на то, что в документации написано, что по обе стороны расширенного присваивания, как и прежде, могут находиться списки, интерпретатор для такого "списочного" присваивания выдает ошибку и пишет, что "расширенное присваивание к спискам неприменимо".


break, continue - влияют на ход выполнения циклов for, while. Рассматриваются ниже, вслед за циклами.

return {список_выражений} - возвращает в качестве значения функции список значений, вычисленных по списку_выражений. Примеры см. далее в разделе, посвященном определению функций.

print {список_выражений} - вывод на стандартное устройство вывода (по умолчанию - монитор) списка значений, вычисленного по списку_выражений. Перед каждым, отдельно взятым, выводимым значением печатается пробел. Если в конце списка_выражений поставлена запятая, print не будет переводить курсор на строку ниже. Если нет - следующий вывод будет начинаться на следующей строке. Текстовые сообщения, входящие в список_выражений, нужно заключать в двойные или одинарные кавычки. Элементы списков, содержащихся в списке_выражений, выводятся в скобках через запятую.

Примеры.
Вывод значения переменной x
print "x = ",x

Вывод значения выражения a*b*c
print "a*b*c =",a*b*c

Вывод значения переменных a, b, c без перевода строки
print a,b,c,

Вывод "1" - на первой строке, "2 3 4" - на второй и "5" - на третьей
print 1
print 2,3,
print 4
print 5

Составные предложения. Они содержат другие предложения - простые и составные - и неким образом на них действуют либо управляют их выполнением.
Всякое составное предложение имеет такой вид: тип_предложения: сгруппированный_код

В общем случае, сгруппированный_код охватывает несколько строк кода, но можно записывать их и в одну строку, пользуясь разделителем ';'. Если сгруппированный_код охватывает несколько строк, все эти строки должны иметь одинаковый отступ слева - на 1 или более пробелов больший отступа для тип_предложения - таков принцип группирования многострочного кода в Питоне. Эта особенность языка позволяет сделать логическую структуру программы максимально прозрачной. Да и, вообще, - удобно таким образом оформлять код.

В качестве типов предложений мы рассмотрим if, for, while и определение функций.
Условное предложение.

if условное_выражение1: код1
{elif условное_выражение2: код2}
{elif условное_выражение3: код3}
{...}
{elif условное_выражениеN_1: кодN_1}
{else кодN}
Каждый elif - это сокращенная форма записи пары else if.
Если верно условное_выражение1, выполняется код1; иначе, если верно условное_выражение2, выполняется код2... Если ни одно из условных_выражений не оказалось истинным, выполняется кодN.

Примеры.
Извлечение квадратного корня из x, если x≥0
if x>=0: x **= 0.5
Определение большего из чисел a, b
if a>b: max = a
else: max = b
Если x принадлежит одному из непересекающихся интервалов (a,b) и (c,d), присвоить переменным r и p, соответственно, величину ширины выбранного интервала и координату его середины; иначе присвоить r=0
if a<x<b:
 r = b-a
 p = (a+b)/2
elif c<x<d: r = d-c; p = (c+d)/2
else: r = 0
Пример неверной записи.
Сгруппированные строки кода можно писать либо через ';', либо с одинаковым отступом. Миксовать ';' и отступы нельзя.
if x==2: y = 3;
 z = 4
else: y = 2
Цикл с параметром.
for переменная in список_значений: тело_цикла
{else: код_завершения}
В отличие от других языков, в Питоне цикл for выполняется для всех значений из заданного списка_значений. На элементы списка никакие ограничения не накладываются. Его элементами могут быть также и списки. После естественного завершения цикла выполняется код_завершения. Если цикл был прерван посредством break, код_завершения не выполняется.
Особо обращаю внимание читателя на то, что если внутри тела_цикла изменяется длина списка_значений (вставлен новый элемент или удален существующий), при выполнении цикла некоторые значения из списка_значений могут быть пропущены. Это связано с внутренним механизмом цикла for в Питоне.

Для создания привычного цикла по арифметической прогрессии (например, в Паскале - for i=1 to N, Си - for ( i=1; i<=N; i+=3)) полезной оказывается функция range(), которая возвращает список элементов арифметической прогрессии с заданными параметрами.
Формат вызова: range({start,} stop{, step}). Тип всех аргументов - целый (не длинный). Как видно, обязательным является только параметр stop. Значения по умолчанию для двух других: start = 0, step = 1. step - задает шаг прогрессии, start - значение первого элемента. Если step>0, тогда последний элемент возвращаемого списка - наибольшее значение вида start+i*step (i≥0), не превышающее stop. Если step<0, последний элемент возвращаемого списка - наименьшее значение вида start+i*step (i≥0), превышающее stop.
Некоторые частные случаи: range(N) - список значений 0..N-1, range(1,N+1) - список значений 1..N.

Примеры.
Вычисление суммы первых N натуральных чисел.
s = 0
for i in range(1,N+1):
 s += i
print "Sum = ",s
Вычисление суммы натуральных чисел, кратных K и не превышающих N
s = 0
for i in range(K,N+1,K)
 s += i
print "Sum = ",s
Слияние списков
A = [1,2,3]
B = [4,5]
C = [6,7,8]
D = []
for i in [A,B,C]:
 D += i
print "A+B+C = ",D
Цикл с предусловием.
while условное_выражение: тело_цикла
{else: код_завершения}
Тело_цикла выполняется, пока условное_выражение верно. Если при первом вычислении условного_выражения оно оказалось ложным, тело_цикла не выполнится ни разу. После естественного завершения цикла выполняется код_завершения. Если цикл был прерван посредством break, код_завершения не выполняется.

Примеры.
Вычисление наибольшего общего делителя чисел a и b. Алгоритм Евклида.
x, y = a, b
while x!=y:
 while x>y:
  x -= y
 x, y = y, x
print "NOD(",a,",",b,") = ",x
Управление ходом выполнения циклов. break - прерывает выполнение ближайшего охватывающего цикла for или while.
continue - приводит к переходу на начало тела цикла for или while. Для цикла for производится переход к следующему значению параметра цикла.

Примеры.
Определяем, равно ли нулю одно из чисел a, b, c
for i in [a,b,c]:
 if i==0:
  print "a*b*c = 0"
  break
else: print "a*b*c !=0"
Суммирование величин, обратных ненулевым элементам списка A
s = 0
for i in A:
 if i==0: continue # na nol delit nelzya
 s += 1/i
print "Sum = ",s
Поиск первого нуля в списке A, содержащем, как минимум, один ноль
i = 0
while 1:
 if not A[i]: break
 i += 1
print "A[",i,"]= 0"
Вычисление модуля вектора (списка) A
m, i = 0, 0
while i<len(A):
 i += 1
 if A[i-1]==0: continue
 m += A[i-1]**2
print "|A| = ",m**0.5
Определение функций.
def имя_функции (список_параметров): код_функции
В списке_параметров через запятую перечисляются имена формальных параметров. Чтобы указать, что, кроме указанных, функция может принимать произвольное количество аргументов, необходимо добавить еще один формальный параметр и перед его именем поставить символ '*'. Параметр, помеченный '*', может стоять только последним. При вызове такой функции все дополнительные параметры будут помещены в неизменяемый список с соответствующим именем. Для параметров можно указывать и значения по умолчанию - через знак равенства. Как и в Си, параметры со значениями по умолчанию должны стоять последними в списке_параметров.
Возврат значения функции производится так: return {список_выражений}. Если список_выражений опущен (т.е. имеем не функцию, а процедуру), возвращается объект None, который можно проверить с помощью оператора is (is not). Если предложение return опущено, по достижении конца кода_функции возвращается объект None.

Примеры.
Функция для вычисления факториала числа
def fact(n):
 k=1L # nachalnoe znachenie factoriala. Ono zhe - rezultat dlya n=0,1
 for m in range(2,n+1): k *= m
 return k
fact(4) = 24
fact(0) = 1
fact(21) = 51090942171709440000
Функция для вычисления суммы цифр числа n в системе счисления с основанием base≥2
def sumdig( n, base=10): # opredelyaem desyatichnuyu sistemu no umolchaniyu
 s = 0 # nachalnoe znachenie summiy
 while n:
  s += n % base # zanosim v summu ocherednuyu tsifru
  n /= base # perehod k sleduyuschey tsifre
 return s
sumdig(10,2) = 2
sumdig(38983) = 31
sumdig(87324,8) = 20
sumdig(173,3) = 5
Функция для суммирования произвольного количества переданных ей чисел
def sum(*a):
 s = 0
 for i in a: s += i
 return s
sum(1,2,3,4,5) = 15
sum(-1,1,10,20,100) = 130

Некоторые полезные встроенные функции.

Числовые (работают на всех числовых типах)
abs(x)
- модуль x
pow(x,y)
- x в степени y
Списковые
len(A)
- длина списка A
min(A), max(A)
- минимальный и максимальный элемент списка A

Методы объекта "список". Т.к. список - объект, у него есть свои методы. Они могут оказаться полезными при работе.

append(x)
- добавление элемента со значением x в конец списка
extend(L)
- добавление в конец списка всех элементов списка L
insert(i, x)
- вставка элемента со значением x перед i-м элементом. Именно вставка, т.к. индексы всех элементов с номерами k≥i в результате вставки увеличиваются на 1
remove(x)
- удаление из списка первого элемента со значением x. Если такого элемента нет - ошибка
pop({i})
- удаление из списка элемента с заданным индексом и возвращение его значения. Если индекс не указан - работает последний элемент списка
index(x)
- возвращение индекса первого элемента списка со значением x. Если такого элемента нет - ошибка
count(x)
- возвращение количества повторений значения x среди элементов списка
sort()
- сортировка элементов списка. Отсортированный список помещается на место исходного
reverse()
- изменение порядка следования элементов списка на обратный

Примеры.
A = [1,2,4]
A.append(5) # A = [1,2,4,5]
A.extend([25,3,10]) # A = [1,2,4,5,25,3,10]
A.insert(2,3) # A = [1,2,3,4,5,25,3,10]
A.remove(4) # A = [1,2,3,5,25,3,10]
x = A.pop() # x = 10, A = [1,2,3,5,25,3]
i = A.index(5) # i = 3
c = A.count(3) # c = 2
A.sort() # A = [1,2,3,3,5,25]

Модули math и cmath. В Питоне есть множество стандартных модулей, содержащих полезные функции на все случаи жизни. Например, модуль math - содержит математические функции для действительных чисел, а cmath - для комплексных.
Подключение модуля к программе осуществляется очень просто - с помощью предложения import имя_модуля. Для доступа к функциям или переменным модуля необходимо использовать приставку "имя_модуля." перед именем: math.pi, math.cos(1).

Рассмотрим состав модулей math и cmath. В них обоих определены следующие константы:

pi
- число "пи"
e
- основание натурального логарифма

Функции модуля math работают только с действительными числами и возвращают действительное значение. Функции модуля cmath работают с комплексными и действительными числами (которые при передаче аргументов преобразуются в комплексные) и их результат - всегда комплексное число, даже если мнимая часть равна нулю.
Большинство функций в модуле math имеют соответствующую версию в модуле cmath и наоборот.
Вот эти общие функции:
acos(z)
- арккосинус
asin(z)
- арксинус
atan(z)
- арктангенс
cos(z)
- косинус
cosh(z)
- гиперболический косинус
exp(z)
- экспонента
log(z)
- натуральный логарифм
log10(z)
- логарифм по основанию 10
sin(z)
- синус
sinh(z)
- гиперболический синус
sqrt(z)
- квадратный корень
tan(z)
- тангенс
tanh(z)
- гиперболический тангенс

Некоторые функции модуля math, у которых нет аналогов в cmath:
atan2(y, x)
- возвращает atan(y/x)
ceil(x)
- наименьшее целое число, превышающее x
fabs(x)
- модуль
floor(x)
- наибольшее целое число, не превышающее x
pow(x, y)
- возведение x в степень y

Функции модуля cmath, у которых нет аналогов в math:
acosh(x)
- ареа-косинус
asinh(x)
- ареа-синус
atanh(x)
- ареа-тангенс

Примеры.
import math
print math.cos(math.pi) # vivod "-1"
x = 1
print math.cos(x)**2+math.sin(x)**2 # vivod "1"
print math.asin(1) # vivod "pi/2"
import cmath
z = 2+3j
print cmath.log(cmath.sinh(z)+cmath.cosh(z)) # vivod 2+3j, t.k. chx+shx=exp(x)
print cmath.sqrt(z)**2 # vivod 2+3j

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

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

Александр Рябов. Июль 2004, Украина.
ryabov@ua.fm






При перепечатке любого материала с сайта, видимая ссылка на источник www.warayg.narod.ru и все имена, ссылки авторов обязательны.

© 2005