Python на Symbian S60: математические функции и работа со временем + пример PyMath.py

Модуль math

Скачать пример PyMath.py

Модуль math предоставляет доступ к стандартным математическим функциям:

cos(x)

Возвращает косинус числа x.

sin(x)

Возвращает синус числа x.

tan(x)

Возвращает тангенс числа x.

acos(x)

Возвращает арккосинус числа x.

asin(x)

Возвращает арксинус числа x.

atan(x)

Возвращает арктангенс числа x.

atan2(x, y)

Эквивалентно atan(x/y). Аргумент y может быть равен нулю – в этом случае возвращается pi/2.

cosh(x)

Возвращает гиперболический косинус числа x.

sinh(x)

Возвращает гиперболический синус числа x.

tanh(x)

Возвращает гиперболический тангенс числа x.

log(x)

Возвращает натуральный логарифм числа x.

log10(x)

Возвращает десятичный логарифм числа x.

sqrt(x)

Возвращает квадратный корень из числа x.

pow(x, y)

Возвращает x в степени y и эквивалентно x**y.

Рис. 1. Функции из модуля math.

modf(x)

Возвращает кортеж из пары вещественных чисел – дробной и целой части x.

ceil(x)

Возвращает наименьшее вещественное число с нулевой дробной частью - большее, чем число x.

floor(x)

Возвращает наибольшее вещественное число с нулевой дробной частью - меньшее, чем число x.

fabs(x)

Возвращает абсолютное значение числа x.

fmod(x, y)

Возвращает остаток от деления x на y и эквивалентно x%y.

exp(x)

Возвращает e**x.

frexp(x)

Возвращает пару чисел в виде кортежа (m, e), где m – мантисса (вещественное число), а e – экспоненциальная часть (целое число). Для чисел m и e всегда выполняется условие x=m*2**e. Если аргумент x равен нулю, возвращает (0.0, 0). В противном случае всегда выполняется 0.5<=abs<1.

ldexp(m, e)

Функция обратная frexp() и возвращает m*(2**e).

hypot(x, y)

Возвращает длину гипотенузы прямоугольника со сторонами длиной x и y и эквивалентно sqrt(x*x+y*y).

Модуль также определяет две константы:

pi – число пи.

e – число e.

Модуль random

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

random()

Возвращает случайное вещественное число r, находящееся в диапазоне 0.0?r<1.0.

uniform(a, b)

Возвращает случайное вещественное число r, находящееся в диапазоне a?r

randrage(start, stop, step)

Возвращает случайное целое число r, находящееся в диапазоне range (start, stop, step).

choice(seq)

Возвращает случайный элемент из непустой последовательности seq (список или кортеж).

Рис. 2. Случайный элемент из списка.

Модуль time

Данный модуль предоставляет различные функции для работы со временем. Перед тем как начать описание, отмечу, что точкой отчета является 1970 год и любое время представлено в количестве секунд, прошедшей с этой даты.

altzone

Переменная хранит сдвиг часового пояса в секундах с учетом перехода на летнее время. Если часовой пояс находится восточнее Гринвича, то он принимает отрицательное значение:

>>> import time

>>> time.altzone

-14400

>>>

timezone

Хранит сдвиг часового пояса в секундах без учета перехода на летнее время.

>>> time.altzone

-10800

>>>

clock()

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

sleep(secs)

Останавливает выполнение программы на secs секунд.

time()

Возвращает время с начала эпохи по Гринвичу.

>>> time.time()

1186563710.0

>>>

ctime()

Возвращает местное время с начала эпохи.

>>> time.time()

1186574510.0

>>>

gmtime(secs)

Преобразует время secs (выражено в секундах) в кортеж, представляющее время по Гринвичу. Этот кортеж состоит из 9 целых чисел:

1) год (1970-2038);

2) месяц (1-12);

3) день (1-31);

4) час (0-23);

5) минута (0-59);

6) секунда (0-61);

7) день недели (0-6, 0 – это понедельник);

8) число дней от начала года (0-366);

