将 "strange" 三元运算符从 java-script 转换为 python

Convert "strange" ternary operator from java-script to python

我正在将代码从 java-script(我是初学者)转换为 python(中级)。该代码涉及条件(三元)运算符形式的 if 语句。

代码行是这样的:

// if dLon over 180° take shorter rhumb line across the anti-meridian:
if (Math.abs(Δλ) > Math.PI) Δλ = Δλ>0 ? -(2*Math.PI-Δλ) : (2*Math.PI+Δλ);

我知道 definition of ternary operator 如下:

condition ? expr1 : expr2

但是,我的代码是额外的 "condition",我不知道如何解释:Δλ = Δλ>0

目前我的 python 版本如下所示:

import numpy as np
# note: delta_lon = Δλ
if np.abs(delta_lon) > np.pi:
            delta_lon = -(2*np.pi - delta_lon)
        else:
            delta_lon = 2*np.pi + delta_lon

但它似乎给出了错误的结果。我想这个问题是由前面提到的 "condition" 和我正在重新定义变量 delta_lon.

的事实引起的

完整的代码可以在这个 link.

的 rhumb line distance 部分找到

编辑: 这是我尝试从 javascript:

转换的完整代码
var Δψ = Math.log(Math.tan(Math.PI/4+φ2/2)/Math.tan(Math.PI/4+φ1/2));
var q = Math.abs(Δψ) > 10e-12 ? Δφ/Δψ : Math.cos(φ1); // E-W course becomes ill-conditioned with 0/0

// if dLon over 180° take shorter rhumb line across the anti-meridian:
if (Math.abs(Δλ) > Math.PI) Δλ = Δλ>0 ? -(2*Math.PI-Δλ) : (2*Math.PI+Δλ);

var dist = Math.sqrt(Δφ*Δφ + q*q*Δλ*Δλ) * R;

除了前面提到的 if 语句,我几乎能够转换整个代码。如果我不写语句,我的 python 代码 returns 与 java 脚本代码的结果相同(没关系,因为我使用了良好的输入值...)。但是,如果我添加上面显示的行,我不会再得到相同的结果,这表明三元运算符的翻译方式有误。

您误解了代码的意图。仅当 Δλ 在 [-pi, pi] 之外时才应修改,然后根据其符号向不同方向移动。翻译 javascript 代码给出

if np.abs(delta_lon) > np.pi:
    delta_lon = -(2*np.pi - delta_lon) if delta_lon > 0 else 2*np.pi + delta_lon

或者你可以做

if delta_lon > np.pi:
    delta_lon = -(2*np.pi - delta_lon)
elif delta_lon < -np.pi:
    delta_lon = 2*np.pi + delta_lon

效果相同