Язык программирования Python - Роман Сузи 6 стр.


Модули math и cmath

В этих модулях собраны математические функции для действительных и комплексных аргументов. Это те же функции, что используются в языке C. В таблице ниже даны функции модуля math. Там, где аргумент обозначен буквой z, аналогичная функция определена и в модуле cmath.

Функция или константаОписание
acos(z)арккосинус z
asin(z)арксинус z
atan(z)арктангенс z
atan2(y,x)atan(y/x)
ceil(x)наименьшее целое, большее или равное x
cos(z)косинус z
cosh(x)гиперболический косинус x
eконстанта e
exp(z)экспонента (то есть, e**z)
fabs(x)абсолютное значение x
floor(x)наибольшее целое, меньшее или равное x
fmod(x,y)остаток от деления x на y
frexp(x)возвращает мантиссу и порядок x как пару (m, i), где m - число с плавающей точкой, а i - целое, такое, что x = 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)возвращает пару (y,q) - целую и дробную часть x. Обе части имеют знак исходного числа
piконстанта π
pow(x,y)x**y
sin(z)синус z
sinh(z)гиперболический синус z
sqrt(z)корень квадратный от z
tan(z)тангенс z
tanh(z)гиперболический тангенс z

Модуль 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), которая позволяет установить генератор случайных чисел в некоторое состояние. Например, если возникнет необходимость многократного использования одной и той же последовательности псевдослучайных чисел.

Модуль time

Этот модуль дает функции для получения текущего времени и преобразования форматов времени.

Модуль sets

Модуль реализует тип данных для множеств. Следующий пример показывает, как использовать этот модуль. Следует заметить, что в Python 2.4 и старше тип set стал встроенным, и вместо sets.Set можно использовать set:

import sets

A = sets.Set([1, 2, 3])

B = sets.Set([2, 3, 4])

print A | B, A & B, A - B, A ^ B

for i in A:

if i in B:

print i,

В результате будет выведено:

Set([1, 2, 3, 4]) Set([2, 3]) Set([1]) Set([1, 4])

2 3

Модули array и struct

Эти модули реализуют низкоуровневый массив и структуру данных. Основное их назначение - разбор двоичных форматов данных.

Модуль itertools

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

Модуль locale

Модуль locale применяется для работы с культурной средой. В конкретной культурной среде могут использоваться свои правила для написания чисел, валют, времени и даты и т.п. Следующий пример выводит дату сначала в культурной среде "C", а затем на русском языке:

import time, locale

locale.setlocale(locale.LC_ALL, None)

print time.strftime("%d %B %Y", time.localtime (time.time()))

locale.setlocale(locale.LC_ALL, "ru_RU.KOI8–R")

print time.strftime("%d %B %Y", time.localtime (time.time()))

В результате:

18 November 2004

18 Ноября 2004

Модуль gettext

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

Поддержка цикла разработки

Модули этого раздела помогают поддерживать документацию, производить регрессионное тестирование, отлаживать и профилировать программы на Python, а также обслуживают распространение готовых программ, создавая среду для конфигурирования и установки пакетов.

В качестве иллюстрации можно предположить, что создается модуль для вычисления простых чисел по алгоритму "решето Эратосфена". Модуль будет находиться в файле Sieve.py и состоять из одной функции primes(N), которая в результате своей работы дает все простые (не имеющие натуральных делителей кроме себя и единицы) числа от 2 до N:

import sets

import math

"""Модуль для вычисления простых чисел от 2 до N """

def primes(N):

"""Возвращает все простые от 2 до N"""

sieve = sets.Set(range(2, N))

for i in range(2, math.sqrt(N)):

if i in sieve:

sieve -= sets.Set(range(2*i, N, i))

return sieve

Модуль pdb

Модуль pdb предоставляет функции отладчика с интерфейсом - командной строкой. Сессия отладки вышеприведенного модуля могла бы быть такой:

>>> import pdb

>>> pdb.runcall(Sieve.primes, 100)

> /home/rnd/workup/intuit–python/examples/Sieve.py(15)primes()

-> sieve = sets.Set(range(2, N))

(Pdb) l

10 import sets

11 import math

12 """Модуль для вычисления простых чисел от 2 до N """

13 def primes(N):

14 """Возвращает все простые от 2 до N"""

15 -> sieve = sets.Set(range(2, N))

16 for i in range(2, int(math.sqrt(N))):

17 if i in sieve:

18 sieve -= sets.Set(range(2*i, N, i))

19 return sieve

20

(Pdb) n

> /home/rnd/workup/intuit–python/examples/Sieve.py(16)primes()

-> for i in range(2, int(math.sqrt(N))):

(Pdb) n

> /home/rnd/workup/intuit–python/examples/Sieve.py(17)primes()

-> if i in sieve:

(Pdb) n

> /home/rnd/workup/intuit–python/examples/Sieve.py(18)primes()