9) флаг коррекции летнего времени (0, 1, -1).

>>> time.localtime(1186563710.0)

(2007, 8, 8, 6, 1, 50, 2, 220, -1)

>>>

localtime(secs)

Преобразует время secs (выражено в секундах) в кортеж, представляющий местное время.

>>> time.localtime(1186563710.0)

(2007, 8, 8, 9, 1, 50, 2, 220, -1)

>>>

mktime(time_tuple)

Преобразует кортеж time_tuple во время в секундах.

>>> time.localtime((2007, 8, 8, 6, 1, 50, 2, 220, -1))

1186563710.0

>>>

asctime(time_tuple)

Преобразует кортеж time_tuple в строку.

>>> time.asctime((2007, 8, 8, 6, 1, 50, 2, 220, -1))

‘Tue Aug 08 06:01:50 2007’

>>>

strftime(format, time_tuple)

Преобразует кортеж time_tuple в соответствии с форматом format в строку. Format представляет из себя строку, содержащую следующие управляющие символы:

1) %a – сокращенное название дня недели;

2) %A – полное название дня недели;

3) %b – сокращенно название месяца;

4) %B – полное название месяца;

5) %c – дата и время;

6) %d – десятичное представление даты (’01’– ’31’);

7) %H – десятичное представление часа (’00’–’23’);

8) %I – десятичное представление часа (’01’–’12’);

9) %j – десятичное представление года (’001’–’366’);

10) %m – десятичное представление месяца (’01’–’12’);

11) %M – десятичное представление минут (’01’–’59’);

12) %p – обозначение ‘AM’ (до полудня) или ‘PM’ (после полудня);

13) %S – десятичное представление секунд (’00’–’61’);

14) %U – десятичное представление порядкового номера недели (‘00’–’53’);

15) %w – десятичное представление дня недели (’0’–’6’);

16) %W – десятичное представление порядкового номера недели (’00’–’53’);

17) %x – дата;

18) %X – время;

19) %y – представление года без указания века (’00’–’99’);

20) %Y – полное десятичное представление года;

21) %Z – название часового пояса;

22) %% – символ ‘%’.

>>> time.strftime(‘%a %b %d %H:%M:%S %Y’, (2007, 8, 8, 6, 1, 50, 2, 220, -1))

‘Tue Aug 08 06:01:50 2007’

>>>

Рис. 3. Московское время.

 

strptime(string, format)

Разбирает строку string в соответствии с форматом format (смотри выше) и возвращает кортеж.

>>> time.strptime(‘Tue Aug 08 06:01:50 2007’, ‘%a %b %d %H:%M:%S %Y’)

(2007, 8, 8, 6, 1, 50, 2, 220, -1)

>>>

Вместе со статьей идет пример PyMath.py, который дает возможность осуществить все возможные математические действия над числами, получить случайные числа, показать время в различной форме. Теперь подробнее.

PyMath.py

Скачать пример PyMath.py

В начале программы, как всегда, подключаем необходимые модули:

import e32,appuifw,math,random,operator,time

Новый модуль operator включает арифметические функции, аналогичные  обычным операторам. Т.е. операцию сложения – «1+2» – можно написать как operator.add(1, 2). Зачем это нужно? Читайте дальше.

Описание меню:

