Найти - Пользователи
Полная версия: Изучаю Питон.
Начало » Центр помощи » Изучаю Питон.
1 2
kykich
Всем доброго времени суток. Вот решил познать питон. Честно прочитал М.Лутц “Изучаем Питон” до классов. Решил классы пока не трогать. Хотелось бы услышать мнение гуру по коду. В основоном это матиматические вычисления.
В плане критики больше хочется услышать направление в котором думать, а готовый код всегда можно поклянчить.
Спасибо всем откликнувшимся.
 
# 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,)
FishHook
Вы будете смеяться, но таки
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]() 
kykich

FishHook Спасибо. Буду кумекать.
kykich
Переделал по совету FishHook, дочитал до исключений.
FishHook
Очевидных ляпов не вижу.
Я бы Вам посоветовал, если Вы конечно хотите в дальнейшем заниматься питоном профессионально, сразу учиться писать код в рамках соглашений об оформлении кода. Почитайте PEP8. Скажем так, я не вижу вопиющих вещей, чтобы можно было кричать “А!!! Так не делают!!”, Ваш код вполне неплох для новичка. Это ИМХО естественно.
Но! Он неаккуратен. Приведите его к стандарту.
И да, chr(176) - это все-таки должна быть константа.

PooH
Еще неплохо бы убрать ввод/вывод из функций, оставить в них только расчеты, не нужны там побочные эффекты
kykich
FishHook с константой я не понял. я в string посмотрел но там не тнужного знака.
PooH Я в тупике. для ввода исходных данных сделать отделную функуию?
Подскажите куда копать. Спасибо.
sp3
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)

Попробуй осилить декораторы. Код немного усложняется, что не есть тру. Но пользоваться подобными фичами немного приятнее чем кучу повторяющегося кода вбивать.
FishHook
kykich
FishHook с константой я не понял. я в string посмотрел но там не тнужного знака.
Я имел в виду
SYMBOL = chr(176)
...
...
...
print('Расстояние S = ','%.3f'%S,'\n',' Дирекционный угол ',g,SYMBOL,m,'\'','%.3f'%s,'\"',sep='')
FishHook
Ну и раз уж пошла такая пьянка, то не нужно коментировать функцию, используйте докстринги

def deg2rad(rad):
    """
        перевод десятичных гардусов в гр мин сек
    """
    g = math.trunc(rad)
    m = math.trunc((rad-g)*60)
    s = (((rad-g)*60) - m)*60
    return g,m,s
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB