You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 04:27:03