Форум сайта python.su
Всем доброго времени суток. Вот решил познать питон. Честно прочитал М.Лутц “Изучаем Питон” до классов. Решил классы пока не трогать. Хотелось бы услышать мнение гуру по коду. В основоном это матиматические вычисления.
В плане критики больше хочется услышать направление в котором думать, а готовый код всегда можно поклянчить.
Спасибо всем откликнувшимся.
# coding : utf8 import math DEGCHAR = chr(176) def degrees_to_dms(dec_degrees): """ Перевод десятичных градусов в градусы, минуты, секунды. """ degrees = math.trunc(dec_degrees) minutes = math.trunc((dec_degrees - degrees) * 60) seconds = (((dec_degrees - degrees) * 60) - minutes) * 60 return degrees, minutes, seconds def degrees_to_radian(): """ Перевод градусов в радианы. """ angle = input('Угол г м с: ') angle = angle.split(' ') degrees, minutes, seconds = int(angle[0]),int(angle[1]),float(angle[2]) radian = math.radians(degrees + minutes/60 + seconds/3600) print('\n', 'Угол =', radian, 'радиан', sep=' ') def radian_to_degrees(): radian = input('rad: ') radian = math.degrees(float(radian)) degrees, minutes, seconds = degrees_to_dms(radian) print('Угол=',' ', degrees, DEGCHAR, minutes, '\'', '%.2f'%seconds, '\"', '\n', sep='') def ogz(): print('координаты пунктов:') x1 = input('X1=') y1 = input('Y1=') x2 = input('X2=') y2 = input('Y2=') x1 = float(x1) y1 = float(y1) x2 = float(x2) y2 = float(y2) dx = x2 - x1 dy = y2 - y1 distance = math.hypot(dx,dy) if dx == 0 and y2 > y1: angle = 90 elif dx == 0 and y2 < y1: angle = 270 else: dyx = abs(dy/dx) rhumb = math.atan(dyx) * 180/math.pi if dx >= 0 < dy: angle = rhumb elif dx < 0 >= dy: angle = 180 + rhumb elif dx >= 0 > dy: angle = 360 - rhumb elif dx < 0 <= dy: angle = 180 - rhumb degrees, minutes, seconds = degrees_to_dms(angle) print('Расстояние S = ', '%.3f'%distance, '\n', 'Дирекционный угол ', degrees, DEGCHAR, minutes, '\'', '%.3f'%seconds, '\"', sep='') def pgz(): print('Координаты первого пункта') x1=input('X1=') y1=input('Y1=') distance = input('S A-B = ') angle = input('Дирекуионный угол А-B г м с = ') angle = angle.split(' ') degrees, minutes, seconds = int(angle[0]), int(angle[1]), float(angle[2]) x1, y1, distance = float(x1), float(y1), float(distance) radian = math.radians(degrees + minutes/60 + seconds/3600) dx = distance * math.cos(radian) dy = distance * math.sin(radian) x2 = x1 + dx y2 = y1 + dy print('\n','X2 = ', '%.3f'%x2, '\n', 'Y2 = ', '%.3f'%y2, sep=' ') task_dict = { 1:degrees_to_radian, 2:radian_to_degrees, 3:ogz, 4:pgz } while True: print ('1. Градусы в радианы\n', '2. Радианы в градусы\n', '3. ОГЗ\n', '4. ПГЗ\n', '5. Выход', sep='') x = input('Задача: ') try: x = int(x) except ValueError: continue if not x in task_dict: break try: task_dict[x]() except (IndexError, ValueError): print('Ошибка ввода', '\n', '_'*10,)
Отредактировано kykich (Окт. 22, 2013 08:04:27)
Офлайн
Вы будете смеяться, но таки
math.pi
def degrees(): ...... ...... def radians(): ...... ...... def OGZ(): .... ..... def PGZ(): ..... ..... task_dict = { 1: degrees, 2: radians, 3: OGZ, 4: PGZ } while True: print ('1. Градусы в радианы\n','2. Радианы в градусы\n','3. ОГЗ\n','4. ПГЗ\n','5. Выход', sep='') x = input('Задача - ') try: x= int(x) except ValueError: continue if not x in task_dict: break task_dict[x]()
Отредактировано FishHook (Окт. 12, 2013 15:36:33)
Офлайн
FishHook Спасибо. Буду кумекать.
Офлайн
Переделал по совету FishHook, дочитал до исключений.
Отредактировано kykich (Окт. 22, 2013 08:05:28)
Офлайн
Очевидных ляпов не вижу.
Я бы Вам посоветовал, если Вы конечно хотите в дальнейшем заниматься питоном профессионально, сразу учиться писать код в рамках соглашений об оформлении кода. Почитайте PEP8. Скажем так, я не вижу вопиющих вещей, чтобы можно было кричать “А!!! Так не делают!!”, Ваш код вполне неплох для новичка. Это ИМХО естественно.
Но! Он неаккуратен. Приведите его к стандарту.
И да, chr(176) - это все-таки должна быть константа.
Офлайн
Еще неплохо бы убрать ввод/вывод из функций, оставить в них только расчеты, не нужны там побочные эффекты
Офлайн
FishHook с константой я не понял. я в string посмотрел но там не тнужного знака.
PooH Я в тупике. для ввода исходных данных сделать отделную функуию?
Подскажите куда копать. Спасибо.
Офлайн
import math import traceback def dec_input(foo): def wrapped(*w): data = [input(s) for s in w ] return foo(*data) return wrapped def deg2rad(rad): #перевод десятичных гардусов в гр мин сек g = math.trunc(rad) m = math.trunc((rad-g)*60) s = (((rad-g)*60) - m)*60 return g,m,s @dec_input def radian(angle): # перевод градусов в радианы angle = angle.split(' ') g,m,s = int(angle[0]),int(angle[1]),float(angle[2]) rad = math.radians(g + m/60 + s/3600) print ('angle=',rad) @dec_input def degree(rad): # перевод радиан в градусы rad = math.degrees(float(rad)) g,m,s = deg2rad(rad) print('Угол=',g,chr(176),m,'\'','%.2f'%s,'\"','\n',sep='') @dec_input def ogz(X1,Y1,X2,Y2): # обратная геодезическая задача print('координаты пунктов:') X1 = float(X1) Y1 = float(Y1) X2 = float(X2) Y2 = float(Y2) dX = X2 - X1 dY = Y2 - Y1 S = math.hypot(dX,dY) if dX == 0 and Y2 > Y1: angle = 90 elif dX == 0 and Y2 < Y1: angle = 270 else: dYX = abs(dY/dX) r = math.atan(dYX)*180/math.pi if dX>=0<dY: angle = r elif dX<0>=dY: angle =180 + r elif dX>=0>dY: angle = 360 - r elif dX<0<=dY: angle = 180 - r g,m,s = deg2rad(angle) print('Расстояние S = ','%.3f'%S,'\n',' Дирекционный угол ',g,chr(176),m,'\'','%.3f'%s,'\"',sep='') @dec_input def pgz(X1,Y1, S, angle): # прямая геодезическая задача angle = angle.split(' ') g,m,s = int(angle[0]),int(angle[1]),float(angle[2]) X1,Y1,S = float(X1),float(Y1),float(S) ang = math.radians(g + m/60 + s/3600) dX = S * math.cos(ang) dY = S * math.sin(ang) X2 = X1 + dX Y2 = Y1 + dY print('X2= ',X2,'Y2= ',Y2, sep='') task_dict = {1:(radian,['Угол г м с: '] ), 2:(degree, ['rad: '] ) , 3:(ogz, ['координаты пунктов:\nX1=','Y1=','X1=','Y2=' ]), 4:(pgz, ['Координаты первого пункта\nX1=', 'Y1=', 'S A-B = ', 'Дирекуионный угол А-B= г м с']) , } while True: print ('1. Градусы в радианы\n','2. Радианы в градусы\n','3. ОГЗ\n','4. ПГЗ\n','5. Выход',sep='') x = input('Задача: ') try: x =int(x) except ValueError: continue if not x in task_dict: break try: foo, arg = task_dict[x] foo(*arg) except (IndexError,ValueError): print('Ошибка ввода:') traceback.print_exc() print('_'*10)
Офлайн
kykichЯ имел в виду
FishHook с константой я не понял. я в string посмотрел но там не тнужного знака.
SYMBOL = chr(176) ... ... ... print('Расстояние S = ','%.3f'%S,'\n',' Дирекционный угол ',g,SYMBOL,m,'\'','%.3f'%s,'\"',sep='')
Офлайн
Ну и раз уж пошла такая пьянка, то не нужно коментировать функцию, используйте докстринги
def deg2rad(rad): """ перевод десятичных гардусов в гр мин сек """ g = math.trunc(rad) m = math.trunc((rad-g)*60) s = (((rad-g)*60) - m)*60 return g,m,s
Офлайн