#python #python-3.x #python-2.7
#python #python-3.x #python-2.7
Вопрос:
Я получил следующую функцию из старого проекта и получаю эту ошибку
def haversine_distance((lat1, lon1), (lat2, lon2)): ^ Ошибка синтаксиса: недопустимый синтаксис
def haversine_distance((lat1, lon1), (lat2, lon2)):
"""
Haversine distance between two points, given by lon and lat in degrees.
"""
d_lat = radians(lat2 - lat1)
d_lon = radians(lon2 - lon1)
a = sin(d_lat / 2.0) ** 2
cos(radians(lat1)) * cos(radians(lat2)) *
sin(d_lon / 2.0) ** 2
c = 2 * atan2(sqrt(a), sqrt(1 - a))
return R * c
Я хотел бы знать, как преобразовать это в лучшие практики python 3.8. Справка
Ответ №1:
Определите свою функцию как haversine_distance(p1, p2)
в Python3 и распакуйте lat, lon в теле функции. Например:
def haversine_distance(p1, p2):
"""
Haversine distance between two points, given by lon and lat in degrees.
"""
lat1, lon1 = p1
lat2, lon2 = p2
d_lat = radians(lat2 - lat1)
d_lon = radians(lon2 - lon1)
a = sin(d_lat / 2.0) ** 2
cos(radians(lat1)) * cos(radians(lat2)) *
sin(d_lon / 2.0) ** 2
c = 2 * atan2(sqrt(a), sqrt(1 - a))
return R * c
Ответ №2:
Расширяя ответ @AndrejKesely и для более читаемого кода, я бы определил namedtuple Point
с lat
и lon
полями. а затем работать с ними
from collections import namedtuple
from math import radians, sin, cos, atan2, sqrt
Point = namedtuple('Point', 'lat, lon')
def haversine_distance(point1, point2):
"""
Haversine distance between two points, given by lon and lat in degrees.
"""
d_lat = radians(point2.lat - point1.lat)
d_lon = radians(point2.lon - point1.lon)
a = sin(d_lat / 2.0) ** 2 cos(radians(point1.lat)) * cos(radians(point2.lat)) * sin(d_lon / 2.0) ** 2
c = 2 * atan2(sqrt(a), sqrt(1 - a))
return R * c # assuming R is global constant
point1 = Point(42, 23)
point2 = Point(41, 23)
print(haversine_distance(point1, point2))