-> sieve -= sets.Set(range(2*i, N, i))

(Pdb) n

> /home/rnd/workup/intuit–python/examples/Sieve.py(16)primes()

-> for i in range(2, int(math.sqrt(N))):

(Pdb) p sieve

Set([2, 3, 5, 7, 9, 11, 13, 15, 17, 19, 21, 23, 25, 27, 29, 31, 33, 35, 37, 39,

41, 43, 45, 47, 49, 51, 53, 55, 57, 59, 61, 63, 65, 67, 69, 71, 73, 75, 77, 79,

81, 83, 85, 87, 89, 91, 93, 95, 97, 99])

(Pdb) n

> /home/rnd/workup/intuit–python/examples/Sieve.py(17)primes()

-> if i in sieve:

(Pdb) n

> /home/rnd/workup/intuit–python/examples/Sieve.py(18)primes()

-> sieve -= sets.Set(range(2*i, N, i))

(Pdb) n

> /home/rnd/workup/intuit–python/examples/Sieve.py(16)primes()

-> for i in range(2, int(math.sqrt(N))):

(Pdb) p sieve

Set([2, 3, 5, 7, 11, 13, 17, 19, 23, 25, 29, 31, 35, 37, 41, 43, 47, 49,

53, 55, 59, 61, 65, 67, 71, 73, 77, 79, 83, 85, 89, 91, 95, 97])

Модуль profile

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

Продолжая пример с решетом Эратосфена, стоит посмотреть, как тратится процессорное время при вызове функции primes():

>>> profile.run("Sieve.primes(100000)")

709 function calls in 1.320 CPU seconds

Ordered by: standard name

ncalls tottime percall cumtime percall filename:lineno(function)

1 0.010 0.010 1.320 1.320 <string>:1(?)

1 0.140 0.140 1.310 1.310 Sieve.py:13(primes)

1 0.000 0.000 1.320 1.320 profile:0(Sieve.primes(100000))

0 0.000 0.000 profile:0(profiler)

65 0.000 0.000 0.000 0.000 sets.py:119(__iter__)

314 0.000 0.000 0.000 0.000 sets.py:292(__contains__)

65 0.000 0.000 0.000 0.000 sets.py:339(_binary_sanity_check)

66 0.630 0.010 0.630 0.010 sets.py:356(_update)

66 0.000 0.000 0.630 0.010 sets.py:425(__init__)

65 0.010 0.000 0.540 0.008 sets.py:489(__isub__)

65 0.530 0.008 0.530 0.008 sets.py:495(difference_update)

Здесь ncalls - количество вызовов функции или метода, tottime - полное время выполнения кода функции (без времени нахождения в вызываемых функциях), percall - тоже, в пересчете на один вызов, cumtime - аккумулированное время нахождения в функции, вместе со всеми вызываемыми функциями. В последнем столбце приведено имя файла, номер строки с функцией или методов и его имя.

Примечание:

"Странные" имена, например, __iter__, __contains__ и __isub__ - имена методов, реализующих итерацию по элементам, проверку принадлежности элемента (in) и операцию -=. Метод __init__ - конструктор объекта (в данном случае - множества).

Модуль unittest

При разработке программного обеспечения рекомендуется применять так называемые регрессионные испытания. Для каждого модуля составляется набор тестов, по возможности таким образом, чтобы проверялись не только типичные вычисления, но и "крайние", вырожденные случаи, чтобы испытания затронули каждую ветку алгоритма хотя бы один раз. Тест для данного модуля (написанный сразу после того, как определен интерфейс модуля) находится в файле test_Sieve.py:

# file: test_Sieve.py

import Sieve, sets

import unittest

class TestSieve(unittest.TestCase):

def setUp(self):

pass

def testone(self):

primes = Sieve.primes(1)

self.assertEqual(primes, sets.Set())

def test100(self):

primes = Sieve.primes(100)

self.assert_(primes == sets.Set([2, 3, 5, 7, 11, 13,

17, 19, 23, 29, 31, 37, 41, 43, 47,

53, 59, 61, 67, 71, 73, 79, 83, 89, 97]))

if __name__ == '__main__':

unittest.main()

Тестовый модуль состоит из определения класса, унаследованного от класса unittest.TestCase, в котором описывается подготовка к испытаниям (метод setUp) и сами испытания - методы, начинающиеся на test. В данном случае таких испытаний всего два: в первом испытывается случай N=1, а во втором - N=100.

Запуск тестов производится выполнением функции unittest.main(). Вот как выглядят успешные испытания:

$ python test_Sieve.py

..

----------------------------------------------------------

Ran 2 tests in 0.002s

OK

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

Кстати, сам Python и его стандартная библиотека имеют тесты для каждого модуля - они находятся в каталоге test в месте, где развернуты файлы поставки Python, и являются частью пакета test.

Назад Дальше