Python函数接收含两个元组的列表参数时变量未定义如何解决?
核心错误原因
你写的points = [(lat1, lon1), (lat2, lon2)]逻辑完全颠倒:这行代码的作用是把右边由lat1等四个未定义变量组成的列表赋值给输入参数points,而不是从points里提取坐标值。
修改要点
- 修正坐标解包逻辑:把赋值顺序反过来,写成
(lat1, lon1), (lat2, lon2) = points,就能直接从输入的points列表里取出两个点的经纬度赋值给对应变量。 - 补全R的合法性校验:原来的
R >= 0只是没有实际作用的比较表达式,新增负半径的异常抛出逻辑,符合题目要求的R是非负半径的约束。 - 新增浮点精度防护:避免计算出来的反余弦参数因为浮点误差超出
[-1, 1]范围导致math.acos报错。 - 完善文档字符串:补全示例的返回值,符合Python函数文档规范。
修改后完整代码
import math def distance_great_circle(points: list, R: float) -> float: """ 计算球面上两点的大圆距离 :param points: 长度为2的列表,每个元素是(纬度, 经度)的元组,单位为弧度 :param R: 球体的非负半径 :return: 两点之间的大圆距离 >>> distance_great_circle([(0.5934, 1.0300), (1.1694, 0.7330)], 20) 15.863741770953917 >>> distance_great_circle([(2.6526, 1.9024), (1.4312, 1.1519)], 40) 55.25853068410837 """ if R < 0: raise ValueError("球体半径R不能为负数") # 解包获取两个点的经纬度 (lat1, lon1), (lat2, lon2) = points # 大圆距离计算 delta_lon = lon1 - lon2 inner_val = math.sin(lat1) * math.sin(lat2) + math.cos(lat1) * math.cos(lat2) * math.cos(delta_lon) # 处理浮点精度问题,避免参数超出acos的合法范围 inner_val = max(min(inner_val, 1.0), -1.0) return R * math.acos(inner_val)
内容的提问来源于stack exchange,提问作者ashnotallyson
相关产品推荐
相关产品推荐