appuifw.app.menu = [

(u'Арифметика', (

(u'сложить', lambda:two(operator.add)),

(u'вычесть', lambda:two(operator.sub)),

(u'умножить', lambda:two(operator.mul)),

(u'поделить', lambda:two(operator.div)),

(u'подкорень', lambda:one(math.sqrt)),

(u'возвести в', lambda:two(math.pow)))),

(u'Тригоном-ие', (

(u'синус', lambda:one(math.cos)),

(u'косинус', lambda:one(math.sin)),

(u'тангенс', lambda:one(math.tan))),

(u'Обр-ые тригоном-ие', (

(u'арксинус', lambda:one(math.acos)),

(u'арккосинус', lambda:one(math.asin)),

(u'арктангенс', lambda:one(math.atan)))),

(u'Гиперболические', (

(u'гип-ий синус', lambda:one(math.cosh)),

(u'гип-ий косинус', lambda:one(math.sinh)),

(u'гип-ий тангенс', lambda:one(math.tanh)))),

(u'Логарифмические', (

(u'натуральный логарифм', lambda:one(math.log)),

(u'десятичный логарифм', lambda:one(math.log10)))),

(u'Время', (

(u'с начала вкл-ия', lambda:out(time.strftime('%H:%M:%S',time.gmtime( time.clock())))),

(u'часовой пояс', lambda:out(time.altzone/3600)),

(u'дата', lambda:out(time.strftime('%A %d %Y',time.localtime()))))),

(u'Случ-ое число', lambda:two(random.uniform)),

(u'Выйти', exit)]

Рис. 4. Немаленькое меню получилось у программы.

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

Участок кода для определения источника запуска программы стандартен, поэтому рассмотрю остальные функции программы.

def out(argument):

appuifw.query(u'Ответ:', 'text', unicode(argument)).

Рис. 5. Быстро и удобно выводим любую информацию.

Функция для вывода информации пользователю:

def one(function):

argument=appuifw.query(u'Введите аргумент функции:', 'float')

if argument:

try:

result=function(argument)

except:

appuifw.note(u'Плохой аргумент.', 'error')

else:

out(result)

Функция для обработки одноаргументных функций (с помощью lambda передается имя функции, имеющей один аргумент):

1) запрос у пользователя аргумента функции;

2) если аргумент введен, то вычисляем результат функции;

3) если произошла ошибка, информируем пользователя об этом;

4) иначе выводим результат на экран.

Таким образом, вместо определения 12 функций для сложения, вычитания, умножения, деления, получения квадратного корня, логарифмов и тригонометрических функций, прямо из меню вызываем one() с именем нужной нам функции. Колоссальная оптимизация!

Рис. 6. Вводим аргумент.

def two(function):

try:

argument1, argument2=appuifw.multi_query(u'Первый аргумент:', u'Второй аргумент:')

except:

pass

else:

try:

result=function(float(argument1), float(argument2))

except:

appuifw.note(u'Плохие аргументы.', 'error')

else:

out(result)

Аналог one(), только для двухаргументных функций:

1) получаем от пользователя аргументы функций;

2) если они не введены, то пропускаем все;

3) иначе – вычисляем результат вычисления функции с двумя аргументами;

4) если произошла ошибка – информируем пользователя;

5) иначе выводим результат.

С помощью two() сократили огромное количество кода! Раздувание меню оправдано, когда на другой чаше весов находится необходимость написать несколько десятков однотипных функций. Вероятно, вы так и сделали бы, но lambda идет на помощь!

Вдруг кому-то непонятны lambda функции для работы с модулем time, поэтому я расшифрую одну из них в многострочный код.

Дано:

out(time.strftime('%H:%M:%S',time.gmtime( time.clock()))).

Подробно:

1) time.clock – получаем время по Гринвичу в секундах;

2) time.gmtime – преобразуем время в секундах в кортеж чисел с информацией о времени;

3) time.strftime – преобразуем кортеж чисел в строку в соответствии с шаблоном;

4) out – выводим строку.

Остальные lambda функции работают по аналогии.

Рис. 7. Вводим несколько аргументов.

Таким образом, был показан прекрасный пример оптимизации. Использование lambda в меню дает возможность написать одну функцию вместо нескольких похожих. Конечно, это не единственная сфера применения – используйте lambda там, где это необходимо. Возможно, из-за нее придется перегруживать строки кодом (как в нижней части меню примера), тогда будет легче расшифровать код и вынести его в отдельную функцию. Какой подход вы выберите, напрямую зависит от вашего опыта и профессионализма. И не забывайте - все хорошо в меру!

Скачать пример PyMath.py






Рекомендуемый контент




Copyright © 2010-2017 housea.ru. Контакты: info@housea.ru При использовании материалов веб-сайта Домашнее Радио, гиперссылка на источник обязательна.