категории | RSS

Автор: Газетдинов Альберт

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

Модуль math
Модуль 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.
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 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'
>>>
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
В начале программы, как всегда, подключаем необходимые модули:
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)]
Меню получилось невероятно функциональным за счет использования lambda и стандартизации вызова различных функций, подробнее - ниже.
Участок кода для определения источника запуска программы стандартен, поэтому рассмотрю остальные функции программы.
def out(argument):
appuifw.query(u'Ответ:', 'text', unicode(argument)).
Функция для вывода информации пользователю:
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() с именем нужной нам функции. Колоссальная оптимизация!
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 функции работают по аналогии.
Таким образом, был показан прекрасный пример оптимизации. Использование lambda в меню дает возможность написать одну функцию вместо нескольких похожих. Конечно, это не единственная сфера применения - используйте lambda там, где это необходимо. Возможно, из-за нее придется перегруживать строки кодом (как в нижней части меню примера), тогда будет легче расшифровать код и вынести его в отдельную функцию. Какой подход вы выберите, напрямую зависит от вашего опыта и профессионализма. И не забывайте -все хорошо в меру!
Комментируем!

DimonVideo
2008-04-14T19:00:27Z
Здесь находятся
всего 0. За сутки здесь было 0 человек

Комментарии 6

#6   Virus26    

Молодчина!


0 ответить

#6   Pruvetvsem    

Сам я это еще не проверял(автор не я).Просто нашел эту статью и решил поделиться ценной инфой!


0 ответить

#6   nikita3011    

Альберт! Большое спасибо за Ваши статьи. Я читаю их на сайте журнала Mobi. У меня есть предложение: соберите все Ваши статьи о программировании на Питоне в файл формата chm или pdf. Когда все вместе, это намного удобнее.


0 ответить

#6   sym9c    

когда я писал программу попробовал гиперболические функции и они не работают)скажи ты их проверял?


0 ответить

#6   vagner love123    

смастерить бы прогу со всеми этими функциями.... ббррр.. wink


0 ответить

Яндекс.Метрика